• Python 单元测试 实战演练


    结合实例,联系单元测试。

    文件结构:

    |----Python_unittest

    |--------math_operation.py    # 定义了类【class MathOperation:】,类里面定义了初始化函数,以及加减乘除4个实例方法

    |--------two_num_delete.py      # 定义了类【class TestDelete(unittest.TestCase):】,类里面定义了测试减法的用例

    |--------two_num_divide.py     # 定义了类【class TestDivide(unittest.TestCase):】,类里面定义了测试除法的用例

    |--------unittest_suite.py


     1.two_num_delete.py

    import unittes

    from Python_unittest.math_operation import MathOperation class TestDelete(unittest.TestCase): @classmethod def setUpClass(cls): """ 在执行所有用例之前,会调用setUpClass类属性 :return: """ log_file_name = "math_operation_result_log.txt" cls.one_file = open(log_file_name, mode="a", encoding="utf-8") print(f"打开【{log_file_name}】文件") cls.one_file.write(" {:=^40s} ".format("开始执行【减法】的测试用例")) @classmethod def tearDownClass(cls): """ 在所有用例执行之后, 会调用一次tearDownClass类属性 :return: """ cls.one_file.write("{:=^40s} ".format("【减法】的测试用例执行结束")) cls.one_file.close() def test_delete0(self): real_result = MathOperation(9, 6).delete() expect_value = 3 try: self.assertEqual(expect_value, real_result, msg="两数相减异常") print("a>b>0, a-b的结果正常") self.one_file.write("a>b>0时, a-b测试的结果为:Pass ") except AssertionError as err: print(f"具体异常为:{err}") self.one_file.write(f"a>b>0时, a-b测试的结果为:Fail 具体异常为{err}")
    raise err  def test_delete1(self): real_result = MathOperation(-9, -6).delete() expect_value = -3 try: self.assertEqual(expect_value, real_result, msg="两数相减异常") print("a<b<0, a-b的结果正常") self.one_file.write("a<b<0时, a-b的测试结果为:Pass ") except AssertionError as err: print(f"具体异常为:{err}") self.one_file.write(f"a<b<0时, a-b的测试结果为:Fail 具体异常为{err}")
    raise err

      


     2.two_num_divide.py

    import unittest
    
    from Python_unittest import MathOperation
    
    
    class TestDivide(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls):
            """
            在执行所有用例之前都会执行的文件
            :return:
            """
            log_file_name = "math_operation_result_log.txt"
            cls.one_file = open(log_file_name, mode="a", encoding="utf-8")
            print(f"打开【{log_file_name}】文件")
            cls.one_file.write("
    {:=^40s}
    ".format("开始执行【除法】的测试用例"))
    
        @classmethod
        def tearDownClass(cls):
            """
            在所有用例执行之后, 会调用一次tearDownClass类属性
            :return:
            """
            cls.one_file.write("{:=^40s}
    ".format("【除法】的测试用例执行结束"))
            cls.one_file.close()
    
        def test_divide0(self):
            real_result = MathOperation(9, 3).divide()
            expect_result = 3
            try:
                self.assertEqual(expect_result, real_result, msg="两数相除异常")
                print("a>b>0,a/b的结果正常")
                self.one_file.write("a>b>0,a/b的测试结果为:Pass
    ")
            except AssertionError as err:
                print(f"具体异常为:{err}")
                self.one_file.write(f"a>b>0时, a/b测试的结果为:Fail
    具体异常为{err}")
    raise err def test_divide1(self): real_result = MathOperation(9, -3).divide() expect_result = 9 try: self.assertEqual(expect_result, real_result, msg="两数相除异常") print("a>0>b,a/b的结果正常") self.one_file.write("a>b>0,a/b的测试结果为:Pass ") except AssertionError as err: print(f"具体异常为:{err}") self.one_file.write(f"a>b>0时, a/b测试的结果为:Fail 具体异常为{err} ")
    raise err

      


    3.unittest_suite.py

    import unittest
    
    from Python_unittest import two_num_divide as num_divide
    from Python_unittest import two_num_delete as num_delete
    
    # 定义一个【套件】
    one_suite = unittest.TestSuite()
    
    # 定义【加载器】
    # 通过加载器加载用例,并添加到套件中
    one_loader = unittest.TestLoader()
    
    one_suite.addTest(one_loader.loadTestsFromModule(num_divide))
    one_suite.addTest(one_loader.loadTestsFromModule(num_delete))
    # 定义【运行器】 one_runner = unittest.TextTestRunner() one_runner.run(one_suite) 

    【知识点】

    one_suite.addTest(one_loader.loadTestsFromModule(num_divide))  是向套件中一个一个地添加加测试模块的用例

    one_suite.addTests(one_loader.loadTestsFromModule(num_divide),one_loader.loadTestsFromModule(num_delete))  可以同时添加多个模块测试用例

    执行顺序与添加顺序有关。

     


    4.运行结果:

    【知识点】

    注意捕获异常时一定要抛出异常,用例的总数是:以test_开头的所有方法的个数,失败数则是根据抛出的【断言异常AssertionError】来统计的。

    .代表运行成功,F代表运行失败。

    用例执行的顺序:

    loadTestsFromModele()方法先添加哪个模块就先执行哪个。

    在加载的模块内部,是根据方法的ASCII码的顺序执行测试用例。

    defaultTestLoader.discover()默认根据ASCII码的顺序加载测试用例。

     


     

    5.unittest_discover.py

    import unittest
    
    one_suite = unittest.defaultTestLoader.discover(".")
    one_runner = unittest.TextTestRunner()
    
    one_runner.run(one_suite)

    【知识点】

    def discover(self, start_dir, pattern='test*.py', top_level_dir=None):

    默认加载路径下以“test”开头的模块,所以测试用例的模块应当都是以test开头。

    .代表当前py文件所在的路径。

    也可以指定绝对路径:one_suite = unittest.defaultTestLoader.discover(r"C:UserszfyPycharmProjectsPython_unittest")

     


     

    6. 生成的log文件

    math_operation_result_log.txt

  • 相关阅读:
    如何在DBGrid中能支持多项记录的选择
    How to create a OnCellDblClick for Delphi's TDBGrid
    如何在DBGrid里实现Shift+“选择行”区间多选的功能!
    DBGrid中Shift多选
    代码校验工具 SublimeLinter 的安装与使用
    jquery压缩图片插件
    React 入门最好的实例-TodoList
    前端切图
    提升前端效率的方式
    单页面应用的痛点
  • 原文地址:https://www.cnblogs.com/jszfy/p/11192301.html
Copyright © 2020-2023  润新知