unittest中最核心的四个概念是:test fixture, test case, test suite, test runner。
一、unittest框架
1、Test Fixture
(1) setUp() 用于测试用例执行前的初始化工作。如登录数据库、实例化浏览器等。
(2) tearDown() 用于测试用例执行之后的善后工作。如关闭数据库连接、关闭浏览器等。
(3) 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的一个实例,不是则测试用例通过。
2、Test Case
(1) test*() 测试用例方法。
(2) unittest.skip() 装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。
- @unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
- @unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
- @unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
- @unittest.expectedFailure(): expectedFailure()测试标记为失败。
3、Test Suite
(1) addTest() 将测试用例添加到测试套件中。
(2) addTests() 将测试用例添加到测试套件中。
(3) unittest.TestLoader() 通过该类下面的loadTestsFromTestCase方法可以从类中添加测试用例。
(4) unittest.defaultTestLoader() 通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:
- discover = unittest.defaultTestLoader.discover(testdir, pattern=’test*.py’, top_level_dir=None)
4、Test Runner
(1) unittest.TextTextRunner() 通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
(2) run() 是运行测试套件的测试用例,入参为suite测试套件。
(3) HTMLTestRunner() 是第三方封装模块,使用前导入from HTMLTestRunner import HTMLTestRunner,用于生成HTML测试报告,可以代替unittest.TextTextRunner()。主要用法:
- runner = HTMLTestRunner(stream=open(r’E:\report.html’, ‘wb’), title=’自动化测试报告’, description=’环境:测试环境’)
二、unittest小示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 import unittestdemo1
import unittestdemo2
import unittest
from appium import webdriver
class MyTestCase(unittest.TestCase):
#初始化setup
def setUp(self):
desired_caps={}
desired_caps['platformName']='Android'
desired_caps['platformVersion']='5.1.1'
desired_caps['deviceName']='61f9c06a'
desired_caps['appPackage']='com.android.contacts'
desired_caps['appActivity']='com.android.contacts.DialtactsContactsEntryActivity'
desired_caps['unicodeKeyboard']='true'
desired_caps['resetKeyboard']='true'
self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
#测试用例1
def test_something(self):
self.assertEqual(False, True)
print('test_something')
#测试用例2
def test_anything(self):
self.assertEqual(True, True)
print('test_anything')
#释放资源teardown
def tearDown(self):
self.driver.quit()
if __name__ =="__main__":
#以类的形式添加测试用例
cases1 = unittest.TestLoader().loadTestsFromTestCase(unittestdemo1.MyTestCase)
cases2 = unittest.TestLoader().loadTestsFromTestCase(unittestdemo2.MyTestCase)
#定义suite
suite = unittest.TestSuite([cases1, cases2])
#以单条测试用例形式装载
suite.addTest(MyTestCase('test_something'))
suite.addTest(MyTestCase('test_anything'))
#定义runner
runner = unittest.TextTestRunner(verbosity=2)
#用runner执行suite
runner.run(suite)
三、DDT数据驱动模式
1、官网下载安装:https://pypi.python.org/pypi/ddt
2、使用前导入模块from ddt import ddt,data,unpack
3、首先说明测试类使用的是ddt测试框架:
1
2 @ddt
class MyTestCase(unittest.TestCase)
4、数据驱动主要是解决带参数的测试用例:
(1)使用元组存放测试的数据,一个参数的情况:
1
2 @data(1,-3,2,0)
def testcase(self, value):
(2)使用元组存放测试的数据,多个参数的情况:
1
2
3 @data((3,2),(4,3),(5,3))
@unpack
def testcase(self, value1, value2):
四、DDT小示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 from ddt import ddt,data,unpack
@ddt
class MyTestCase(unittest.TestCase):
@data(1,2,3)
def test_something(self, value):
print(value)
self.assertEqual(value, 2)
@data((1,2),(2,3))
@unpack
def test_anything(self, value1, value2):
print(value1,value2)
self.assertEqual(value2, value1+1)
if __name__ == '__main__':
unittest.main()
ps:使用ddt框架后,测试用例的名称会改变,所以装载Test Suite时不能使用单条测试用例装载了,尽量使用类的形式装载Test Suite。
持续更新…
最后更新: 2018年11月03日 15:18