0
点赞
收藏
分享

微信扫一扫

【pytest】自带的测试报告之Hook钩子函数追加测试执行人/时间/错误截图

树下的老石头 2022-03-11 阅读 93
pythonpytest

目录

一、生成html测试报告

二、添加测试人

三、添加测试执行时间

四、添加错误截屏


一、生成html测试报告

报告1.0版本如下:

二、添加测试人

报告2.0版本如下,多了一个测试人:

三、添加测试执行时间

报告3.0版本如下,多了测试时间:

四、添加错误截屏

  1. 同样进入conftest.py文件进行配置
  2. 因为要用到selenium的截屏方法,所以要导入selenium的类库,同时这边的标签也变成了hookwrapper了,具体命令如下:
  3. import pytest
    from selenium import webdriver
    
    # 定义全局的driver变量
    driver = None
    
    
    # 设置一个browser固件
    @pytest.fixture(scope='session', autouse=True)
    def browser():
        global driver
        if driver is None:
            driver = webdriver.Chrome()
        return driver
    
    
    # 定义截屏方法
    def _capture_screenshot():
        return driver.get_screenshot_as_base64()
    
    
    # 定义添加错误图片的钩子函数
    @pytest.mark.hookwrapper
    def pytest_runtest_makereport(item):
        """
        当测试失败的时候,自动截图,展示到html报告中
        :param item:
        """
        pytest_html = item.config.pluginmanager.getplugin('html')
        outcome = yield
        report = outcome.get_result()
        extra = getattr(report, 'extra', [])
    
        if report.when == 'call' or report.when == "setup":
            xfail = hasattr(report, 'wasxfail')
            if (report.skipped and xfail) or (report.failed and not xfail):
                file_name = report.nodeid.replace("::", "_") + ".png"
                screen_img = _capture_screenshot()
                if file_name:
                    html = '<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:600px;height:300px;" ' \
                           'onclick="window.open(this.src)" align="right"/></div>' % screen_img
                    extra.append(pytest_html.extras.html(html))
            report.extra = extra
  4. 但美中不足的是,如果要使用添加错误截屏方法,就会导致pytest不支持初始化方法和回收方法,一些代码重用的问题就没法避免了。同时我们之前定义的driver也不能使用了,一定要使用它提供的browser方法。所以测试方法修改如下:
  5. # Django自动化测试平台selenium自动化测试脚本--pytest封装
    # 功能名称:登录
    import pytest
    # from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    
    # 1、创建测试类
    class Test_Django_Login():
        # 2、创建测试方法
        # 登录初始化
        # def setup_method(self):
        #     self.url = "http://xxxxxxxxxxxxxxxxxxxxxxxx"
        #     self.driver = webdriver.Chrome()
        #     self.driver.get(self.url)
    
        def test_login_01(self, browser):
            self.url = "http://xxxxxxxxxxxxxxxxxxxxxxxxxx"
            browser.get(self.url)
            browser.find_element(By.NAME, "username").send_keys('atstudy1')
            browser.find_element(By.NAME, "password").send_keys('51testing')
            browser.find_element(By.XPATH, '//*[@id="login-form"]/div[3]/input').click()
            # # 统一检查点
            result = browser.find_element(By.XPATH, '//*[@id="content"]/p').text
            # 3、通过断言进行判断
            assert "请输入11" in result
    
    if __name__ == '__main__':
        pytest.main(['test_login.py', '--html=loginReport.html'])
  6.  还是进入命令台运行之前的命令。main方法我运行之后不知道怎么就是没法生成测试报告,就不纠结了。

报告3.0版本如下,多了报错截图,包括代码截图以及网页截图:

举报

相关推荐

0 条评论