Unittest单元测试框架之unittest构建测试套件

构建测试套件

在实际项目中,随着项目进度的开展,测试类会越来越多,可是直到现在我 们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的,在 unittest中可以通过测试套件来解决该问题。

测试套件(Test Suite)是由多个测试用例(Test Case)组成的,当然也 可以由多个子测试套件组成

在unittest中,把测试用例加载到测试套件的方式有如下方法:(推荐方式六)

方式一、用unittest.TestSuite()实例化测试套件对象后,内部的addTest()方法对测试类内部的测试案例进行逐一添加。

注:使用addTest()方法,不是以test开头的用例也可以执行

代码示例:

 
  1. # 1,一条一条添加测试用例

  2. import unittest

  3. class Test_Case(unittest.TestCase):

  4. def setUp(self):

  5. print("我是setup方法:进行测试前的初始化工作")

  6. def tearDown(self) -> None: # 表示该方法没有返回值

  7. print("我是tearDown方法:执行测试后的清除工作")

  8. print("------------执行结束----------------")

  9. def test_aaa(self):

  10. print("我是case:test_aaa")

  11. def test_bbb(self):

  12. print("我是case:test_bbb")

  13. def ccc(self):

  14. print("我是case:ccc")

  15. # 测试套件

  16. # 一条一条用例通过addTest方法添加

  17. # 方法一:

  18. # if __name__ == '__main__':

  19. # suite = unittest.TestSuite() # 创建测试套件对象

  20. # suite.addTest(test_case("test_bbb")) # addTest(类名(“方法名称”))

  21. # suite.addTest(test_case("ccc")) # 不是以test开头的用例也可以执行

  22. # unittest.main(defaultTest="suite")

  23. # 方法二:

  24. def suite():

  25. suite = unittest.TestSuite()

  26. suite.addTest(Test_Case("test_bbb")) # addTest(类名(“方法名称”))

  27. suite.addTest(Test_Case("ccc"))

  28. return suite

  29. if __name__ == '__main__':

  30. unittest.main(defaultTest="suite")

查看执行结果

方式二、用unittest.TestSuite()实例化测试套件对象后,内部的makeSuite()方法对整个测试类进行添加。

注:使用makeSuite()方法,不是以test开头的方法不会被添加进测试套件中

代码示例:

 
  1. # 添加整个测试类

  2. import unittest

  3. class Test_Case(unittest.TestCase):

  4. def setUp(self):

  5. print("我是setup方法:进行测试前的初始化工作")

  6. def tearDown(self) -> None: # 表示该方法没有返回值

  7. print("我的tearDown方法:执行测试后的清除工作")

  8. print("------------执行结束----------------")

  9. def test_aaa(self):

  10. print("我的case:test_aaa")

  11. def test_bbb(self):

  12. print("我的case:test_bbb")

  13. def ccc(self):

  14. print("我的case:ccc")

  15. # 能否添加整个测试类?

  16. if __name__ == '__main__':

  17. # 注意:此时不是以test开头的方法不会被添加进测试套件中

  18. # 注意:makeSuite 可能需要手动添加

  19. suite = unittest.TestSuite(unittest.makeSuite(Test_Case)) # 里面是类名

  20. unittest.main(defaultTest="suite")

查看执行结果

方式三、使用TestLoader()方法添加整个测试类

注:unittest.TestLoader().loadTestsFromTestCase() 不是以test开头的方法不会被执行

代码示例:

 
  1. # 3,添加整个测试类

  2. # unittest中提供一个TestLoader类用于自动创建一个测试类,并且把单个测试自动放入测试集中

  3. # TestLoader 类会自动运行以test开头的测试方法

  4. import unittest

  5. class Test_Case1(unittest.TestCase):

  6. def setUp(self):

  7. print("我是setup方法:进行测试前的初始化工作")

  8. def tearDown(self) -> None: # 表示该方法没有返回值

  9. print("我是tearDown方法:执行测试后的清除工作")

  10. print("------------执行结束----------------")

  11. def test_aaa(self):

  12. print("我是case1:test_aaa")

  13. def test_bbb(self):

  14. print("我是case1:test_bbb")

  15. def ccc(self):

  16. print("我是case1:ccc")

  17. class Test_Case2(unittest.TestCase):

  18. def setUp(self):

  19. print("我是setup方法:进行测试前的初始化工作")

  20. def tearDown(self) -> None: # 表示该方法没有返回值

  21. print("我是tearDown方法:执行测试后的清除工作")

  22. print("------------执行结束----------------")

  23. def test_aaa(self):

  24. print("我是case2:test_aaa")

  25. def test_bbb(self):

  26. print("我是case2:test_bbb")

  27. def test_ccc(self):

  28. print("我是case2:test_ccc")

  29. if __name__ == "__main__":

  30. suite = unittest.TestLoader().loadTestsFromTestCase(Test_Case1) # 填 类名

  31. unittest.main(defaultTest='suite')

