Marco de pruebas automatizadas Unittest frente al marco de pruebas automatizadas Pytest

Introducción
El artículo anterior Introducción al marco de pruebas unitarias de Python presentó el marco de pruebas unitarias de Python. La gente suele usar unittest porque es relativamente básico y puede usarse para desarrollo secundario. Si su nivel de desarrollo es muy alto, el desarrollo integrado y las plataformas de prueba automatizadas son también disponible. Este artículo habla principalmente sobre la diferencia entre unittest y pytest: en comparación con unittest, pytest tiene un código simple, un uso conveniente y flexible y complementos enriquecidos.

Unittest vs Pytest
compara principalmente las diferencias entre unittest y pytest en términos de reglas de escritura de casos de uso, procesamiento previo y posterior de casos de uso, parametrización, aserciones, ejecución de casos de uso, repetición de fallas e informes:

Reglas de escritura de casos de uso

 Condiciones previas y posteriores del caso de uso

  afirmación

 informe de prueba

  Mecanismo de repetición de fallas

  parametrizar

 Ejecución de clasificación de casos de uso

  Si no se ve bien, puedes mirar la siguiente tabla:

En términos generales, el formato de caso de uso de prueba unitaria es complejo, no tiene compatibilidad, tiene pocos complementos y es conveniente para el desarrollo secundario. pytest es más conveniente y rápido. El formato del caso de uso es simple. Puede ejecutar casos de prueba de estilo unittest sin modificar ningún código del caso de uso de unittest. Tiene mejor compatibilidad. Hay muchos complementos de pytest, como el complemento flask, que se puede usar para volver a ejecutar casos de uso cuando ocurren errores, y el complemento xdist, que se puede usar para la ejecución paralela de dispositivos y es más eficiente.

Demostración de ejemplo
Después de hablar sobre las siete diferencias principales, demuestre siempre ejemplos específicos y utilice hechos que hablen por sí mismos.

Diferencias entre posicionamiento previo y posterior.
Hablemos de la diferencia entre posicionamiento previo y posterior en casos de uso. Veamos primero el uso de posicionamiento previo y posterior en unittest:

import unittest

class TestFixtures01(unittest.TestCase):

    # 所有用例执行前执行

    def setUp(self) -> None:

        print("setUp开始")

    def tearDown(self) -> None:

        print("tearDown结束")

    # 每条用例执行前执行

    @classmethod

    def setUpClass(cls) -> None:

        print("setUpClass开始")

    @classmethod

    def tearDownClass(cls) -> None:

        print("tearDownClass结束")

    # 测试用例

    def test_001(self):

        print("测试用例001")

class TestFixtures02(unittest.TestCase):

    def test_002(self):

        print("测试类2")

# 每个模块执行前执行

def setUpModule():

    """

    在所有测试类在调用之前会被执行一次,函数名是固定写法,会被unittest框架自动识别

    """

    print('集成测试 >>>>>>>>>>>>>>开始')

def tearDownModule():

    print("集成测试 >>>>>>>>>>>>>>结束")

if __name__ == '__main__':

    unittest.main()

resultado de la operación:

A partir de los resultados, conocemos la prioridad lógica de los tres métodos: setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()

A continuación, observe el procesamiento previo y posterior de pytest:

1. Todos sabemos que el preprocesamiento y el posprocesamiento se utilizan en pruebas automatizadas. En comparación con unittest, pytest es mucho más flexible en términos de preprocesamiento, posprocesamiento y complementos, y también se puede definir mediante accesorios.

Primero, comprendamos que los niveles previo y posterior de ejecución de casos de uso son los siguientes:

1. Nivel de módulo: global, todo el módulo se ejecuta solo una vez, teniendo prioridad sobre los casos de prueba.

2. Nivel de clase: se define en una clase y solo tiene efecto para esta clase. decorador cls similar a unittest

3. Nivel de función: solo tiene efecto para funciones y no tiene efecto para funciones inferiores a la clase.

4. Nivel de método: definido en la clase, cada caso de uso se ejecuta una vez

def setup_module():

    print('\n整个模块 前 只运行一次')

def teardown_module():

    print('\n整个模块 后 只运行一次')

def setup_function():

    print('\n不在类中的函数,每个用例 前 只运行一次')

def teardown_function():

    print('\n不在类中的函数,每个用例 后 只运行一次')

def test_ab():

    b = 2

    assert b < 3

def test_aba():

    b = 2

    assert b < 3

class Test_api():

    def setup_class(self):

        print('\n此类用例 前 只执行一次')

    def teardown_class(self):

        print('\n此类用例 后 只执行一次')

    def setup_method(self):

        print('\n此类每个用例 前 只执行一次')

    def teardown_method(self):

        print('\n此类每个用例 后 执行一次')

    def test_aa(self):

        a = 1

        print('\n我是用例:a')       # pytest -s 显示打印内容

        assert a > 0

    def test_b(self):

        b = 2

        assert b < 3

resultado de la operación:

