unittest测试框架

2022-03-20  本文已影响0人  波妞和宗介

一、使用规则

import unitest //在python2.1 之后都是直接作为标准模块放在了开发包中
创建一个测试类必须要继承unitest.TestCase的基类
测试方法(即测试用例名称)必须要以test开头,否则该用例不会被unitest识别到

二、重要概念

Test Case:最小的测试单元,即测试方法。
Test Suite:测试用例、测试套件或两者的集合,用于组装一组要运行的测试。使用TestSuite类来创建测试套件。
Test Runner:Test Runner是一个组件,用于协调测试的执行并向用户提供结果。
unittest提供了TextTestRunner类运行测试用例。

三、用例执行

1、执行顺序

unittest默认按照ASCII码的顺序加载测试用例(包括测试目录和测试文件、测试类、测试方法),
即它并不是按照测试用例的创建顺序从上到下执行的

unittest.main()  //通过main()方法来执行测试用例;
//按照测试类、方法的名称ASCII值大小的顺序执行用例

2、如何控制用例的执行顺序

方法一:通过testSuite类中的addTest()方法来加载用例

这里就是按照添加的顺序来执行了,不会按照ASCII码的顺序来加载用例
弊端:如果想要执行的用例非常将会添加很多,照成代码冗余

suit = unittest.TestSuite()
suit.addTest(cluster_op("test11_delete_cluster"))  
# 把这个类中需要执行的测试用例加进去,有多条再加即可
unittest.TextTestRunner().run(suit) #运行测试用例
方法二:通过discover方法执行多个用例
unitest.defaultTestLoader.discaover()方法可从文件中或者目录中查找多个符合规则的测试用例
discover(start_dir, pattern='Test*.py', top_level_dir=None)
------------
  start_dir:待测试的模块名/测试用例目录;
  discover()方法会自动根据这个参数查找测试用例文件
  pattern:测试用例文件名的匹配原则
  top_level_dir:测试模块的顶级目录,如果没有顶级目录,默认为None
------------

test_dir = 'D:\下载文件\qf-api-master\\test_suite'
suits = unittest.defaultTestLoader.discover(test_dir, pattern='api001*.py')
if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suits)

踩坑:如果想让discover()查找子目录下的测试文件,得将子目录标记为一个python模块(子目录下放__init__.py文件)
备注:发现了可以批量加载用例的方法testLoader()具体怎么用自己还没有实际用过,后续会详细介绍。可参考官方文档:https://docs.python.org/3.9/library/unittest.html?highlight=defaulttestloader#unittest.defaultTestLoader

四、执行结果

“.” 表示测试用例执行通过
“F”表示执行失败
“E” 表示执行错误
"s“表示运行跳过

五、用例跳过

import unittest


class Testaaa(unittest.TestCase):
    @unittest.skip(reason="no reason")  # 无理由的强制跳转,reason为原因
    def test_001(self):
        print("这是第一个测试用例")

    @unittest.skipIf(6 > 1, reason="如果6大于1")  # condition为true 的时候进行跳转
    def test_002(self):
        print("这是第二个测试用例")

    @unittest.skipUnless(6 == 1, reason="如果6==1=false ,则跳过")  # condition为false 的时候进行跳过
    def test_003(self):
        print("这是第三个测试用例")

    @unittest.expectedFailure  # 如果该测试用例执行失败,不统计到失败用例的条目中
    def test_004(self):
        assert 1 == 1
        print("这是第四个测试用例")
        

if __name__ == '__main__':
    unittest.main()

六、setUp&tearDown

七、用例参数化

case_name = load_yaml().get("cluster_op")
@parameterized.expand(case_name.get('test_01_create_cluster'))
//注意:在引用时注意yaml 文件中的测试数据要和测试函数中的传参一一对应

八、测试报告

def all_case():
    discover = unittest.defaultTestLoader.discover(case_path, pattern="api00*.py", top_level_dir=None)
    print(discover)
    return discover
if __name__ == "__main__":
    allc = all_case()
    desc = "xxxx自动化测试报告"
    result = BeautifulReport(allc)
    result.report(filename="xxxx自动化测试报告", description=desc, 
                  report_dir=os.path.join(os.getcwd(), "out"), log_path=os.path.join(os.getcwd(), "log"))
上一篇下一篇

猜你喜欢

热点阅读