查看执行结果

方式四、添加整个模块下所有的测试类

注:unittest.TestLoader().loadTestsFromName() 不是以test开头的方法不执行

代码示例:

 
  1. # 4,添加整个模块下所有的测试类

  2. import unittest

  3. class Test_Case1(unittest.TestCase):

  4. def setUp(self):

  5. print("我是setup方法:进行测试前的初始化工作")

  6. def tearDown(self) -> None: # 表示该方法没有返回值

  7. print("我的tearDown方法:执行测试后的清除工作")

  8. print("------------执行结束----------------")

  9. def test_aaa(self):

  10. print("我是case1:test_aaa")

  11. def test_bbb(self):

  12. print("我是case1:test_bbb")

  13. def ccc(self):

  14. print("我是case1:test_ccc")

  15. class Test_Case2(unittest.TestCase):

  16. def setUp(self):

  17. print("我是setup方法:进行测试前的初始化工作")

  18. def tearDown(self) -> None: # 表示该方法没有返回值

  19. print("我的tearDown方法:执行测试后的清除工作")

  20. print("------------执行结束----------------")

  21. def test_aaa(self):

  22. print("我是case2:test_aaa")

  23. def test_bbb(self):

  24. print("我是case2:test_bbb")

  25. def test_ccc(self):

  26. print("我是case2:test_ccc")

  27. if __name__ == "__main__":

  28. # 通过TestLoader中字符串的方法加载用例;不以test开头的方法不执行

  29. # 1,增加一个测试用例 模块名称.类名.方法名称

  30. # suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1.test_aaa")

  31. # 2,增加整个测试类

  32. # suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1")

  33. # 3,增加整个.py模块下所有的测试类

  34. suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4") # 填 py文件名

  35. unittest.main(defaultTest='suite')

查看执行结果

方式五、将多个子测试集进行整合到一个大的测试套件中

代码示例:

 
  1. # 将多个子测试集进行整合到一个大的测试套件中

  2. import unittest

  3. from unittest框架 import demo11_测试套件4 # 导入其他模块

  4. from unittest框架 import demo08_测试套件1 # 导入其他模块

  5. # 依次创建多个套件

  6. # 1,单个用例套件

  7. suite01 = unittest.TestLoader().loadTestsFromName('demo08_测试套件1.Test_Case.test_aaa')

  8. # 2,整个类

  9. suite02 = unittest.TestLoader().loadTestsFromName("demo08_测试套件1.Test_Case")

  10. # 3,整个.py模块

  11. suite03 = unittest.TestLoader().loadTestsFromName("demo11_测试套件4")

  12. main_suite = unittest.TestSuite() # 主套件

  13. main_suite.addTest(suite01) # 添加子套件到主套件中

  14. main_suite.addTest(suite02)

  15. main_suite.addTest(suite03)

  16. 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 开头的方法作为测试方法

代码示例:

 
  1. # 使用discover()来实现添加执行整个目录下所有的测试用例

  2. import os

  3. import unittest

  4. import HTMLTestRunner

  5. import time

  6. # 获取当前路径

  7. curren_path = os.path.dirname(__file__)

  8. # 获取测试用例目录的路径

  9. case_path = os.path.join(curren_path,"all_case")

  10. # 从当前路径回到上一层路径

  11. # case_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))

  12. # 匹配测试用例路径下的所有的测试方法

  13. discover = unittest.defaultTestLoader.discover(start_dir=case_path, # 用例路径

  14. pattern="*_case*.py",

  15. top_level_dir=None) # 文件类型

  16. # 创建主套件

  17. main_suite = unittest.TestSuite()

  18. # 把测试用例路径添加到主套件中

  19. main_suite.addTest(discover)

  20. # 执行主套件里的测试用例

  21. unittest.main(defaultTest="main_suite")

查看执行结果

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

 

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值