unittest 单元测试:
1,单元测试是指对软件中最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来讲,要根据实际情况去判定其具体含义。
2,unitest=TestCase + TestResult 执行 + 结果
3,首先使用import unitest
4,测试的类都是继承于TestCase类
5, setUp()测试前的初始化工作;tearDown()测试后的清除工作(在每个测试方法运行时被调用)
注意:
1,所有类中方法入参为self,定义方法的变量也要“self.变量”(熟悉python的写法其实就是类变量的调用)
2,定义测试用例,以“test”开头命名的方法,方法的入参为self
3,unitest.main()方法会搜索该模块下所有的以test开头的测试用例方法,并且自动执行它们
4,成功会输出,失败是F
先看一个例子:
# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/7 21:15' import unittest class UserTestCase(unittest.TestCase): def setUp(self): print("--setup--") def tearDown(self): print("--tearDown--") def test_name(self): print('--name--') if __name__ == '__main__': unittest.main()
运行的结果为:
. --setup-- ---------------------------------------------------------------------- --name-- Ran 1 test in 0.000s --tearDown-- OK
可以看到的顺序是先执行setup方法之后,再去执行自定义的测试方法,最终使用tearDown来进行收尾
再看补充,因为在unitest中必须以test_开头来定义方法,因此新增几个方法。
# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/7 21:15' import unittest class UserTestCase(unittest.TestCase): def setUp(self): print("--setup--") def tearDown(self): print("--tearDown--") def test_name(self): print('--name--') def test_isupper(self): print('--upper') def test_age(self): print('--age') if __name__ == '__main__': unittest.main()
执行的结果为:
--setup-- ... --age ---------------------------------------------------------------------- --tearDown-- Ran 3 tests in 0.000s --setup-- --upper OK --tearDown-- --setup-- --name-- --tearDown--
也就是说,每一个自定义方法开始会调用setup,然后调用自定义方法,然后调用tearDown方法
# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/7 21:15' import unittest class UserTestCase(unittest.TestCase): def setUp(self): print("--setup--") def tearDown(self): print("--tearDown--") def test_name(self): self.assertEqual('foo'.upper(), "FoO", msg='转换不对') # msg=是报错之后的提示信息 print('--name--') def test_isupper(self): print('--upper') def test_age(self): print('--age') if __name__ == '__main__': unittest.main()
结果如下:
--setup-- ..F --age ====================================================================== --tearDown-- FAIL: test_name (__main__.UserTestCase) --setup-- ---------------------------------------------------------------------- --upper Traceback (most recent call last): --tearDown-- File "C:/Users/lenovo/Desktop/新建文件夹/自动化测试selenium/unitest_import.py", line 16, in test_name --setup-- self.assertEqual('foo'.upper(), "FoO", msg='转换不对') # msg=是报错之后的提示信息 --tearDown-- AssertionError: 'FOO' != 'FoO' - FOO ? ^ + FoO ? ^ : 转换不对 ---------------------------------------------------------------------- Ran 3 tests in 0.000s FAILED (failures=1)
三个test失败1个,报错信息为转换不对,总体结论为..F
测试套件TestSuite介绍:
需求:
1,利用unitest执行流程测试而非单元测试
2,控制unitest的执行顺序
① unitest.TestSuite()类来表示一个测试用例集
1,用来确定测试用例的执行顺序,决定先后执行
2,如果一个class中有四个test开头的方法,则加载到suite中则有四个测试用例
3, 由TestLoder加载TestCase到TestSuite
4, verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告
默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”
② TextTestRunner() 文本测试用例运行器
③ run()方法是运行测试套件的测试用例,入参为suite测试套件
# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/10 21:37' import unittest class UserTestCase(unittest.TestCase): def setUp(self): self.age = 25 self.name = "呦西,开始了" print('setup method------') def tearDown(self): print("--tearDown method------") def test_one(self): print("test_one 周先生来了") self.assertEqual(self.name, "呦西,开始了", msg="口令不对!") def test_two(self): print('test_two') self.assertFalse("ZL".isupper(), msg="不是大写") def test_three(self): print('test_three') self.assertEqual(self.age, 25) def test_four(self): print('test_four') self.assertEqual(self.age, 25) if __name__ == '__main__': suite = unittest.TestSuite() suite.addTest(UserTestCase("test_one")) # 测试类名加方法 # verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告 默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F” runner = unittest.TextTestRunner(verbosity=0) runner.run(suite)
运行结果如下:
setup method------ ---------------------------------------------------------------------- Ran 1 test in 0.000s test_one 周先生来了 --tearDown method------ OK
如果增加多个呢?
suite.addTest(UserTestCase("test_four")) suite.addTest(UserTestCase("test_two")) suite.addTest(UserTestCase("test_three"))
注意顺序,这个是指定的顺序添加之后,结果如下:
setup method------ test_one 周先生来了 --tearDown method------ setup method------ test_four --tearDown method------ setup method------ test_two --tearDown method------ setup method------ test_three --tearDown method------ ---------------------------------------------------------------------- Ran 4 tests in 0.001s OK
完整代码如下:
# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/10 21:37' import unittest class UserTestCase(unittest.TestCase): def setUp(self): self.age = 25 self.name = "呦西,开始了" print('setup method------') def tearDown(self): print("--tearDown method------") def test_one(self): print("test_one 周先生来了") self.assertEqual(self.name, "呦西,开始了", msg="口令不对!") def test_two(self): print('test_two') self.assertFalse("zl".isupper(), msg="不是大写") def test_three(self): print('test_three') self.assertEqual(self.age, 25) def test_four(self): print('test_four') self.assertEqual(self.age, 25) if __name__ == '__main__': suite = unittest.TestSuite() suite.addTest(UserTestCase("test_one")) # 测试类名加方法 suite.addTest(UserTestCase("test_four")) suite.addTest(UserTestCase("test_two")) suite.addTest(UserTestCase("test_three")) # verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告 默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F” runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)