Plan de reejecución de caso de uso fallido de Jenkins+RobotFramework

El caso de prueba de la interfaz se ejecuta en el nodo Jenkins. En algunos casos, como fluctuaciones de la red y otras razones, el caso de prueba no se ejecutará. En este momento, se activará un correo electrónico y una alerta de DingTalk, y se notificará a la persona responsable. De acuerdo con la política existente, cuando la primera compilación falla, la segunda actividad de compilación se activará inmediatamente. Si la segunda compilación aún falla, el mensaje de advertencia se activará nuevamente. Bajo esta estrategia, las personas responsables relevantes recibirán información de advertencia adicional sin sentido (como el tiempo de espera de la primera compilación, pero la segunda compilación es exitosa), por lo que escribí un script adicional y lo usé como un caso de uso de Robotframework en Jenkins. La ejecución de un caso de uso falla, después de ejecutar todos los casos, los casos que fallaron esta vez se seleccionarán para volver a intentarlo y luego se fusionarán los dos archivos de informes de prueba.

El contenido del script es muy simple y altamente escalable:

#!/usr/bin/env python

# -*- coding:utf8 -*-



import getopt

import os

import sys

from pathlib import Path

from robot.api import ExecutionResult



def parse_args() -> tuple:

    """解析命令行传入的参数"""
    opts, args = getopt.getopt(sys.argv[1:], '-i:-e:-F:-E:', ["includeTag=", "excludeTag=", "format=", "env="])
    try:
        target = args[0]
    except IndexError:
        target = "./"

    def _parse(option, default_value=None):
        if isinstance(option, tuple):
            temp = [opt_value for (opt_name, opt_value) in opts if opt_name in option]
        else:
            temp = [opt_value for (opt_name, opt_value) in opts if opt_name == option]

        return temp[0] if len(temp) > 0 else default_value

    include_tag = _parse(("-i", "--includeTag"))  # 包含用例标签
    exclude_tag = _parse(("-e", "--excludeTag"))  # 排除用例标签
    env = _parse(("-E", "--env"), 'm')  # 用例运行环境
    fm = _parse(("-F", "--format"), 'robot')  # 用例文件后缀名

    return include_tag, exclude_tag, env, fm, targetdef first_run(target, env, include_tag, exclude_tag, fm):    """首次运行用例
    项目的基本目录结构是固定的, 在命令行中写死了变量文件的相对路径.
    """
    if include_tag:
        cmd = f"robot -F {fm} -i {include_tag} --output output_origin.xml --log NONE --report NONE -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} {target}"
    elif exclude_tag is not None:
        cmd = f"robot -F {fm} -e {exclude_tag} --output output_origin.xml --log NONE --report NONE -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} {target}"
    else:
        cmd = f"robot -F {fm} --output output_origin.xml --log NONE --report NONE -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} {target}"

    print(f'First run cmd >>>> {cmd}')
    os.system(cmd)def parse_robot_result(xml_path) -> bool:
    """解析用例运行结果"""
    suite = ExecutionResult(xml_path).suite

    fail = {}
    for test in suite.tests:
        if test.status == "FAIL":
            fail.update({test.name: test.status})

    all_tests = suite.statistics.critical    print("*" * 50)
    print("当前运行目录为: ", os.getcwd())
    print("总测试条数:{0}, 初次运行时,通过的用例数: {1}, 失败的用例数: {2}".format(all_tests.total, all_tests.passed, all_tests.failed))
    if all_tests.failed > 0:
        print("其中失败的用例信息为: %s" % str(fail))
    print("*" * 50)

    return all_tests.failed > 0def rerun_fail_case(target, env, include_tag, exclude_tag, fm):    """ # TODO
    如果要重新运行整个套件,需要使用`rerunfailedsuites`, 如果只想重新运行失败的测试用例而不是套件中已通过的测试,则使用`rerunfailed`(必须保证case是独立的)
    -R, --rerunfailed <file>
        Selects failed tests from an earlier output file to be re-executed.
    -S, --rerunfailedsuites <file>
        Selects failed test suites from an earlier output file to be re-executed.
    """    if include_tag:
        cmd = f"robot -F {fm} -i {include_tag} -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} --rerunfailed output_origin.xml --output output_rerun.xml {target}"
    elif exclude_tag is not None:
        cmd = f"robot -F {fm} -e {exclude_tag} -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} --rerunfailed output_origin.xml --output output_rerun.xml {target}"
    else:
        cmd = f"robot -F {fm} -V variables.py:{env} -V ../Common/Variables/commonVars.py:{env} --rerunfailed output_origin.xml --output output_rerun.xml {target}"

    print(f'重复运行失败的用例: {cmd}')
    os.system(cmd)
    """再次运行失败的用例"""def merge_output():
    """合并xml文件,并生成测试报告
    注意集成到jenkins中时,需要指定 Output xml name为merge.xml
    """
    os.system("rebot --merge --output merge.xml *.xml")def main():
    include_tag, exclude_tag, env, fm, target = parse_args()    # 切换到output目录
    if Path(target).is_dir():
        os.chdir(Path(target))
    else:
        os.chdir(Path(target).parent)

    for xml in Path.cwd().glob("*.xml"):
        os.remove(xml)
    first_run(target, env, include_tag, exclude_tag, fm)
    failed = parse_robot_result("output_origin.xml")
    if failed:
        rerun_fail_case(target, env, include_tag, exclude_tag, fm)

    # 不论是否存在失败的用例, 都会合并测试报告
    merge_output()if __name__ == '__main__':
    main()

