构建测试套件
在实际项目中,随着项目进度的开展,测试类会越来越多,可是直到现在我 们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的,在 unittest中可以通过测试套件来解决该问题。
测试套件(Test Suite)是由多个测试用例(Test Case)组成的,当然也 可以由多个子测试套件组成
在unittest中,把测试用例加载到测试套件的方式有如下方法:(推荐方式六)
方式一、用unittest.TestSuite()实例化测试套件对象后,内部的addTest()方法对测试类内部的测试案例进行逐一添加。
注:使用addTest()方法,不是以test开头的用例也可以执行
代码示例:
# 1,一条一条添加测试用例 import unittest class Test_Case(unittest.TestCase): def setUp(self): print("我是setup方法:进行测试前的初始化工作") def tearDown(self) -> None: # 表示该方法没有返回值 print("我是tearDown方法:执行测试后的清除工作") print("------------执行结束----------------") def test_aaa(self): print("我是case:test_aaa") def test_bbb(self): print("我是case:test_bbb") def ccc(self): print("我是case:ccc") # 测试套件 # 一条一条用例通过addTest方法添加 # 方法一: # if __name__ == '__main__': # suite = unittest.TestSuite() # 创建测试套件对象 # suite.addTest(test_case("test_bbb")) # addTest(类名(“方法名称”)) # suite.addTest(test_case("ccc")) # 不是以test开头的用例也可以执行 # unittest.main(defaultTest="suite") # 方法二: def suite(): suite = unittest.TestSuite() suite.addTest(Test_Case("test_bbb")) # addTest(类名(“方法名称”)) suite.addTest(Test_Case("ccc")) return suite if __name__ == '__main__': unittest.main(defaultTest="suite")
查看执行结果
方式二、用unittest.TestSuite()实例化测试套件对象后,内部的makeSuite()方法对整个测试类进行添加。
注:使用makeSuite()方法,不是以test开头的方法不会被添加进测试套件中
代码示例:
# 添加整个测试类 import unittest class Test_Case(unittest.TestCase): def setUp(self): print("我是setup方法:进行测试前的初始化工作") def tearDown(self) -> None: # 表示该方法没有返回值 print("我的tearDown方法:执行测试后的清除工作") print("------------执行结束----------------") def test_aaa(self): print("我的case:test_aaa") def test_bbb(self): print("我的case:test_bbb") def ccc(self): print("我的case:ccc") # 能否添加整个测试类? if __name__ == '__main__': # 注意:此时不是以test开头的方法不会被添加进测试套件中 # 注意:makeSuite 可能需要手动添加 suite = unittest.TestSuite(unittest.makeSuite(Test_Case)) # 里面是类名 unittest.main(defaultTest="suite")
查看执行结果
方式三、使用TestLoader()方法添加整个测试类
注:unittest.TestLoader().loadTestsFromTestCase() 不是以test开头的方法不会被执行
代码示例:
# 3,添加整个测试类 # unittest中提供一个TestLoader类用于自动创建一个测试类,并且把单个测试自动放入测试集中 # TestLoader 类会自动运行以test开头的测试方法 import unittest class Test_Case1(unittest.TestCase): def setUp(self): print("我是setup方法:进行测试前的初始化工作") def tearDown(self) -> None: # 表示该方法没有返回值 print("我是tearDown方法:执行测试后的清除工作") print("------------执行结束----------------") def test_aaa(self): print("我是case1:test_aaa") def test_bbb(self): print("我是case1:test_bbb") def ccc(self): print("我是case1:ccc") class Test_Case2(unittest.TestCase): def setUp(self): print("我是setup方法:进行测试前的初始化工作") def tearDown(self) -> None: # 表示该方法没有返回值 print("我是tearDown方法:执行测试后的清除工作") print("------------执行结束----------------") def test_aaa(self): print("我是case2:test_aaa") def test_bbb(self): print("我是case2:test_bbb") def test_ccc(self): print("我是case2:test_ccc") if __name__ == "__main__": suite = unittest.TestLoader().loadTestsFromTestCase(Test_Case1) # 填 类名 unittest.main(defaultTest='suite')
查看执行结果
方式四、添加整个模块下所有的测试类
注:unittest.TestLoader().loadTestsFromName() 不是以test开头的方法不执行
代码示例:
# 4,添加整个模块下所有的测试类 import unittest class Test_Case1(unittest.TestCase): def setUp(self): print("我是setup方法:进行测试前的初始化工作") def tearDown(self) -> None: # 表示该方法没有返回值 print("我的tearDown方法:执行测试后的清除工作") print("------------执行结束----------------") def test_aaa(self): print("我是case1:test_aaa") def test_bbb(self): print("我是case1:test_bbb") def ccc(self): print("我是case1:test_ccc") class Test_Case2(unittest.TestCase): def setUp(self): print("我是setup方法:进行测试前的初始化工作") def tearDown(self) -> None: # 表示该方法没有返回值 print("我的tearDown方法:执行测试后的清除工作") print("------------执行结束----------------") def test_aaa(self): print("我是case2:test_aaa") def test_bbb(self): print("我是case2:test_bbb") def test_ccc(self): print("我是case2:test_ccc") if __name__ == "__main__": # 通过TestLoader中字符串的方法加载用例;不以test开头的方法不执行 # 1,增加一个测试用例 模块名称.类名.方法名称 # suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1.test_aaa") # 2,增加整个测试类 # suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1") # 3,增加整个.py模块下所有的测试类 suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4") # 填 py文件名 unittest.main(defaultTest='suite')
查看执行结果
方式五、将多个子测试集进行整合到一个大的测试套件中
代码示例:
# 将多个子测试集进行整合到一个大的测试套件中 import unittest from unittest框架 import demo11_测试套件4 # 导入其他模块 from unittest框架 import demo08_测试套件1 # 导入其他模块 # 依次创建多个套件 # 1,单个用例套件 suite01 = unittest.TestLoader().loadTestsFromName('demo08_测试套件1.Test_Case.test_aaa') # 2,整个类 suite02 = unittest.TestLoader().loadTestsFromName("demo08_测试套件1.Test_Case") # 3,整个.py模块 suite03 = unittest.TestLoader().loadTestsFromName("demo11_测试套件4") main_suite = unittest.TestSuite() # 主套件 main_suite.addTest(suite01) # 添加子套件到主套件中 main_suite.addTest(suite02) main_suite.addTest(suite03) unittest.main(defaultTest="main_suite")
查看执行结果
方式六、使用discover()来实现添加执行整个目录下所有的测试用例 (=====推荐=====)
当测试用例存放在多个不同子目录下,我们用之前的把用例加载到测试集合中的方 式还是不太方便,需要不断的去导入和添加测试用例模块,此时可以通过discover()方法 来实现
方法如下:
discover(start_dir,pattern ='test *.py', top_level_dir = None)
start_dir:要测试的模块名或测试用例目录
pattern="test*.py":表示用例文件名的匹配原则,例子中匹配文件名为以"test"开头的".py"文件,星号"*"表示任意多个字符;
top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None。
该方法通过从指定的开始目录递归到子目录中查找所有测试模块,并返回包含它们的TestSuite对象,只要与模式匹配测试文件和可导入的模块名称才会被加载。
如果一个测试文件的名称符合pattern,会自动查找该文件中派生自TestCase 的类包含的 test 开头的方法作为测试方法
代码示例:
# 使用discover()来实现添加执行整个目录下所有的测试用例 import os import unittest import HTMLTestRunner import time # 获取当前路径 curren_path = os.path.dirname(__file__) # 获取测试用例目录的路径 case_path = os.path.join(curren_path,"all_case") # 从当前路径回到上一层路径 # case_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 匹配测试用例路径下的所有的测试方法 discover = unittest.defaultTestLoader.discover(start_dir=case_path, # 用例路径 pattern="*_case*.py", top_level_dir=None) # 文件类型 # 创建主套件 main_suite = unittest.TestSuite() # 把测试用例路径添加到主套件中 main_suite.addTest(discover) # 执行主套件里的测试用例 unittest.main(defaultTest="main_suite")
查看执行结果
总结
如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面
自动化测试相关教程推荐:
2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili
2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili
测试开发相关教程推荐
2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili
postman/jmeter/fiddler测试工具类教程推荐
讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili
2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili
2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili
总结:
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!