系统学习Python——单元测试unittest:执行测试用例(unit test python)

网友投稿 298 2022-08-30


系统学习Python——单元测试unittest:执行测试用例(unit test python)

​​unittest​​框架给我们准备了多种执行测试用例的方法。这里我们来学习一些经常用到的操作。

脚本自测

​​unittest.main​​会自动收集当前文件中所有的测试用例来执行:

import unittestblog_name = 'hy592070616'class MyTestClass(unittest.TestCase): @classmethod def setUpClass(cls): print('setUpClass') def setUp(self): self.blog_name = 'hy592070616' print('setUp') def test_first(self): blog_name_ref = blog_name + '--machine learning' self.assertEqual(blog_name_ref, 'hy592070616--machine learning') def tearDown(self): print('tearDown') @classmethod def tearDownClass(cls): print('tearDownClass')if __name__ == '__main__': unittest.main()

​​if __name__ == '__main__':​​​的​​name​​​和​​main​​​前后都有两个下划线。我们可以在PyCharm中直接输入​​main​​来快速输入这行代码。​​unittest.main()​​​,​​main​​后面需要加上括号,否则无法正常执行。​​unittest.main()​​,是对上方脚本进行自测,不影响其他文件的调用。

通过class构造测试集合

我们可以通过​​unittest.TestLoader().loadTestsFromTestCase​​​加载某个​​class​​​下面的所有用例。这个是我们的一个测试用例文件​​testclass.py​​​,包含了4个测试用例和2个​​class​​:

# testclass.pyimport unittestclass MyTestClassOne(unittest.TestCase): @classmethod def setUpClass(cls): print('setUpClass') def setUp(self): print('setUp') def test_first(self): print('test_first') self.assertEqual(0, 0) def test_second(self): print('test_second') self.assertEqual(0, 0) def tearDown(self): print('tearDown') @classmethod def tearDownClass(cls): print('tearDownClass')class MyTestClassTwo(unittest.TestCase): @classmethod def setUpClass(cls): print('setUpClass') def setUp(self): print('setUp') def test_third(self): print('test_third') self.assertEqual(0, 0) def test_fourth(self): print('test_fourth') self.assertEqual(0, 0) def tearDown(self): print('tearDown') @classmethod def tearDownClass(cls): print('tearDownClass')if __name__ == '__main__': unittest.main()

后续我们在其他的Python文件中导入​​testclass.py​​:

import unittestfrom learning_unittest import testclassif __name__ == '__main__': testcase = unittest.TestLoader().loadTestsFromTestCase(testclass.MyTestClassOne) suite = unittest.TestSuite([testcase]) unittest.TextTestRunner().run(suite)

运行结果如下:

Ran 2 tests in 0.000sOKsetUpClasssetUptest_firsttearDownsetUptest_secondtearDowntearDownClassProcess finished with exit code 0

上方代码先将​​testclass​​​文件中的内容通过​​import​​​导入,然后使用​​unittest​​​提供的​​unittest.TestLoader().loadTestsFromTestCase​​​方法传入​​testclass​​​文件中的​​class​​​,即​​MyTestClassOne​​​。接下来通过​​unittest.TestSuite([testcase])​​​组装测试用例集合。最后通过​​unittest.TextTestRunner​​​提供的​​run​​方法来执行组装好的集合。但如果:

# testclass.pyimport unittestclass MyTestClassOne(unittest.TestCase): @classmethod def setUpClass(cls): print('setUpClass') def setUp(self): print('setUp') def test_first(self): print('test_first') self.assertEqual(0, 0) def test_second(self): print('test_second') self.assertEqual(0, 0) def tearDown(self): print('tearDown') @classmethod def tearDownClass(cls): print('tearDownClass')class MyTestClassTwo(unittest.TestCase): @classmethod def setUpClass(cls): print('setUpClass') def setUp(self): print('setUp') def test_third(self): print('test_third') self.assertEqual(0, 0) def test_fourth(self): print('test_fourth') self.assertEqual(0, 0) def tearDown(self): print('tearDown') @classmethod def tearDownClass(cls): print('tearDownClass')if __name__ == '__main__': testcase = unittest.TestLoader().loadTestsFromTestCase(MyTestClassOne) suite = unittest.TestSuite([testcase]) unittest.TextTestRunner().run(suite)

即将组装​​testcase​​语句写入​​testclass​​文件中,则运行​​testclass​​文件会执行​​testclass​​文件中的所有​​class​​,而不是只执行​​MyTestClassOne​​:

============================= test session starts =============================platform win32 -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0rootdir: D:\LearningPython\learning_unittest, inifile:collected 4 itemstestclass.py setUpClass.setUptest_firsttearDown.setUptest_secondtearDowntearDownClasssetUpClass.setUptest_fourthtearDown.setUptest_thirdtearDowntearDownClass========================== 4 passed in 0.03 seconds ===========================Process finished with exit code 0

通过​​addTest​​构建测试集合

我们可以通过​​addTest​​​将某个​​class​​下面的测试用例添加到集合,然后执行测试集合:

import unittestfrom learning_unittest import testclassif __name__ == '__main__': suite = unittest.TestSuite() suite.addTest(testclass.MyTestClassOne('test_first')) suite.addTest(testclass.MyTestClassTwo('test_third')) unittest.TextTestRunner().run(suite)

上述代码从​​MyTestClassOne​​​类中取了​​test_first​​​测试用例,从​​MyTestClassTwo​​​类中取了​​test_third​​测试用例,两者组成了一个测试用例集合,运行结果如下:

Ran 2 tests in 0.000sOKsetUpClasssetUptest_firsttearDowntearDownClasssetUpClasssetUptest_thirdtearDowntearDownClassProcess finished with exit code 0

通过​​discover​​构建测试集合

我们还可以通过​​unittest.TestLoader().discover('.')​​​在指定目录中寻找符合条件的测试用例,从而组成测试集合。关于​​discover​​的用法请参考代码:

import unittestfrom learning_unittest import testclassif __name__ == '__main__': suite = unittest.TestLoader().discover('.') unittest.TextTestRunner(verbosity=2).run(suite)

这里的​​discover​​​,我们传递的目录是一个​​‘.’​​​,代表文件所在目录。执行该文件的话,就会从该文件所在目录中去寻找所有符合条件的测试用例。​​discover​​的用法我们会在后续的文章再次讲解。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python3操作BeautifulSoup基础语法(python安装beautifulsoup4库)
下一篇:深入理解框架背后的原理及源码分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~