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

原始链接: http://pythonfood.github.io/2018/05/01/unittest测试框架/

× 多少都行~
打赏二维码