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

简介: HTMLReport使用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)
目录
相关文章
|
编解码 Ubuntu Linux
Linux应用开发基础知识——Framebuffer 应用编程(四)
Linux应用开发基础知识——Framebuffer 应用编程(四)
298 0
Linux应用开发基础知识——Framebuffer 应用编程(四)
AWS-EC2多弹性ip配置
AWS-EC2多弹性ip配置
1243 0
AWS-EC2多弹性ip配置
|
供应链 监控 数据挖掘
淘宝商品详情数据接口:解锁电商数据分析新密码
在数字化时代,电商竞争激烈,精准的数据分析成为制胜关键。淘宝商品详情数据接口如同一把神奇的钥匙,为商家提供商品名称、价格、销量、评价等详细信息,助力洞察市场趋势、优化商品策略、提升运营效率。通过实时更新的数据,商家可以及时调整定价、促销和库存管理,增强竞争力。未来,该接口将带来更多智能化的数据分析工具和精准的市场预测模型,助力电商从业者在竞争中脱颖而出。
|
前端开发
【前端web入门第六天】01 CSS浮动
这是关于CSS布局第六天学习目标的介绍,主要解决多个`<div>`标签在同一行显示的问题,即一个在左边,另一个在右边。文中介绍了标准流、浮动及flex布局的概念,重点推荐使用flex布局。文章详细讲解了浮动的基本使用、布局技巧及清除浮动的方法,包括额外标签法、单伪元素法、双伪元素法和`overflow`隐藏法,并提供了示例代码帮助理解。
187 6
|
监控 持续交付 开发工具
软件配置管理与知识库管理实践
【8月更文第22天】软件配置管理(SCM)是在软件开发过程中为了确保项目的可追溯性和可控性而实施的一系列管理活动。它涵盖了版本控制、变更控制、发布管理和知识库管理等多个方面。本文将详细介绍这些关键领域的实践方法,并通过一个虚构的软件项目——“云笔记”应用程序为例来进行说明。
504 1
|
关系型数据库 MySQL Java
异常:no transaction is in progress
异常:no transaction is in progress
444 0
|
Ubuntu 编译器 C++
【Conan 入门教程 】在Ubuntu上使用Conan编译C++第三方库:一站式解决方案
【Conan 入门教程 】在Ubuntu上使用Conan编译C++第三方库:一站式解决方案
3617 1
|
存储 C语言 iOS开发
【C++】标准库 - 文件的读写 i/ofstream
本文章介绍 C++ 标准库中处理文件读写的 fstream ,以及其中的一些使用
455 0
|
测试技术 开发者 Python
Python中的单元测试与测试驱动开发(TDD)指南
测试是保障代码质量的关键步骤,而Python提供了强大的测试工具和框架,让开发者能够轻松地进行单元测试和测试驱动开发(TDD)。本文将深入探讨单元测试的概念、`unittest`库的基本用法,以及如何通过TDD的方式构建高质量的Python代码。
|
测试技术 持续交付 开发者
Codeup 配置正则表达式限制提交格式
如何在云效 Codeup 配置正则表达式限制提交格式
451 0
Codeup 配置正则表达式限制提交格式