Excepto el parámetro -E, todos los demás son parámetros de línea de comando proporcionados por el robot. Los archivos variables se utilizan en el proyecto para permitir que el caso de uso admita el cambio del entorno de ejecución. El parámetro -E debe pasarse al entorno donde se usa El caso se está ejecutando y el parámetro -i o -e se utiliza para pasar etiquetas para filtrar los casos de prueba que se ejecutarán esta vez. Se pueden pasar varias etiquetas, como: H5ANDP1, H5ORMini, NotPaid, etc.

En la configuración del proyecto Jenkins, el comando Ejecutar Windows Batch de la configuración de la operación de compilación es el siguiente:

cd %WORKSPACE%/ParkTest/interface
python runrobot.py --env=%Env% -F robot -i %Tag% ./
exit 0

Env y Tag se pasan durante las compilaciones parametrizadas y tienen valores predeterminados.

En la operación posterior a la compilación, use el complemento Robot Framework para recopilar los resultados de la compilación. Dado que el nombre del archivo de salida predeterminado se modifica en el script anterior, la configuración correspondiente debe realizarse aquí, de la siguiente manera

imagen

Cuando falla la primera compilación del proyecto, la segunda compilación solo ejecutará los casos de prueba fallidos anteriormente y fusionará los dos informes de prueba generados, que se muestran en el informe de prueba de la siguiente manera:

imagen

registro.html

imagen

La plantilla de notificación por correo electrónico que configuré

Esto reducirá algunos correos electrónicos de error no válidos.

Con respecto al esquema anterior, es necesario explicar una cosa en particular, es decir, los casos de prueba en el proyecto deben ser independientes entre sí antes. Creo que es necesario mantener la independencia de los casos. Cada caso de prueba solo debe probar un escenario . Dependiendo de la complejidad del caso, los diferentes escenarios pueden ser grandes o pequeños, pero no pueden afectarse entre sí. Cuando ejecutamos uno de los Casos al azar o los ejecutamos desordenadamente, los resultados de la prueba deben ser precisos. El nivel de suite y el nivel de directorio también deben prestar atención a la cuestión de la independencia. Mantener la independencia de Case. Esto debe usarse como una especificación para escribir casos de uso automatizados y requiere estrictamente a otros miembros del equipo.

Finalmente: se ha compilado y subido el video tutorial completo de prueba de software a continuación. Los amigos que lo necesiten pueden obtenerlo ellos mismos [garantizado 100% gratis]

Documento de entrevista de prueba de software

Debemos estudiar para encontrar un trabajo bien remunerado. Las siguientes preguntas de la entrevista provienen de los últimos materiales de entrevista de empresas de Internet de primer nivel como Alibaba, Tencent, Byte, etc., y algunos jefes de Byte han dado respuestas autorizadas. Después de terminar esto set Creo que todos pueden encontrar un trabajo satisfactorio según la información de la entrevista.

Supongo que te gusta

Origin blog.csdn.net/AI_Green/article/details/133102173
Recomendado
Clasificación