Tutorial de Pytest para el marco de pruebas automatizadas de Python

愿你我相遇,皆有所获! 欢迎关注微信公众号:【伤心的辣条】 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!

Pytest

  • pytest es un marco de prueba de Python muy maduro y con todas las funciones con las siguientes características:
  • Simple y flexible, fácil de usar.
  • Soporte parametrización
  • Puede admitir pruebas unitarias simples y pruebas funcionales complejas, y también se puede utilizar para realizar pruebas de selenio / appnium y otras pruebas automatizadas, pruebas automatizadas de interfaz (solicitudes de pytest +)
  • Pytest tiene muchos complementos de terceros y pueden ser extensiones personalizadas, como pytest-selenium (selenio integrado), pytest-html (generación perfecta de informes de prueba html), pytest-rerunfailures (ejecución repetida de casos de falla), pytest- xdist (distribución de múltiples CPU), etc.
  • Omitir y xfail el procesamiento de casos de prueba
  • Puede integrarse bien con jenkins
  • marco de informe ---- allure también es compatible con pytest

Instalar Pytest

  • pip install -U pytest

Principios de diseño de casos de uso de Pytest

La clase de prueba comienza con Test y no puede tener un método de inicio

Funciones que comienzan con test_

Clases que comienzan con Test

Todos los paquetes pakege deben tener el archivo __init__.py

Afirmar usando afirmar

Dos formas de ejecutar Pytest

Código que se ejecuta en Pycharm

pytest.main(["test.py"])
  • Modo de operación de línea de comando
pytest test.py
# 运行指定类下的指定方法
pytest 文件名::类名::方法名

Descripción del parámetro Pytest

  • -v Descripción: Puede generar información de ejecución más detallada del caso de uso, como el archivo donde se encuentra el caso de uso y el nombre del caso de uso, etc.

  • -s Descripción: Ingrese la información de ajuste en nuestro caso de uso, como información de impresión, etc.

  • -x: caso de uso con error, salir de la ejecución inmediatamente y mostrar el resultado

  • -v: significa ver el contenido del informe detallado

  • -collect-only: Indica que se muestran todos los casos de uso a ejecutar

  • -lf: solo ejecuta el caso de uso que falló la última vez

  • -vv: muestra resultados de prueba detallados

  • -tb = no: no muestra los detalles del error del caso de uso.

  • -tb = line: muestra el número específico de líneas de código donde falló el caso de uso

  • -tb = short: muestra información de error más detallada

  • -k "Palabras clave" Descripción: ejecuta casos de uso que contienen "palabras clave"

  • -q Nota: Simplifique la salida de la consola, puede ver que la información de salida es diferente del resultado anterior. Hay dos puntos en la figura siguiente en lugar del resultado de aprobación

  • -maxfail = num Cuando el error del caso de uso alcanza el número especificado, detenga la prueba

  • m Descripción: Ejecuta casos de prueba específicos. Modifiquemos nuestro caso de uso nuevamente y agreguemos un nuevo caso de uso

# 如果要运行多个标识的话,用表达式,如下
pytest -m "slow or faster" test_1.py  运行有slow标识或 faster标识用例
pytest -m "slow and faster" test_1.py 运行有slow和faster标识的用例
pytest -m "slow and not faster" test_1.py 运行有slow和没有faster标识的用例

Nota: "" (comillas simples) no puede ir seguido de -m, solo se puede utilizar "" (comillas dobles); de lo contrario, no se reconocerá

archivo de configuración ini

  • Crear archivo pytest.ini (escritura fija)
[pytest];固定写法

;变量名不能错
addopts=-vv -s ;多个参数中间空格
testpaths=../HC/huace ;多个目录中间空格
python_files=test*.py ;python文件前缀,可自定义
python_classes=huace ;指定类名
python_functions=test* ;指定方法名,可自定义

Función de salto de prueba

  • Función de prueba de omisión: según condiciones específicas, la función de prueba identificada no se ejecuta
# -*- coding: utf-8 -*-

import pytest

class Test():
   def test(self):
       print("执行的是testcase的用例")

