python之unittest
1.单元测试框架unittest

unittest中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
(1)一个TestCase的实例就是一个测试用例。测试用例就是指一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试
后环境的还原(tearDown)。单元测试(unittest)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
(2)测试套件,将多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
(3)TestLoader是用来加载TestCase到TestSuite中的。
(4)TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法
(5)测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在
TextTestResult中,整个过程集成在unittest.main模块中。
2.TestCase详解
写一个类继承TestCase,这就是一个测试类,在这个类里面,可以写多个测试方法,但必须以test开头,否则会跳过,通常写法test_add_check(self),
这个类还包含一个setUp和tearDown方法,在执行每个测试方法的时候都会执行一次。
如果想要在所有case执行之前准备一次环境,并在所有case执行结束之后再清理环境,我们可以用setUpClass()与tearDownClass(),必须加上@classmethod装饰器。
常用的断言:
assertEqual 和 assertNotEqual
assertEqual:如两个值相等,则pass
assertNotEqual:如两个值不相等,则pass
使用方法:
assertEqual(first,second,msg)其中first与second进行比较,如果相等则通过;msg为失败时打印的信息,选填;断言assertNotEqual反着用就可以了。
assertTrue和assertFalse
assertTrue:判断bool值为True,则pass
assertFalse:判断bool值为False,则Pass
使用方法:
assertTrue(expr,msg)其中express输入相应表达式,如果表达式为真,则pass;msg选填;断言assertFalse如果表达式为假,则pass
assertIsNone和assertIsNotNone
assertIsNone:不存在,则pass
assertIsNotNone:存在,则pass
使用方法:
assertIsNone(obj,msg)检查某个元素是否存在
常用:
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIs(a, b) a is b 2.7 assertIsNot(a, b) a is not b 2.7 assertIsNone(x) x is None 2.7 assertIsNotNone(x) x is not None 2.7 assertIn(a, b) a in b 2.7 assertNotIn(a, b) a not in b 2.7 assertIsInstance(a, b) isinstance(a, b) 2.7 assertNotIsInstance(a, b) not isinstance(a, b) 2.7
不常用:
assertAlmostEqual(a, b) round(a-b, 7) == 0 assertNotAlmostEqual(a, b) round(a-b, 7) != 0 assertGreater(a, b) a > b 2.7 assertGreaterEqual(a, b) a >= b 2.7 assertLess(a, b) a < b 2.7 assertLessEqual(a, b) a <= b 2.7 assertRegexpMatches(s, re) regex.search(s) 2.7 assertNotRegexpMatches(s, re) not regex.search(s) 2.7 assertItemsEqual(a, b) sorted(a) == sorted(b) and works with unhashable objs 2.7 assertDictContainsSubset(a, b) all the key/value pairs in a exist in b 2.7 assertMultiLineEqual(a, b) strings 2.7 assertSequenceEqual(a, b) sequences 2.7 assertListEqual(a, b) lists 2.7 assertTupleEqual(a, b) tuples 2.7 assertSetEqual(a, b) sets or frozensets 2.7 assertDictEqual(a, b) dicts 2.7 assertMultiLineEqual(a, b) strings 2.7 assertSequenceEqual(a, b) sequences 2.7 assertListEqual(a, b) lists 2.7 assertTupleEqual(a, b) tuples 2.7 assertSetEqual(a, b) sets or frozensets 2.7assertDictEqual(a, b) dicts 2.7
输出说明:
1.第一行给出了每一个用例执行的结果的标识,成功是.,失败是F,出错是E,跳过是S
2、每个测试方法均以test开头,否则不能被unittest识别
3、在uniitest.main()中加verbosity参数可以控制输出的错误报告的详细程度,默认是1,如果设为0, 则不输出每一用例的执行结果,即没有上面的结果中
的第1行,如果设为2,则输出详细的执行结果。
执行结果的三种方法:
方法一:使用unittest.main(),该方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。执行方法的默认顺序是:根据ASCII码的顺序加载
测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。;
方法二:构造测试集,执行测试用例,执行顺序是根据addTest的顺序;
suite = unittest.TestSuite()
suite.addTest(Test('test_case1'))
suite.addTest(Test('test_case2'))
runner = unittest.TextTestRunner()
runner.run(suite)
方法三:通过扫描文件
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
runner = unittest.TextTestRunner()
runner.run(discover)
将结果写入文件:
with open('report.txt', 'a') as f: runner = unittest.TextTestRunner(stream=f, verbosity=1) runner.run(suite)
3.unittest参数化
通过第三方模块nose-parameterized能直接使用
pip install nose-parameterized
import unittest from nose_parameterized import parameterized #导入这个模块 class My(unittest.TestCase): @parameterized.expand( [ (1,2,3), (1,2,3), (1,2,3), (1,2,4) ] )#使用它提供的装饰器装饰这个函数,把咱们写的这4个数据放到这个list里面 def test1(self,a,b,c): self.assertEqual(a+b,c) if __name__=='__main__': unittest.main()
通过使用parameterized.expand()装饰器就能把所有参数测试一边
4.跳过某个case
(1)skip装饰器
skip装饰器一共有三个
unittest.skip(reason):无条件跳过
unittest.skipIf(condition, reason):当condition为True时跳过
unittest.skipUnless(condition, reason):当condition为False时跳过
(2)在test开头的测试方法里面写上self.skipTest(reason)
class TestMathFunc(unittest.TestCase): def test_minus(self): self.skipTest('do not run this.') self.assertEqual(1, minus(3, 2))
5.用HTMLTestRunner输出漂亮的HTML报告
下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
import unittest from test_mathfunc import TestMathFunc from HTMLTestRunner import HTMLTestRunner if __name__ == '__main__': suite = unittest.TestSuite() tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")] suite.addTests(tests) with open('HTMLReport.html', 'w') as f: runner = HTMLTestRunner(stream=f, title='MathFunc Test Report', description='generated by HTMLTestRunner.', verbosity=2 )
6.总结
1、unittest是python自带的单元测试框架,我们可以用其来作为我们自动化测试框架的用例组织执行框架。 2、unittest的流程:写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在
TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。 3、一个class继承unittest.TestCase即是一个TestCase,其中以 test 开头的方法在load时被加载为一个真正的TestCase。 4、verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。 5、可以通过addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。 6、用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境 7、我们可以通过skip,skipIf,skipUnless装饰器跳过某个case,或者用TestCase.skipTest方法。 8、参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunner输出html报告。

浙公网安备 33010602011771号