Práctica del marco de pruebas automatizadas de Selenium + Pytest (Parte 1)

Prefacio

Hoy, el autor quiere hablar con usted sobre la automatización de selenio + el marco de prueba de pytest. En este artículo, necesita conocer una cierta base de Python, al menos comprender clases y objetos, herencia de encapsulación, una cierta base de selenio. Este artículo no conoce el selenio. Si no lo sabe, puede ir al sitio web de traducción al chino de selenio.

1. Introducción al marco de pruebas.

¿ Cuáles son las ventajas de los marcos de prueba ?

    • La tasa de reutilización del código es alta y si no se utiliza un marco, el código será muy redundante.
    • Puede ensamblar algunas funciones avanzadas como registros, informes, correos electrónicos, etc.
    • Mejore la capacidad de mantenimiento de datos como elementos. Cuando los elementos cambian, solo necesita actualizar el archivo de configuración.
    • Utilice el patrón de diseño PageObject más flexible
  • Directorio general de marcos de prueba.
  • Descripción del directorio/archivo: si es un paquete de Python común. Este paquete almacena clases generales comunes. Por ejemplo, leer el archivo de configuración es config. El directorio del archivo de configuración es el directorio de registros. La página encapsula profundamente las funciones de Selenium. Es page_element donde página Los elementos se almacenan Directorio page_object objeto de página Patrón de diseño POM, TestCase todos los conjuntos de casos de prueba son utilidades las clases de herramientas son archivos de script script archivo de pegamento conftest.pypytest archivo de configuración pytest.inipytest, una estructura de marco tan simple es clara.

Ahora que sabemos lo anterior, ¡comencemos!

En el proyecto, primero construimos cada directorio de acuerdo con las pautas del marco anterior.

Nota: Si tiene un paquete de Python, debe agregar un archivo __init__.py para identificar este directorio como un paquete de Python.

2. Tiempo de gestión

En primer lugar, debido a que muchos de nuestros módulos usarán cadenas como marcas de tiempo o fechas, primero encapsulamos la hora en un módulo por separado.

Luego deja que otros módulos lo llamen. Cree un nuevo módulo times.py en el directorio de utilidades

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import time
import datetime
from functools import wraps


def timestamp():
    """时间戳"""
    return time.time()


def dt_strftime(fmt="%Y%m"):
    """
    datetime格式化时间
    :param fmt "%Y%m%d %H%M%S
    """
    return datetime.datetime.now().strftime(fmt)


def sleep(seconds=1.0):
    """
    睡眠时间
    """
    time.sleep(seconds)


def running_time(func):
    """函数运行时间"""

    @wraps(func)
    def wrapper(*args, **kwargs):
        start = timestamp()
        res = func(*args, **kwargs)
        print("校验元素done!用时%.3f秒!" % (timestamp() - start))
        return res

    return wrapper


if __name__ == '__main__':
    print(dt_strftime("%Y%m%d%H%M%S"))

3. Agregar archivo de configuración

¡Los archivos de configuración son una parte esencial del proyecto!

Concentrar información fija en archivos fijos.

3.1conf.py

Debería haber un archivo en el proyecto para administrar el directorio general. También configuré este archivo en este proyecto de Python.

Cree un archivo conf.py en el directorio de configuración del proyecto y toda la información de configuración del directorio se escribe en este archivo.

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
from selenium.webdriver.common.by import By
from utils.times import dt_strftime


class ConfigManager(object):
    # 项目目录
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    # 页面元素目录
    ELEMENT_PATH = os.path.join(BASE_DIR, 'page_element')

    # 报告文件
    REPORT_FILE = os.path.join(BASE_DIR, 'report.html')

    # 元素定位的类型
    LOCATE_MODE = {
        'css': By.CSS_SELECTOR,
        'xpath': By.XPATH,
        'name': By.NAME,
        'id': By.ID,
        'class': By.CLASS_NAME
    }

    # 邮件信息
    EMAIL_INFO = {
        'username': '[email protected]',  # 切换成你自己的地址
        'password': 'QQ邮箱授权码',
        'smtp_host': 'smtp.qq.com',
        'smtp_port': 123
    }

    # 收件人
    ADDRESSEE = [
        '[email protected]',
    ]

    @property
    def log_file(self):
        """日志目录"""
        log_dir = os.path.join(self.BASE_DIR, 'logs')
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        return os.path.join(log_dir, '{}.log'.format(dt_strftime()))

    @property
    def ini_file(self):
        """配置文件"""
        ini_file = os.path.join(self.BASE_DIR, 'config', 'config.ini')
        if not os.path.exists(ini_file):
            raise FileNotFoundError("配置文件%s不存在!" % ini_file)
        return ini_file


cm = ConfigManager()
if __name__ == '__main__':
    print(cm.BASE_DIR)
Nota: ¿Cómo generar el código de autorización del buzón QQ e ir a Baidu usted mismo
? Imité el estilo de configuración del archivo settings.py de Django en este archivo conf, pero hay algunas diferencias.

En este archivo podemos configurar nuestros propios directorios y ver nuestro directorio actual.