@pytest.mark.skipif(condition=1<2,reason="1不大于2,所以不执行")
class huace():
   def haha(self):
       print("执行的是haha方法里面的用例")

Accesorio Pytest 之

  • Ambos dispositivos de prueba de unidad y soporte de nariz, pero los accesorios son más flexibles para usar en pytest. También es un punto culminante de pytest
  • Puede entenderse como algo similar a la parte delantera y trasera de la configuración y desmontaje. Pero mucho más poderoso y flexible que ellos

fixtur pasado como parámetro

# -*- coding: utf-8 -*-

import pytest

@pytest.fixture()
def login():
   print('登录系统')

# 直接使用函数名做为参数传入
def test_01(login):
   print('测试用例一')

def test_02():
   print('测试用例2')

def test03():
   print('测试用例3')

resultado de la operación

  • Solo tes_01 llamado login
  • Aquí viene la pregunta restante, ¿qué pasa si tengo 10 métodos o más aquí? ¿Necesito llamar al método de inicio de sesión? Continúe mirando los parámetros del dispositivo a continuación
testcase.py::test_01 登录系统
测试用例一
PASSED
testcase.py::test_02 测试用例2
PASSED
testcase.py::test03 测试用例3
PASSED

sintaxis del aparato

# scope有4个作用范围:function(不填则默认)、class、module、session
fixture(scope='function', params=None, autouse=False, ids=None, name=None)

Descripción de parámetros

  • Alcance: el alcance, función "(predeterminado)," clase "," módulo "," sesión "cuatro

  • params: lista de parámetros opcionales, hará que varios parámetros llamen a la función del dispositivo y todas las pruebas la utilicen.

  • autouse: Predeterminado: Falso, el dispositivo debe ser llamado manualmente por el caso de uso; si es Verdadero, todos los casos de prueba en el alcance llamarán automáticamente al dispositivo

  • ids: parte del ID de prueba de parámetros. De lo contrario, se generará automáticamente a partir de params.

  • name: Predeterminado: el nombre del decorador Se recomienda escribir un nombre diferente cuando las luminarias de un mismo módulo se llaman entre sí.

  • El alcance de la sesión: es toda la sesión de prueba, es decir, desde el inicio de la ejecución de pytest hasta el final de la prueba. El parámetro de alcance controla el alcance del dispositivo: sesión> módulo> clase> función

autouso

  • El parámetro está configurado en Falso de forma predeterminada, debe llamar manualmente al decorador
# -*- coding: utf-8 -*-

import pytest

# 当前就算定义了装饰器,也不会调用Login
@pytest.fixture()
def login():
   print("打开浏览器")

def test1():
   print("test1里的用例")

def test2():
   print("test2里的用例")

Método de llamada 1

# -*- coding: utf-8 -*-

import pytest

@pytest.fixture()
def login():
   print("打开浏览器")

# 直接传入函数名
def test1(login):
   print("test1里的用例")
   
def test2(login):
   print("test2里的用例")

Método de llamada 2

# -*- coding: utf-8 -*-

import pytest

# autouse设为True,就能自动调用login的装饰器
@pytest.fixture(autouse=True)
def login():
   print("打开浏览器")

# 直接传入函数名
def test1():
   print("test1里的用例")

def test2():
   print("test2里的用例")

función

  • función: el alcance es una función
  • Todos los métodos llaman al inicio de sesión
# -*- coding: utf-8 -*-

import pytest

@pytest.fixture(scope='function', autouse=True)
def login():
   print('登录系统')

def test_01():
   print('测试用例一')

def test_02():
   print('测试用例2')

def test03():
   print('测试用例3')

resultado de la operación

  • Se llamará al decorador si coincide con el diseño del nombre del caso de uso
  • el inicio de sesión no coincide, por lo que no se llamará
testcase.py::test_01 登录系统
测试用例一
PASSED
testcase.py::test_02 登录系统
测试用例2
PASSED
testcase.py::test03 登录系统
测试用例3
PASSED

clase

  • clase: el alcance es clase
  • Entonces, tanto TestCase1 como TestCase2 ejecutarán el inicio de sesión
# -*- coding: utf-8 -*-

