unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。今天初步总结一下unittest的 用法。
测试一段程序是否有错误,我们既可以采用普通的测试方法,也可以采用unittest测试框架
class Count(): def __init__(self,a,b): self.a=a self.b=b def add(self): return self.a+self.b if __name__=="__main__": c=Count(2,3) print(c.add())
首先用普通方法进行测试
from count import Count class TestCount(): def test_add(self): try: c = Count(2, 3) sum = c.add() assert (sum == 6), 'The result is not correct' except AssertionError as e: print(e) # e 是一个变量,记录了异常的类,可以打印出错误信息 else: print("test pass") if __name__=="__main__": a = TestCount() a.test_add()
采用python内置的断言方法,然后与异常处理相结合
现在再使用unittest测试框架进行测试
import unittest from count import Count class TestCount(unittest.TestCase): def setUp(self): print("test case starts") def tearDown(self): print("test case ends") def test_add(self): c=Count(2,4) sum=c.add() self.assertEqual(sum,7) def test_add2(self): c = Count(2, 4) sum=c.add() self.assertEqual(sum,6) if __name__=="__main__": suite=unittest.TestSuite() suite.addTest(TestCount("test_add")) # TestCount 是测试类名 suite.addTest(TestCount("test_add2")) # test__add是测试类中测试用例名,有几个测试用例就添加几个 runner=unittest.TextTestRunner() runner.run(suite)
其中if __name__=="__main__":中的代码可以用下面代码代替
if __name__=="__main__": unittest.main()
unittest自带的main方法可以执行测试类中所有以test开头的用例
unittest执行测试用例,总会自动执行setUp和tearDown方法,setUp方法完成测试用例一些初始工作,如开启浏览器,teardown方法完成用例执行完的收尾工作,如关闭浏览器
unittest测试类中用例名总是以test开头
unittest自身带有一系列的断言方法:
assertEqual(a,b,[msg='测试失败时打印的信息']) 判断a,b是否相等
assertNotEqual(a,b,[msg='测试失败时打印的信息'])
assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True
assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False
assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中
assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中
如果有大量的测试用例,存在于不同的文件中,如果要同时执行这些文件,可以通过discover方法实现,这样右分为两种情况:1.文件都在同级目录下2.含有子级目录
1.文件都在同级目录下
import unittest if __name__=="__main__": testdir = r"F:\python视频\python_file\unit_test" # testdir是测试文件根目录 discover = unittest.defaultTestLoader.discover(testdir, pattern="test_un*.py", top_level_dir=None) runner=unittest.TextTestRunner() runner.run(discover)
2.含有子级目录
代码同上,只是在每个子级目录中新建一个__init__.py文件
多个测试用例同时执行,unittest如何排序,确定先执行哪一个
unittest 通过比较用例名的ascll码,哪个用例名的ascll码在前,先执行,否则后执行
import unittest from count import Count class TestCount(unittest.TestCase): def setUp(self): print("test case starts") def tearDown(self): print("test case ends") def test_add(self): print("test_add") c=Count(2,4) sum=c.add() self.assertEqual(sum,6) def test_bdd(self): print("test_bdd") c = Count(2, 4) sum=c.add() self.assertEqual(sum,6) if __name__=="__main__": unittest.main()
结果