Encapsulación de funciones de prueba, clases de prueba/métodos de prueba para la automatización de la interfaz python+pytest

Tabla de contenido

prefacio

Reglas generales para la encapsulación de casos de prueba

Encapsulación de funciones de prueba

Encapsulación de clases/métodos de prueba

Código de muestra

Resumir


prefacio

En la serie de automatización de la interfaz python+pytest, nuestros artículos anteriores básicamente no encapsularon el código, pero en la escritura real de scripts de prueba automatizados, todos necesitamos encapsular el código de prueba para que el marco de prueba pueda reconocerlo y ejecutarlo.

Por ejemplo, el código de solicitud para una única interfaz es el siguiente:

import requests

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}

url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=h_url, headers=headers)

Supongamos que necesitamos escribir el código anterior en un caso de prueba que pueda ser ejecutado por el marco de prueba. Obviamente, no es suficiente escribir el código de esta manera, y se requieren las siguientes adiciones:

  • El código debe encapsularse en una función de prueba o clase de prueba que el marco de prueba de unidad (pytest o unittest) pueda reconocer; de lo contrario, no se reconocerá ni ejecutará.
  • Es necesario agregar una aserción, es decir, la comparación entre el resultado y la expectativa, para que el marco de pruebas unitarias pueda determinar si se pasa el resultado de ejecución del caso de uso.Si el resultado == expectativa, significa que pasó, de lo contrario falla.

La encapsulación de funciones y clases en python no se explica aquí. Para las aserciones de pytest, puede consultar el artículo pytest(5)-asertions. El propósito de este artículo es que todos entiendan cómo encapsular códigos de prueba en pruebas de automatización de interfaz.

Reglas generales para la encapsulación de casos de prueba

Hay dos tipos de encapsulación de casos de prueba, función de prueba y clase de prueba.Las reglas generales de encapsulación son las siguientes:

  • Una función de prueba corresponde a un caso de prueba.
  • Se pueden definir múltiples métodos de prueba en una clase de prueba, un método de prueba corresponde a un caso de prueba y la clase de prueba se puede considerar como un conjunto de casos de prueba.
  • El nombre de la función de prueba o método de prueba en pytest debe comenzar con prueba, y el nombre de la clase de prueba debe comenzar con Prueba. Para conocer las reglas de nomenclatura específicas, consulte mi artículo anterior sobre reglas de nomenclatura pytest(3)-test.
  • Para la verificación de prueba de interfaz única, un caso de prueba de interfaz única contiene solo una solicitud de interfaz, es decir, una solicitud de interfaz se encapsula en una función de prueba o método de prueba.
  • Para la verificación de prueba de escenarios (múltiples interfaces), un caso de prueba de escenario debe solicitar múltiples interfaces, por lo que las solicitudes de múltiples interfaces deben encapsularse en la misma función o método de prueba.
  • Generalmente, la verificación positiva y la verificación anormal de una interfaz se encapsulan en diferentes métodos y se encapsulan en la misma clase de prueba. Por ejemplo, si define una clase de prueba de inicio de sesión, la solicitud de nombre de usuario y contraseña correctos se encapsula en un método (es decir, un caso de prueba) y la solicitud de nombre de usuario correcto y contraseña incorrecta se encapsula en otro método (es decir, otro caso de prueba).
  • También es posible encapsular un punto de función o un caso de interfaz asociado con una función en la misma clase de prueba. Por ejemplo, las interfaces involucradas en el centro personal se pueden encapsular en la misma clase de prueba

Encapsulación de funciones de prueba

En términos generales, una función de prueba corresponde a un caso de uso. El código anterior está escrito como un caso de prueba, el ejemplo es el siguiente:

Se enfatiza que el nombre de la función de prueba en pytest debe comenzar con prueba, como test_get_home.

Encapsulación de clases/métodos de prueba

Una clase de prueba es equivalente a un conjunto de casos de prueba, y cada método de la clase corresponde a un caso de prueba. Tome la interfaz de inicio de sesión como ejemplo, encapsúlela en una clase de prueba, el ejemplo es el siguiente:

Se enfatiza que el nombre de la clase de prueba en pytest debe comenzar con Test, como TestLogin, y no puede haber un método init en la clase de prueba. El método de prueba en la clase de prueba debe comenzar con prueba, como test_login_normal.

Código de muestra

En pytest, puede usar la línea de comando o usar el método de código, es decir, pytest.main() para ejecutar el caso de uso. Para obtener más detalles, consulte el artículo pytest(1)-Introducción.

El código de ejemplo completo es el siguiente:

# @time: 2022-03-24
# @author: 给你一页白纸
# 微信公众号:测试上分之路

import requests
import pytest
import json

def test_get_home():
    '''
    请求首页接口
    :return:
    '''
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
    }

    url = "https://www.cnblogs.com/lfr0123/"
    res = requests.get(url=url, headers=headers)
    # 断言,判断返回结果的code是否等于200,当然实际接口测试中一般返回结果中还会有别的字段需要断言
    assert res.status_code == 200

class TestLogin:
    '''
    登录接口校验
    '''
    url = "http://127.0.0.1:5000/login"
    headers = {"Content-Type": "application/json;charset=utf8"}

    def test_login_normal(self):
        '''正确用户名、正确密码登录'''
        data = {
            "username": "AndyLiu",
            "password": "123456"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 断言
        assert res.status_code == 200
        assert json.loads(res.text)["token"]

    def test_login_error(self):
        '''正确用户名、错误密码登录'''
        data = {
            "username": "AndyLiu",
            "password": "111111"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 断言
        assert res.status_code == 200
        assert not json.loads(res.text)["token"]

if __name__ == '__main__':
    pytest.main()

Resumir

  • La encapsulación de funciones de prueba, clases de prueba/métodos de prueba, de hecho, sin importar cuál sea el marco de prueba de unidad, sigue el mismo método.
  • Cada uno tiene sus propios requisitos en términos de métodos de nomenclatura.Por ejemplo, existen ciertas diferencias entre los métodos de nomenclatura de prueba en pytest y unittest.
  • Considere una función o método con su propia aserción como caso de prueba, entonces la clase de prueba es en realidad un conjunto de casos de prueba que contiene uno o más casos de prueba, y cada método en la clase corresponde a un caso de prueba.
  • Qué métodos de prueba poner en una clase de prueba, en otras palabras, qué casos de prueba deben incluirse en un conjunto de casos de prueba, se pueden determinar de acuerdo con la situación del proyecto o las ideas propias del evaluador. El propósito principal es ser claro.

 

Supongo que te gusta

Origin blog.csdn.net/MXB_1220/article/details/131731255
Recomendado
Clasificación