Uniitest是python内置的标准类库,它的API和java的junit很相似。---单元测试(pytest是python第三方的测试框架,更灵活)
unnitest单元测试讲解:
单元测试方法:
1)语句覆盖 设计的用例执行完我们所有的代码语句 比较薄弱(如:and条件语句,如果写成了or,测试的例子该条语句也能通过,测试就发现不了该问题)
2)判断覆盖 关注整个判断语句(true or false),不关心判断语句内是否有多个条件(也会有漏洞)
3)条件覆盖 关注整个判断语句的同时也关注每个语句里面的条件(测试用例庞大)
4)路径覆盖 通过流程图去保证每条路径都覆盖到
#单元测试框架 import unittest class myunitest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("1111") @classmethod def tearDownClass(cls) -> None: print("22222") def setUp(self) -> None: print("开始前准备") def tearDown(self) -> None: print("结束后操作") def test_01(self): print("这是case1") r=2 self.assertEqual(2,r,"判断相等") def test_02(self): print("这是case2") def main(self): unittest.main
setupclass和teardown作用域是整个类,先执行setup,再执行所有用例,最后执行teardown
setup和teardown作用域是单挑case,先执行setup,然后执行case01,再执行teardown。然后重复再执行setup,执行case02,再执行teardown...
如何设置跳过某条用例(方法1):在那条用例上面加@unnitest.skip,代码示例:
#单元测试框架 import unittest class myunitest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第一次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第一次结束后操作") @unittest.skipIf(1+1==2,"case0跳过") def test_01(self): print("这是case1") r=2 self.assertEqual(2,r,"判断相等") def test_02(self): print("这是case2") def main(self): unittest.main
如何设置跳过某条用例(方法2):创建测试套件,将要执行的用例放到测试套件中,然后去调用unnitest.TextTestrunner去run测试套件:
#单元测试框架 import unittest class myunitest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第一次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第一次结束后操作") def test_01(self): print("这是case1") r=2 self.assertEqual(2,r,"判断相等") def test_02(self): print("这是case2") class my2(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第二次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第二次结束后操作") def test_03(self): print("这是case03") if __name__ == '__main__': suite=unittest.TestSuite() suite.addTest(myunitest("test_01")) suite.addTest(my2("test_03")) unittest.TextTestRunner().run(suite)
如何设置跳过某条用例(方法3):选择指定类中的用例执行(将要执行的类中的用例加载出来,放到测试套件中,再去run这些用例)。代码示例:
#单元测试框架 import unittest #测试用例(类1) class myunitest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第一次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第一次结束后操作") def test_01(self): print("这是case1") r=2 self.assertEqual(2,r,"判断相等") def test_02(self): print("这是case2") #测试用例(类2) class my2(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第二次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第二次结束后操作") def test_03(self): print("这是case03") #测试用例(类3) class my3(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第三次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第三次结束后操作") def test_04(self): print("这是case4") if __name__ == '__main__': suite1=unittest.TestLoader().loadTestsFromTestCase(myunitest) suite2=unittest.TestLoader().loadTestsFromTestCase(my3) suiteall=unittest.TestSuite([suite1,suite2]) unittest.TextTestRunner().run(suiteall)
pytest还可以以加载路径下用例的方式,去执行想要执行的用例(使用unnitest.defaultTestLoader.discover(test_dir,patter="文件关键字")。代码示例如下:
#单元测试框架 import unittest import os class myunitest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第一次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第一次结束后操作") def test_01(self): print("这是case1") r=2 self.assertEqual(2,r,"判断相等") def test_02(self): print("这是case2") class my2(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第二次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第二次结束后操作") def test_03(self): print("这是case03") class my3(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("第三次开始前准备") @classmethod def tearDownClass(cls) -> None: print("第三次结束后操作") def test_04(self): print("这是case4") if __name__ == '__main__': print(os.path) discover=unittest.defaultTestLoader.discover("./","test_*.py") unittest.TextTestRunner().run(discover)