# @Time : 2021/1/14 21:05
# @Author : 程序员一凡

import pytest

@pytest.fixture(scope='class', autouse=True)
def login():
   print('登录系统')


def test_01():
   print('这个是类外面的用例')

class TestCase1:
   def test_02(self):
       print('测试用例2')
   def test03(self):
       print('测试用例3')

class TestCase2:
   def test_04(self):
       print('测试用例4')
   def test05(self):
       print('测试用例5')

resultado de la operación

  • El método de la clase solo se llamará una vez
  • pytest mecanismo, debido a que el método comienza con prueba, también llamará
testcase.py::test_01 登录系统
这个是类外面的用例
PASSED
testcase.py::TestCase1::test_02 登录系统
测试用例2
PASSED
testcase.py::TestCase1::test03 测试用例3
PASSED
testcase.py::TestCase2::test_04 登录系统
测试用例4
PASSED
testcase.py::TestCase2::test05 测试用例5
PASSED

módulo

  • módulo: ejecutar solo una vez antes del inicio de todos los casos de uso en el script .py actual
  • Siempre que cumpla con los requisitos de diseño del caso de uso, tanto dentro como fuera de la clase se llamará
# -*- coding: utf-8 -*-

import pytest

@pytest.fixture(scope='class', autouse=True)
def open():
   print("打开浏览器,并且打开百度首页")

def test_s1():
   print("用例1:搜索python-1")

class TestCase():
   def test_s2(self):
       print("用例2:搜索python-2")

   def test_s3(self):
       print("用例3:搜索python-3")

resultado de la operación

  • Los casos de uso en el archivo actual llaman al decorador
  • Si el nombre de la clase no comienza con Prueba, intente ver si se llamará al decorador.
testcase.py::test_s1 打开浏览器,并且打开百度首页
用例1:搜索python-1
PASSED
testcase.py::TestCase::test_s2 打开浏览器,并且打开百度首页
用例2:搜索python-2
PASSED
testcase.py::TestCase::test_s3 用例3:搜索python-3
PASSED

sesión

  • El accesorio es de nivel de sesión y se puede llamar a través de módulos .py

  • Cuando tenemos varios casos de uso para archivos .py, si varios casos de uso solo necesitan llamar al dispositivo una vez, entonces se puede configurar en scope = "session" y escribir en el archivo conftest.py

  • El nombre del archivo conftest.py es fijo y pytest reconocerá automáticamente el archivo. Ponlo en el directorio raíz del proyecto, puedes llamarlo globalmente

  • Si se coloca en un paquete, solo será válido en ese paquete

# -*- coding: utf-8 -*-

# conftest文件内容
import pytest

@pytest.fixture(scope="session", autouse=True)
def login():
   print("调用conftest文件的里的方法")

Dos archivos de casos de uso

# -*- coding: utf-8 -*-
# testcase1.py 

import pytest

def test1():
   print("test1里的用例")

def test2():
   print("test2里的用例")
   
# -*- coding: utf-8 -*-
# testcase1.py  
import pytest
def test3():
   print("test3里的用例")

def test4():
   print("test4里的用例")

resultado de la operación

  • Los casos de uso de los dos archivos, solo los archivos de casos de prueba han ajustado los métodos en competencia
testcase.py::test1 调用conftest文件的里的方法
test1里的用例
PASSED
testcase.py::test2 test2里的用例
PASSED
testcase1.py::test3 test3里的用例
PASSED
testcase1.py::test4 test4里的用例
PASSED

pytest-allure genera informes de prueba

  • Instale el módulo: pip install allure-pytest
# 第一步:生成xml数据
pytest --alluredir=./report/xml testcase.py
# 第二步:生成html文件
allure generate --clean ./report/xml -o ./result/html

Agregar capturas de pantalla al informe

  • allure.attach (f, 'nombre de la imagen', allure.attachment_type.JPG)
# -*- coding: utf-8 -*-

from selenium import webdriver
import allure

browser=webdriver.Chrome()
browser.get("https://www.baidu.com")
try:
   browser.find_element_by_id("zhiyi").send_keys('test123456')  # 输入密码,
