Unittest单元测试笔记
·
- 基本使用方法
test01.py #!usr/bin/python # -*- coding: utf-8 -*- import unittest # 1.导入unittest class Test01(unittest.TestCase): # 2.继承TestCase类 def setUp(self): # 预置条件,继承自TestCase print "start" def tearDown(self): ## 后置条件,继承自TestCase print "end" def test01(self): ## 自己编写的测试方法,必须以'test*'开头 print "test01" def test03(self): print "test03" def test02(self):#每个测试方法都可单独运行,鼠标放在此处是只运行这个测试方法 print "test02" if __name__ == '__main__': unittest.main()#运行上边的所有测试用例, main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行 - 测试用例执行顺序
start test01 end start test02 end start test03 end 每个测试方法执行前执行setUp,执行后执行tearDown,测试方法顺序执行按照测试方法名称排序执行 - unittest批量执行(discover),即如果有一个包下有test01.py和test02.py两个脚本如何执行?
test02.py #!usr/bin/python # -*- coding: utf-8 -*- import unittest # 1.导入unittest class Test02(unittest.TestCase): # 2.继承TestCase类 def setUp(self): # 预置条件,继承自TestCase print "start" def tearDown(self): ## 后置条件,继承自TestCase print "end" def test01(self): ## 自己编写的测试方法,必须以'test*'开头 print "test01" def test03(self): print "test03" def test02(self):#每个测试方法都可单独运行,鼠标放在此处是只运行这个测试方法 print "test02" if __name__ == '__main__': unittest.main()#运行上边的所有测试用例,#!usr/bin/python # -*- coding: utf-8 -*- import unittest import os import HTMLTestRunner case_path = os.path.join(os.getcwd(),"case") report_path=os.path.join(os.getcwd(),"report.html") if __name__ == '__main__': discover = unittest.defaultTestLoader.discover(start_dir=case_path,pattern="test*.py",top_level_dir=None) runner = unittest.TextTestRunner() runner.run(discover)1.discover方法里面有三个参数: -case_dir:这个是待执行用例的目录。 -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。 -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。 2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里, 这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。 discover是一个Testsuite对象,里边是一个包含每个测试脚本的列表 <unittest.suite.TestSuite tests=[ <baidu.test_01.Test testMethod=test01>, <baidu.test_01.Test testMethod=test02>, <baidu.test_01.Test testMethod=test03>, <baidu.test_02.Test testMethod=test01>, <bolg.test_04.Test testMethod=test03>]> - HtmlTestRunner
import unittest import os import HTMLTestRunner #用例路径 case_path = os.path.join(os.getcwd(),"case") #报告路径 report_path=os.path.join(os.getcwd(),"report.html") if __name__ == '__main__': discover = unittest.defaultTestLoader.discover(start_dir=case_path,pattern="test*.py",top_level_dir=None) for i, j in zip(discover, range(len(list(discover)))): print i,j # runner = unittest.TextTestRunner() fp = open(report_path,"wb") runner =HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"标题",description=u"描述") runner.run(discover) #使用HTMLTestRunner可以把unittest的测试结果从文本形式的转换成为更直观好看的html格式的 #使用方法1.下载http://tungwaiyip.info/software/HTMLTestRunner.html HTMLTestRunner #2.将下载好的py文件放到python下的lib文件夹 #3.调用HTMLTestRunner.HTMLTestRunner方法生成runner,替代原来的runner = unittest.TextTestRunner() #三个参数说明 # --stream:测试报告写入文件的存储区域 # # --title:测试报告的主题 # # --description:测试报告的描述 可以在测试方法开头写上测试用例描述,将会显示在测试报告中 -
用setUp与setUpClass区别
#!usr/bin/python # -*- coding: utf-8 -*- import unittest class Test01(unittest.TestCase): @classmethod def setUpClass(cls): #类方法,仅执行一次 print 1111111111 @classmethod def tearDownClass(cls): print 2222222222222 def setUp(self): #每个测试用例都执行 print "start11" def tearDown(self): print "end11" def test01(self): print "test01" def test03(self): print "test03" def test02(self): print "test02" if __name__ == '__main__': unittest.main() -
数据驱动ddt
#!usr/bin/python # -*- coding: utf-8 -*- import unittest import ddt values = [{},{}.{}] @ddt.ddt class Test01(unittest.TestCase): def setUp(self): print "start" def tearDown(self): print "end" @ddt.data(*values) def test01(self,data): print data def test03(self): print "test03" def test02(self): print "test02" if __name__ == '__main__': unittest.main() 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt.data() 4.运行后用例会自动加载成三个单独的用例 -
跳过测试
unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等, 可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试 某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。 @unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试, 并说明跳过测试的原因。 @unittest.skipIf(reason): skipIf(condition,reason)装饰器: 条件为真时,跳过装饰的测试,并说明跳过测试的原因。 @unittest.skipUnless(reason): skipUnless(condition,reason)装饰器: 条件为假时,跳过装饰的测试,并说明跳过测试的原因。 @unittest.expectedFailure(): expectedFailure()测试标记为失败。 @unittest.skip('暂时跳过用例3的测试') def test_case3(self): print self.number self.assertEqual(self.number,30,msg='Your input is not 30') -
unittest中类的说明
1.unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。 将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件 suite = unittest.TestSuite() suite.addTest(test_baidu.BaiduTest('test_baidu')) 2.unittest.TextTextRunner():unittest框架的TextTextRunner()类, 通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。 runner = unittest.TextTestRunner() runner.run(suite) 3.unittest.defaultTestLoader(): defaultTestLoader()类, 通过该类下面的discover()方法可自动更具测试目录start_dir 匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件, 因此可以直接通过run()方法执行discover。 ''' #8.2执行测试用例方案二如下: #8.2.1先构造测试集 #8.2.1.1实例化测试套件 suite=unittest.TestSuite() #8.2.1.2将测试用例加载到测试套件中。 #执行顺序是按照加载顺序:先执行test_case2,再执行test_case1 suite.addTest(Test('test_case2')) suite.addTest(Test('test_case1')) #8.2.2执行测试用例 #8.2.2.1实例化TextTestRunner类 runner=unittest.TextTestRunner() #8.2.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例) runner.run(suite) ''' ''' #8.3执行测试用例方案三如下: #8.3.1构造测试集(简化了方案二中先要创建测试套件然后再依次加载测试用例) #执行顺序同方案一:执行顺序是命名顺序:先执行test_case1,再执行test_case2 test_dir = './' discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') #8.3.2执行测试用例 #8.3.2.1实例化TextTestRunner类 runner=unittest.TextTestRunner() #8.3.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例) runner.run(discover) ''' -
BeautifulReport替代HtmlTestRunner
import unittest from BeautifulReport import BeautifulReport if __name__ == '__main__': test_suite = unittest.defaultTestLoader.discover('../tests', pattern='test*.py') result = BeautifulReport(test_suite) result.report(filename='测试报告', description='测试deafult报告', log_path='report') add_test_img ( *pargs ) 可以在测试用例上挂载一个装饰器, 实例内容如下 ps: 默认存放的图片路径是img, 需要在当前测试项目的启动路径下, 创建一个img文件夹 传递给装饰器的图片,在运行测试前可以不存在, 运行测试之后生成即可. 当文件在报告中展示后, 想要看到原图, 可以点击报告中的缩略图查看完整的截图 import unittest from BeautifulReport import BeautifulReport class UnittestCaseSecond(unittest.TestCase): """ 测试代码生成与loader 测试数据""" def test_equal(self): """ test 1==1 :return: """ import time time.sleep(1) self.assertTrue(1 == 1) @BeautifulReport.add_test_img('测试报告.png') def test_is_none(self): """ test None object :return: """ save_some_img('测试报告.png') self.assertIsNone(None) -
断言
方法 检查 版本 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 3.1 assertIsNot(a, b) a is not b 3.1 assertIsNone(x) x is None 3.1 assertIsNotNone(x) x is not None 3.1 assertIn(a, b) a in b 3.1 assertNotIn(a, b) a not in b 3.1 assertIsInstance(a, b) isinstance(a,b) 3.1 assertNotIsInstance(a, b) not isinstance(a,b) 3.1
更多推荐



所有评论(0)