首页 > 其他分享 >HTMLReport使用2 | HTMLReport使用方法详解

HTMLReport使用2 | HTMLReport使用方法详解

时间:2023-03-07 16:00:51浏览次数:40  
标签:info logging 详解 self HTMLReport 测试 使用 test def

(2 | HTMLReport的使用)

注:以下实例来源于官网。

1 日志

  • 为测试报告中添加过程日志;
  • 多线程下,在报告中会分别记录每个线程的日志,同时会产生与测试报告同名的测试 log 文件。
import logging

logging.info("测试")
logging.debug("测试")
logging.warning("测试")
logging.error("测试")
logging.critical("测试")

2 图片信息

  • 为测试报告添加图片信息;
  • 图片信息编码为 base64 编码;
  • 如采用的是 selenium 截屏,使用 get_screenshot_as_base64() 方法;
  • 本库会自动将图片保存在报告路径下的images目录下,并嵌入到报告中。
import base64
from HTMLReport import add_image

with open("baidu.png", 'rb') as f:
    image = base64.b64encode(f.read())
    add_image(image, "图片标题", "图片描述")
  • 参数说明:
参数 说明
image 控制全局是否添加图片
failed_image 控制是否只在测试失败时保存图片

3 失败重试

  • 测试方法前加入装饰器 @retry @no_retry,用于重试与不重试。

4 数据驱动

  • 测试类前加入装饰器 @ddt.ddt
  • 测试方法前加入装饰器 @ddt.data(*data)

5 官方实例

import base64
import logging
import random
import unittest

from HTMLReport import ddt, TestRunner, add_image, no_retry, retry


class TestOne(unittest.TestCase):
    """常规测试"""

    def setUp(self) -> None:
        logging.debug("测试开始")
        logging.info("测试开始")
        logging.warning("测试开始")
        logging.error("测试开始")

    def tearDown(self) -> None:
        logging.info("测试结束")

    def test_true(self):
        """
        测试通过
        """
        self.assertTrue(True)

    def test_false(self):
        """
        测试失败

        :return:
        """
        self.assertTrue(False)

    def test_error(self):
        """
        测试异常

        :return:
        """
        self.assertTrue(int("5.2"))

    @unittest.skip("跳过用例")
    def test_skip(self):
        """
        测试跳过

        :return:
        """
        self.assertTrue(int("5.2"))

    def test_skip_(self):
        """
        测试中途跳过

        :return:
        """
        logging.info("准备跳过")
        self.skipTest("中途跳过")
        self.assertTrue(int("5.2"))

    def test_image(self):
        """测试截图"""
        with open("baidu.png", 'rb') as f:
            image = base64.b64encode(f.read())
            alt = """百度一下,你就知道了。"""
            for i in range(5):
                add_image(image, f"百度 {i}", alt)


@ddt.ddt
class TestDDT(unittest.TestCase):
    """DDT 测试"""

    def setUp(self) -> None:
        logging.info("测试开始")

    def tearDown(self) -> None:
        logging.info("测试结束")

    @ddt.data(*range(3))
    def test_a(self, n):
        self.assertEqual(n, random.randint(0, 2))


@ddt.ddt
class TestNoRetry(unittest.TestCase):
    """测试 DDT 不重试"""

    def setUp(self) -> None:
        logging.info("测试开始")

    def tearDown(self) -> None:
        logging.info("测试结束")

    @no_retry
    @ddt.data(*range(3))
    def test_a(self, n):
        self.assertEqual(n, random.randint(0, 2))


@ddt.ddt
class TestRetry(unittest.TestCase):
    """测试 DDT 重试"""

    def setUp(self) -> None:
        logging.info("测试开始")

    def tearDown(self) -> None:
        logging.info("测试结束")

    @retry
    @ddt.data(*range(3))
    def test_a(self, n):
        self.assertEqual(n, random.randint(0, 2))


