zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    django页面分类和继承
    django前端从数据库获取请求参数
    pycharm配置django工程
    django 应用各个py文件代码
    CF. 1428G2. Lucky Numbers(背包DP 二进制优化 贪心)
    HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)
    小米邀请赛 决赛. B. Rikka with Maximum Segment Sum(分治 决策单调性)
    区间树 学习笔记
    CF GYM. 102861M. Machine Gun(主席树)
    2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) (B, D, G, H)
  • 原文地址:https://www.cnblogs.com/jszfy/p/11192301.html
Copyright © 2011-2022 走看看