2. Este es el uso original. Veamos el uso de Fixture a continuación. Fixture en realidad está personalizando pytest para realizar operaciones previas y posteriores al caso. Primero, cree el archivo conftest.py (especificando este nombre), importe el módulo pytest y use el decorador pytest.fixture. El nivel predeterminado es: nivel de función:

  Se puede llamar desde otros archivos de casos de uso. Defina una función de la siguiente manera y herede la función de inicio de sesión en el archivo conftest.py para llamar:

# conftest.py配置需要注意以下点:

# conftest.py配置脚本名称是固定的,不能改名称

# conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件

# 不需要import导入 conftest.py,pytest用例会自动查找

import pytest

def test_one(login):

    print("登陆后,操作111")

# def test_two():

#   print("操作222")

#

# def test_three(login):

#   print("登陆后,操作333")

resultado de la operación:

3. Uso extendido, múltiples funciones personalizadas y visualización de nivel global: (global, como iniciar sesión para obtener token, otros módulos de casos de uso no necesitan iniciar sesión nuevamente)

import pytest

def test_one(login):

    print("登陆后,操作111")

def test_two(login,open_page):

    print("测试用例2")

def test_three(open_page):

    print("测试用例3")

 resultado de la operación:

Las personas cuidadosas deben saber que el caso de prueba 2 no llama a la función de inicio de sesión porque la configuración preestablecida es el modo compartido, similar a una función global.

La parametrización distingue
escenarios de aplicación parametrizados. El caso de uso de un escenario utilizará múltiples datos para la verificación. Por ejemplo, la función de inicio de sesión utilizará el nombre de usuario y la contraseña correctos para iniciar sesión, el nombre de usuario incorrecto, la contraseña correcta, la contraseña correcta, Se prueban nombres de usuario, contraseñas incorrectas, etc.. En este momento, la parametrización en el marco se puede utilizar para completar la prueba de manera conveniente.

La parametrización es una idea basada en datos, es decir, se pueden realizar múltiples conjuntos de pruebas de datos en un caso de prueba, y cada conjunto de datos es separado e independiente.

La parametrización de Unittest es en realidad: ddt, que se denomina basada en datos.

El controlador de datos de Pytest es parametrización, use @pytest.mark.parametrize

1. Veamos primero cómo se parametriza unittest:

test_data = [1,2,3]

@ddt.ddt

class Testddt(unittest.TestCase):

    @ddt.data(*test_data)

    def test_001(self,get_data):

        print(get_data)

if __name__ == '__main__':

    unittest.main()

resultado de la operación:

2.Uso de parametrización en pytest

Agregue delante del caso de prueba:
@pytest.mark.parametrize("nombre del parámetro", lista de datos)
nombre del parámetro: se utiliza para recibir cada elemento de datos y servir como parámetro del caso de prueba.
Datos de lista: un conjunto de datos de prueba.

@pytest.mark.parametrize("parámetro1,parámetro2",[(datos1,datos2),(datos1,datos2)])
Ejemplo:
@pytest.mark.parametrize("a,b,c", [(1,3, 4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
res = a + b
afirmar res == c

Ejemplo:

@pytest.mark.parametrize('data',[1,2,3])

class Testddt(object):

    def test_001(self,data):

        print(data)

if __name__ == '__main__':

    pytest.main(['-sv'])

resultado de la operación:

Resumir

  Lo anterior es la diferencia entre los marcos de prueba unittest y pytest. Las siete diferencias principales. Aquí se han mencionado dos ejemplos de las diferencias. Los otros cinco se agregarán cuando tenga tiempo. Los amigos que estén interesados ​​en las pruebas automatizadas de Python pueden unirse a Pequeña tarjeta a continuación para discusión. Comparte tus pensamientos.

Los siguientes son materiales de apoyo para el aprendizaje. Para aquellos que están haciendo [pruebas de software], debería ser el almacén de preparación más completo y completo. Este almacén también me ha acompañado en el viaje más difícil. ¡Espero que también pueda ayudarlos a ustedes!

Subprograma de entrevista de prueba de software

¡Un banco de preguntas de prueba de software que ha sido utilizado por millones de personas! ! ! ¡Quién es quién lo sabe! ! ! El miniprograma de prueba de entrevistas más completo de Internet. Puede usar su teléfono móvil para responder preguntas, tomar el metro, el autobús y enrollarlo.

Cubre las siguientes secciones de preguntas de la entrevista:

1. Teoría básica de pruebas de software, 2. web, aplicaciones, pruebas de función de interfaz, 3. red, 4. base de datos, 5. linux

6. Web, aplicaciones, automatización de interfaces, 7. Pruebas de rendimiento, 8. Conceptos básicos de programación, 9. Preguntas de la entrevista de recursos humanos, 10. Preguntas de prueba abiertas, 11. Pruebas de seguridad, 12. Conceptos básicos de informática

Cómo obtener información:

Supongo que te gusta

Origin blog.csdn.net/2301_76643199/article/details/133134550
Recomendado
Clasificación