unittest是python中自带的单元测试框架,用来做单元测试
uinttestd的属性如下:
unitetest.TestCase :测试用例
unittest.TestSuite():多个测试用例集合在一起,创建测试套件
unitetest.defaultTestLoader:用来加载TestCase到TestSuite中的.通过该类下面的discover()方法可自动根据测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件
unitetest.TextTextRunner:协调测试执行并向用户提供执行结果的组件,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件
unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
@unittest.skip(reason):无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason):条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason):条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure(): 测试标记为失败。
TestCase类的属性如下:
setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。
tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。
assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。
assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。
assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。
assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。
assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。
assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。
assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。
assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。
assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。
assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。
assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。
assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。
assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。
Test fixture:对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大
addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。
suite = unittest.TestSuite() suite.addTest(test_baidu.BaiduTest('test_baidu'))
import unittest
import testcases # 导入模块
# 创建测试套件 suite =unittest.TestSuite() # 将测试用例添加到测试套件 # 方式一 添加单条用例 # suite.addTest(LoginTestCase,'test_login_case_pass') # 方式二 添加一个测试用例类中的所有用例 # loader:用来往测试套件中加载测试用例 # loader = unittest.TestLoader() # suite.addTest(loader.loadTestsFromTestCase(LoginTestCase)) # 方式三 添加一个模块中所有的测试用例 loader = unittest.TestLoader() suite.addTest(loader.loadTestsFromModule(testcases)) # 方式四:添加一个路径(目录)下面的所有测试用例 # loader = unittest.TestLoader() # suite.addTest(loader.discover(r"D:zhuyy estunittest est_data")) # 如何去运行测试套件中的所有测试用例? # 创建测试运行程序 # runner = unittest.TextTestRunner() # runner.run(suite)
run(): run()方法是运行测试套件的测试用例,入参为suite测试套件
runner = unittest.TextTestRunner()
runner.run(suite)
使用unittest编写python的单元测试代码,包括如下几个步骤:
1、编写一个python类,继承 unittest模块中的TestCase类,这就是一个测试类
2、在上面编写的测试类中定义测试方法(这个就是指的测试用例),每个方法的方法名要求以 test 打头,没有额外的参数。 在该测试方法中 调用被测试代码,校验测试结果,TestCase类中提供了很多标准的校验方法,如 最常见的assertEqual。
3、执行 unittest.main() ,该函数会负责运行测试,它会实例化所有TestCase的子类,并运行其中所有以test打头的方法。
使用unittest框架编写测试用例思路----基本思路如下:
# coding=utf-8 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #2.注释:包括记录创建时间,创建人,项目名称。 ''' Created on 2016-7-27 @author: Jennifer Project:使用unittest框架编写测试用例思路 ''' #3.导入unittest模块 import unittest #4.定义测试类,父类为unittest.TestCase。 #可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。 #可继承unittest.TestCase的各种断言方法。 class Test(unittest.TestCase): #5.定义setUp()方法用于测试用例执行前的初始化工作。 #注意,所有类中方法的入参为self,定义方法的变量也要“self.变量” #注意,输入的值为字符型的需要转为int型 def setUp(self): self.number=raw_input('Enter a number:') self.number=int(self.number) #6.定义测试用例,以“test_”开头命名的方法 #注意,方法的入参为self #可使用unittest.TestCase类下面的各种断言方法用于对测试结果的判断 #可定义多个测试用例 #最重要的就是该部分 def test_case1(self): print self.number self.assertEqual(self.number,10,msg='Your input is not 10') def test_case2(self): print self.number self.assertEqual(self.number,20,msg='Your input is not 20') @unittest.skip('暂时跳过用例3的测试') def test_case3(self): print self.number self.assertEqual(self.number,30,msg='Your input is not 30') #7.定义tearDown()方法用于测试用例执行之后的善后工作。 #注意,方法的入参为self def tearDown(self): print 'Test over' #8如果直接运行该文件(__name__值为__main__),则执行以下语句,常用于测试脚本是否能够正常运行 if __name__=='__main__': #8.1执行测试用例方案一如下: #unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。 #执行顺序是命名顺序:先执行test_case1,再执行test_case2 unittest.main() ''' #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) '''