Frame--unittest+单测
发布日期:2021-05-14 12:23:05 浏览次数:19 分类:精选文章

本文共 5084 字,大约阅读时间需要 16 分钟。

单元测试简介

1.1 本质

面向对象编程中,通过封装将类属性和类方法结合起来,单元测试的本质是对这些类函数或方法进行测试。通过测试类中的函数,确保其功能符合预期。

1.2 单元测试框架

常用的单元测试框架包括 unittestpytestddt。这些框架提供了参数化功能,简化测试用例的编写和执行。

1.3 参考资料

需要参考相关资料如 链接 以获取更多关于单元测试框架的详细信息。

unittest框架

2.1 框架介绍

unittest 框架提供了标准化的测试框架,包括以下关键组件:

  • TestCase:测试用例的基类,所有测试用例都应继承自此类。
  • TestSuite:测试用例的容器,用来组织多个测试用例。
  • TestLoader:用于加载 TestCase 实例到 TestSuite 中。
  • TextTestRunner:执行测试用例的工具,生成测试结果。
  • TextTestResult:保存测试结果的实例。

2.2 测试原理

unittest 框架的核心流程如下:

  • TestLoader 加载 TestCaseTestSuite
  • TextTestRunner 执行 TestSuite,生成测试结果并保存到 TextTestResult 实例中。
  • 测试结果通过 unittest.main() 模块集成到整个流程中。
  • 2.3 测试流程

  • 编写 TestCase:继承自 unittest.TestCase,方法名以 test 开头。
  • 设置断言:使用 self.assertEqual 等方法验证测试结果。
  • 运行单元测试:调用 unittest.main()
  • 2.4 测试准备

    • 安装 HTMLTestRunnerNew.py 测试报告模板,下载链接为 链接,提取码为 z13q
    • 将模块放在项目目录或 Lib 目录下,并使用 import HTMLTestRunnerNew

    2.5 代码

    test_case.py

    import unittest
    from zy.Code import Add
    class TestAdd(unittest.TestCase):
    def setUp(self):
    self.t = Add()
    def test_add_two_positive(self):
    r = self.t.add(1, 3)
    self.assertEqual(r, -4)
    print(f"测试结果是 {r}")
    def test_add_two_negative(self):
    r = self.t.add(-1, -3)
    self.assertEqual(r, -4)
    print(f"测试结果是 {r}")
    def test_add_two_zero(self):
    r = self.t.add(0, 0)
    self.assertEqual(r, 0)
    print(f"测试结果是 {r}")
    if __name__ == '__main__':
    unittest.main()

    execute_case.py

    import unittest
    from zy.test_case import TestAdd
    suite = unittest.TestSuite()
    suite.addTest(TestAdd('test_add_two_positive'))
    suite.addTest(TestAdd('test_add_two_negative'))
    suite.addTest(TestAdd('test_add_two_zero'))
    with open('TestResult.txt', 'w+', encoding='utf-8') as f:
    runner = unittest.TextTestRunner(f, descriptions='20180929', verbosity=2)
    runner.run(suite)

    3. 参数化

    test_case.py

    import unittest
    from zy.Code import Add
    class TestAdd(unittest.TestCase):
    def setUp(self):
    self.t = Add()
    def __init__(self, a, b, expected, methodName):
    super(TestAdd, self).__init__(methodName)
    self.a = a
    self.b = b
    self.expected = expected
    def test_add(self):
    r = self.t.add(self.a, self.b)
    self.assertEqual(r, self.expected)
    print(f"测试结果是 {r}")

    execute_case.py

    import unittest
    from zy.test_case import TestAdd
    import HTMLTestRunnerNew
    test_data = [
    (1, 2, 3, '两个整数相加'),
    (-1, -2, -3, '两个整数相加'),
    (0, 0, 0, '两个零相加'),
    (0, 1, 1, '一正一零相加'),
    (0, -1, -1, '一负一零相加')
    ]
    suite = unittest.TestSuite()
    for i in test_data:
    print(f'正在执行 {i[3]}')
    suite.addTest(TestAdd(i[0], i[1], i[2], 'test_add'))
    with open('TestResult.html', 'wb+') as f:
    runner = HTMLTestRunnerNew.HTMLTestRunner(f, title='减法测试', description='第二轮整体回归测试减法方法的正确性', tester='华杰-zy')
    runner.run(suite)

    4. 整体代码

    code.py

    class Sub:
    def sub(self, a, b):
    return a - b

    test_case.py

    import unittest
    from zy.code import Sub
    from zy.do_excel import DoExcel
    class TestSub(unittest.TestCase):
    def setUp(self):
    self.t = Sub()
    self.wb = DoExcel()
    def __init__(self, a, b, expected, title, case_id, methodName):
    super(TestSub, self).__init__(methodName)
    self.a = a
    self.b = b
    self.expected = expected
    self.title = title
    self.case_id = case_id
    def test_sub(self):
    print(f'用例标题:{self.title}')
    res = self.t.sub(self.a, self.b)
    try:
    self.assertEqual(res, self.expected)
    test_result = 'PASS'
    except AssertionError as e:
    test_result = 'FAIL'
    raise e
    finally:
    self.wb.write_back(self.case_id + 1, res, test_result)

    execute_case.py

    import unittest
    from zy.test_case import TestSub
    from zy.do_excel import DoExcel
    test_data = DoExcel().read_data()
    suite = unittest.TestSuite()
    for item in test_data:
    suite.addTest(TestSub(item['param_a'], item['param_b'], item['ExpectedResult'], item['title'], item['case_id'], 'test_sub'))
    with open('TestResult.html', 'wb+') as file:
    runner = HTMLTestRunnerNew.HTMLTestRunner(file, title='减法测试', description='第二轮整体回归测试减法方法的正确性', tester='华杰-zy')
    runner.run(suite)

    do_excel.py

    import openpyxl
    class DoExcel:
    def read_data(self):
    wb = openpyxl.load_workbook('test_data.xlsx')
    sheet = wb['model1']
    header = []
    for column in range(1, 6):
    header.append(sheet.cell(1, column).value)
    test_data = []
    for row_id in range(2, 10):
    row_data = {}
    for column_id in range(1, 6):
    row_data[header[column_id - 1]] = sheet.cell(row_id, column_id).value
    test_data.append(row_data)
    return test_data
    def write_back(self, row_id, ActualResult, TestResult):
    wb = openpyxl.load_workbook('test_data.xlsx')
    sheet = wb['model1']
    sheet.cell(row_id, 6).value = ActualResult
    sheet.cell(row_id, 7).value = TestResult
    wb.save('test_data.xlsx')

    测试报告

    5.1 报告样式

    报告采用了清晰的HTML格式,方便阅读和分析,包含测试用例的执行结果、详细的错误信息以及测试时间等内容。

    5.2 测试报告库文件-HTMLTestRunnerNew.py

    下载链接为 链接,提取码为 9eqt。该模块用于生成HTML格式的测试报告,支持详细的测试结果分析和可视化展示。

    上一篇:Frame--配置文件
    下一篇:07.1 python基础-类和对象

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月28日 19时08分50秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章