except Exception as e:
   file_name = './test.jpg'
   browser.save_screenshot(file_name)  # 截图函数
   '''allure添加截图附件'''
   with open(file_name, mode='rb') as file:
 **加粗样式**      # 读取文件,将读取的结果作为参数传给allure
       f = file.read()  
   # 把图片添加到allure操作步骤里
   allure.attach(f, 'login', allure.attachment_type.JPG)  
   raise e

La diferencia y similitudes entre rendimiento y rendimiento en pytest

Terreno común

  • Tanto el retorno como el rendimiento pueden devolver valores

la diferencia

  • Después de que el rendimiento devuelva el valor, el código subyacente continuará ejecutándose
  • Después de que se devuelva el valor de retorno, el siguiente código no continuará ejecutándose
# -*- coding: utf-8 -*-

import pytest

@pytest.fixture()
def openbrower():
   print("打开浏览器")
   yield "返回浏览器"
   print("关闭浏览器")

def test01(openbrower):
   print(openbrower)

resultado de la operación

  • Demuestre que el código detrás del rendimiento todavía se ejecuta
testcase.py::test01 打开浏览器
# 返回值
返回浏览器
PASSED关闭浏览器

La diferencia entre accesorios de uso y accesorios de paso.

  • El accesorio tiene un valor de retorno, por lo que usefixture no puede obtener el valor de retorno.Esta es la diferencia entre el decorador de usefixture y el parámetro de accesorio pasado directamente por el caso de uso.
  • Cuando el dispositivo necesita usar el parámetro de retorno, solo el nombre del parámetro puede pasarse directamente como parámetro, y el parámetro de retorno no es necesario. Se pueden usar ambos métodos.
  • @ pytest.mark.usefixtures ("nombre del decorador")

Complementos de uso común para Pytest

  • pytest-selenium 集成 selenium

  • pip install allure-pytest genera un hermoso informe de prueba de encanto

  • pip install pytest-sugar optimiza el efecto de ejecución

  • pip install pytest-rerunfailures volver a ejecutar después de que falla la ejecución del caso de uso

  • pip install pytest-xdist ejecución paralela y distribuida multiproceso

  • pip install pytest: asume que se siguen ejecutando varias afirmaciones después de que se informa un error

  • pip install pytest-cover prueba de cobertura

Instale múltiples módulos con un clic

  • Cree un archivo require.txt
selenium==3.0
requests
  • pip install -r requisito.txt

Finalmente: prueba el bienestar

En la industria de la tecnología, debe mejorar sus habilidades técnicas y enriquecer su experiencia práctica en proyectos de automatización, lo que será muy útil para la planificación de su carrera en los próximos años y la profundidad de su tecnología de pruebas.

En la temporada de entrevistas de Golden 9th y Silver 10th, temporada de cambio de trabajo, organizar preguntas de entrevistas se ha convertido en mi hábito durante muchos años. La siguiente es mi recopilación y clasificación en los últimos años, todo está organizado en torno a [pruebas de software], el contenido principal incluye: video exclusivo de prueba de automatización de Python, detalles de automatización de Python, un conjunto completo de preguntas de la entrevista y otro contenido de conocimiento.


Para los amigos que prueban software, debería ser el almacén de preparación de entrevistas más completo y completo. Para organizar mejor cada módulo, también me refiero a muchas publicaciones de blogs y proyectos de alta calidad en Internet, y me esfuerzo por no perder todos los puntos de conocimiento. Los amigos confiaron en estos contenidos para revisarlos y obtuvieron ofertas de grandes fábricas como BATJ. Este almacén también ha ayudado a muchos estudiantes de pruebas de software, ¡y espero que pueda ayudarlo a usted también!

¡Que tú y yo nos encontremos y encuentres algo! Bienvenido a seguir la cuenta pública de WeChat: [Artículo picante triste] Reciba gratis un libro de entrevistas para ingenieros de pruebas de software de 216 páginas. ¡Y los tutoriales de aprendizaje en video correspondientes son gratuitos para compartir!

Supongo que te gusta

Origin blog.csdn.net/weixin_50829653/article/details/112850488
Recomendado
Clasificación