class TestClassMethod(unittest.TestCase):
    """
    测试 setUpClass
    """

    n = 0

    @classmethod
    def setUpClass(cls) -> None:
        logging.info(f"初始计数:{cls.n}")

    @classmethod
    def tearDownClass(cls) -> None:
        logging.info(f"最终计数:{cls.n}")

    def setUp(self) -> None:
        logging.info(f"前置计数:{self.n}")

    def tearDown(self) -> None:
        logging.info(f"后置计数:{self.n}")

    def test_1(self):
        self.__class__.n += 1
        logging.info(f"运行修改:{self.n}")

    def test_2(self):
        self.__class__.n += 1
        logging.info(f"运行修改:{self.n}")
        self.assertTrue(False)


if __name__ == '__main__':
    test_runner = TestRunner(
        report_file_name="index",
        output_path="report",
        title="一个简单的测试报告",
        description="随意描述",
        thread_count=5,
        thread_start_wait=0.1,
        tries=3,
        delay=0,
        back_off=1,
        retry=True,
        sequential_execution=True,
        lang="cn"
    )
    suite = unittest.TestSuite()
    suite_sub = unittest.TestSuite()
    loader = unittest.TestLoader()
    suite_sub.addTests(loader.loadTestsFromTestCase(TestOne))
    suite_sub.addTests(loader.loadTestsFromTestCase(TestDDT))
    suite.addTests(suite_sub)
    suite.addTests(loader.loadTestsFromTestCase(TestRetry))
    suite.addTests(loader.loadTestsFromTestCase(TestNoRetry))
    suite.addTests(loader.loadTestsFromTestCase(TestClassMethod))
    suite.addTests(loader.loadTestsFromNames(["HTMLReport_test.TestClassMethod"]))
    test_runner.run(suite)

标签:info,logging,详解,self,HTMLReport,测试,使用,test,def
From: https://blog.51cto.com/NoamaNelson/6105048

相关文章

  • Linux基础命令使用
    1.CentOS安装和卸载Python3卸载python3rpm-qa|greppython3|xargsrpm-ev--allmatches--nodeps卸载pyhton3whereispython3|xargsrm-frv删除所有残余文件......
  • 使用hutool实现压缩zip到输出流(包括空zip)
    //将文件直接压缩至输出流String[]fileNames=fileNameList.toArray(newString[0]);InputStream[]inputStreams=inputStreamList.toArray(newInputStream[0]);i......
  • Httprunner4 - 使用环境变量
    python设置环境变量importos#设置环境变量os.environ["token"]=token#获取环境变量token=os.environ["token"]token=os.getenv("token")#移除环境变......
  • Linux使用DataX3.0 ~笔记-持续更新中
     一、Liunx上安装DataX查看当前系统版本查看系统的名称,命令:uname查看具体的系统版本,命令:cat/etc/redhat-release查看是否具备jdk和python环境:查看jdk版本,命......
  • 【android 】android AlarmManager 详解
    在开发互联网应用时候,我们常常要使用心跳来保证客户端与服务器的连接。怎么完成心跳很关键,在说道客户端心跳功能时,如果使用Timer或者专门开起一个线程来做心跳的工作,会浪费......
  • 使用 shell 脚本自动申请进京证 (六环外)
    问题背景外地车辆进入北京,需要办理《进京证》,不办理证件驶入后会被执法设备抓拍,一次罚100扣1分,目前唯一的线上办理通道是下载《北京交警》App,注册后添加车辆,就可以为......
  • 跟着思兼学习Klipper(21)新一代全能选手: Octopus Max EZ 简要使用记录
    前言本文感谢必趣(BigtreeTech)赞助的OctopusMAXEZ主板,据说是美女一手自用。既往没有系统了解过必趣系的主板,这次和网友们一起一探究竟。【KlipperBoxConfigs配......
  • copy的使用
    前言最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子表的需求。......
  • 使用MathNet.Numerics进行曲线拟合并使用SkiaSharp绘制曲线
    本文展示了如何使用MathNet.Numerics对离散点进行曲线拟合,计算其R^2值,并基于Winform使用SkiaSharp.Views.WindowsForms绘制曲线及离散点,上述组件可从NuGet获取。1、曲线拟......
  • MongoDB找出冗余和未被使用的索引
    找出冗余的索引varldb=db.adminCommand({listDatabases:1});for(i=0;i<ldb.databases.length;i++){if(ldb.databases[i].name!='admin'&&......