基于pytest+allure的自动化测试(二)日志封装

本文介绍了如何在基于pytest和allure的自动化测试中进行日志封装,减少冗余代码。详细讲解了日志文件的创建和日志写入的实现方法,以提高测试效率。
摘要由CSDN通过智能技术生成
前言

为了减少自动化过程中的冗余代码,我们把一些常用的类、方法封装成自己想要的方法、类,本文简单介绍常用类的封装代码

日志封装
# -*- coding: utf-8 -*- 
# @CreateTime : 2020/8/6 19:38 
# @Author : tester_ye
# @File : Log.py

import logging
import os
import time


# 获取当前脚本文件父类的绝对路径(项目主目录)
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_file = path + '/Logs/log.log'
err_file = path + '/Logs/err.log'
date = '%Y-%m-%d %H-%M-%S'

LEVELS = {
   
    'debug': logging.DEBUG,
    'info': logging.INFO,
    'warning': logging.WARNING,
    'error': logging.ERROR,
    'critical': logging.CRITICAL
}
# 初始化日志对象logger
logger = logging.getLogger()

# 实例化日志信息输出到磁盘文件上的流,指定文件路劲和编码
handler = logging.FileHandler(log_file, encoding='utf-8')
err_handler = logging
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个使用Python+Selenium+Pytest+Allure自动化测试工程框架示例,包括一些公共的代码: ## 工程结构 ``` - project/ - tests/ - test_login.py - pages/ - base_page.py - login_page.py - utils/ - config.py - driver.py - logger.py - reports/ - requirements.txt - pytest.ini ``` ## requirements.txt ``` selenium==3.141.0 pytest==6.2.4 pytest-allure-adaptor==1.7.0 ``` ## pytest.ini ``` [pytest] log_cli = true log_cli_level = INFO log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s) log_file = logs/test.log log_file_level = INFO log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s) markers = smoke: Run the smoke test cases regression: Run the regression test cases ``` ## utils/config.py ```python import os PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) DRIVER_PATH = os.path.join(PROJECT_ROOT, 'drivers/chromedriver') BASE_URL = 'http://example.com' USERNAME = 'testuser' PASSWORD = 'testpass' ``` ## utils/driver.py ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from utils.config import DRIVER_PATH def get_driver(): options = Options() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(executable_path=DRIVER_PATH, options=options) return driver ``` ## utils/logger.py ```python import logging import os from utils.config import PROJECT_ROOT def get_logger(name): logger = logging.getLogger(name) logger.setLevel(logging.INFO) log_dir = os.path.join(PROJECT_ROOT, 'logs') if not os.path.exists(log_dir): os.makedirs(log_dir) log_file = os.path.join(log_dir, 'test.log') formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)') file_handler = logging.FileHandler(log_file) file_handler.setLevel(logging.INFO) file_handler.setFormatter(formatter) console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger ``` ## pages/base_page.py ```python from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from utils.driver import get_driver from utils.config import BASE_URL class BasePage: def __init__(self): self.driver = get_driver() self.wait = WebDriverWait(self.driver, 10) self.base_url = BASE_URL def open(self, url=None): if url is None: url = self.base_url self.driver.get(url) def find_element(self, locator): return self.wait.until(EC.presence_of_element_located(locator)) def find_elements(self, locator): return self.wait.until(EC.presence_of_all_elements_located(locator)) def click(self, locator): element = self.find_element(locator) element.click() def input(self, locator, text): element = self.find_element(locator) element.clear() element.send_keys(text) def close(self): self.driver.quit() ``` ## pages/login_page.py ```python from selenium.webdriver.common.by import By from pages.base_page import BasePage from utils.config import USERNAME, PASSWORD class LoginPage(BasePage): username_locator = (By.NAME, 'username') password_locator = (By.NAME, 'password') submit_locator = (By.CSS_SELECTOR, 'button[type="submit"]') def login(self, username=USERNAME, password=PASSWORD): self.open() self.input(self.username_locator, username) self.input(self.password_locator, password) self.click(self.submit_locator) ``` ## tests/test_login.py ```python import allure import pytest from pages.login_page import LoginPage from utils.logger import get_logger logger = get_logger(__name__) @allure.feature('Login') class TestLogin: @allure.title('Test login with correct username and password') @allure.severity(allure.severity_level.NORMAL) @pytest.mark.smoke def test_login_success(self): logger.info('Test login with correct username and password') LoginPage().login() assert 'Dashboard' in LoginPage().driver.title @allure.title('Test login with incorrect username or password') @allure.severity(allure.severity_level.NORMAL) @pytest.mark.regression def test_login_failure(self): logger.info('Test login with incorrect username or password') LoginPage().login(username='invalid', password='invalid') assert 'Login' in LoginPage().driver.title ``` 使用命令 `pytest --alluredir=./reports` 运行测试,使用命令 `allure serve ./reports` 查看测试报告。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值