Se sigue la convención: los nombres de las constantes están todos en mayúsculas y los nombres de las funciones están en minúsculas. En general se ve hermoso.

3.2config.ini

Cree un nuevo archivo config.ini en el directorio de configuración del proyecto y coloque temporalmente en él la URL que necesitamos probar.

[HOST]
HOST = https://www.baidu.com

4. Lea el archivo de configuración.

Se ha creado el archivo de configuración, a continuación debemos leer el archivo de configuración y utilizar la información que contiene.

Creamos un nuevo archivo readconfig.py en el directorio común

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import configparser
from config.conf import cm

HOST = 'HOST'


class ReadConfig(object):
    """配置文件"""

    def __init__(self):
        self.config = configparser.RawConfigParser()  # 当有%的符号时请使用Raw读取
        self.config.read(cm.ini_file, encoding='utf-8')

    def _get(self, section, option):
        """获取"""
        return self.config.get(section, option)

    def _set(self, section, option, value):
        """更新"""
        self.config.set(section, option, value)
        with open(cm.ini_file, 'w') as f:
            self.config.write(f)

    @property
    def url(self):
        return self._get(HOST, HOST)


ini = ReadConfig()

if __name__ == '__main__':
    print(ini.url)

Puede ver que utilizamos el módulo configparser integrado de Python para leer el archivo config.ini.

Para extraer el valor de la URL, utilicé el valor del atributo @property de sintaxis de alto nivel, que es más sencillo de escribir.

5. Registrar registros de operaciones

Iniciar sesión, todos deberían estar familiarizados con este término, que consiste en registrar acciones en el código.

Cree un nuevo archivo logger.py en el directorio de utilidades.

Utilizamos este archivo para registrar algunos pasos operativos durante el proceso de prueba automatizado.

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import logging
from config.conf import cm


class Log:
    def __init__(self):
        self.logger = logging.getLogger()
        if not self.logger.handlers:
            self.logger.setLevel(logging.DEBUG)

            # 创建一个handle写入文件
            fh = logging.FileHandler(cm.log_file, encoding='utf-8')
            fh.setLevel(logging.INFO)

            # 创建一个handle输出到控制台
            ch = logging.StreamHandler()
            ch.setLevel(logging.INFO)

            # 定义输出的格式
            formatter = logging.Formatter(self.fmt)
            fh.setFormatter(formatter)
            ch.setFormatter(formatter)

            # 添加到handle
            self.logger.addHandler(fh)
            self.logger.addHandler(ch)

    @property
    def fmt(self):
        return '%(levelname)s\t%(asctime)s\t[%(filename)s:%(lineno)d]\t%(message)s'


log = Log().logger

if __name__ == '__main__':
    log.info('hello world')

Ejecute el archivo en la terminal y vea la línea de comando impresa:

INFO	2022-06-15 16:00:05,467	[logger.py:38]	hello world

Luego se generó el archivo de registro del mes actual en el directorio de registros del proyecto.

6. Comprensión sencilla del modelo POM

Como vamos a hablar de elementos a continuación, primero entendemos el modelo POM.

El modo Objeto de página tiene las siguientes ventajas.

Esta vista proviene de "Pruebas automatizadas de Selenium: basadas en el lenguaje Python".
  • Abstraer el objeto puede minimizar el impacto de que los desarrolladores modifiquen el código de la página en la prueba, por lo que solo necesita ajustar
    el objeto de la página sin afectar la prueba;
  • Parte del código de prueba se puede reutilizar en múltiples casos de prueba;
  • El código de prueba se vuelve más legible, flexible y mantenible

Diagrama de patrón de objeto de página

 

  • página base: la clase base de selenio, que encapsula los métodos de selenio
  • pageelements: elementos de página, extrae elementos de página individualmente y colóquelos en un archivo
  • página de búsqueda: clase de objeto de página, que integra métodos de selenio y elementos de página
  • testcase: use pytest para escribir casos de prueba para la página de búsqueda integrada

En la figura anterior podemos ver que a través de la idea del modelo POM, ponemos:

  • métodos de selenio
  • elementos de pagina
  • objeto de página
  • caso de prueba

Los cuatro cuerpos de código anteriores están divididos. Aunque aumentará el código cuando hay pocos casos de uso, es muy significativo cuando hay muchos casos de uso. La cantidad de código se reducirá significativamente cuando aumenten los casos de uso. Nuestro mantenimiento de código se ha vuelto más intuitivo y obvio, la legibilidad del código se ha vuelto mucho mejor que en el modo de fábrica y la tasa de reutilización del código también ha mejorado enormemente.

Finalmente: Los siguientes son los materiales de aprendizaje de apoyo, que deberían ser el almacén de preparación más completo y completo para los amigos que hacen [pruebas de software]. Este almacén también me ha acompañado en el viaje más difícil. ¡Espero que también pueda ayudarlo a usted!

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 el conjunto completo de información: haga clic en la pequeña tarjeta a continuación para obtenerla usted mismo

Supongo que te gusta

Origin blog.csdn.net/weixin_57794111/article/details/132918077
Recomendado
Clasificación