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
import unittest

class Test_1(unittest.TestCase):
def setUp(self):
print("Test1 start")

def test_c(self):
print("test_c")

def test_b(self):
print("test_b")

def tearDown(self):
print("test end")

class Test_2(unittest.TestCase):
def setUp(self):
print("Test2 start")

def test_d(self):
print("test_d")

def test_a(self):
print("test_a")

def tearDown(self):
print("Test2 end!")

通过运行脚本,可以发现执行顺序规则——测试类或测试方法的数字与字母顺序 0~9,A-Z

用例综合框架管理

前面测试用例与执行都是写在一个文件,当用例数量不断增加的时候,用例的执行与管理变得非常麻烦,因此需要对用例根据具体的功能模块来使用单独的模块来管理。就像一所学习要根据不同年级进行分班管理,也是同样道理。

Test_Project 文件目录下包含4个python文件:

  • l–StartEnd.py
  • l–calculatory.py
  • l–test_add.py
  • l–test_sub.py
  • l–runtest.py

calculatory.py

1
2
3
4
5
6
7
8
9
10
11
#两个数相加或者相减
class Math:
def __init__(self,a,b):
self.a=int(a)
self.b=int(b)

def add(self):
return self.a+self.b

def sub(self):
return self.a-self.b

StartEnd.py

1
2
3
4
5
6
7
8
import unittest

class SetUp_TearDown(unittest.TestCase):
def setUp(self):
print("test start")

def tearDown(self):
print("test end")

test_add.py

1
2
3
4
5
6
7
8
9
10
11
from calculator import *
from StartEnd import *

class TestAdd(SetUp_TearDown):
def test_add(self):
i=Math(5,5)
self.assertEqual(i.add(),10)

def test_add1(self):
i=Math(8,8)
self.assertEqual(i.add(),16)

test_sub.py

1
2
3
4
5
6
7
8
9
10
11
from calculator import *
from StartEnd import *

class TestSub(SetUp_TearDown):
def test_sub(self):
i=Math(5,5)
self.assertEqual(i.sub(),0)

def test_sub1(self):
i=Math(8,5)
self.assertEqual(i.sub(),3)

discover方式执行

runtest.py

  • 使用discover 可以一次调用多个脚本
  • test_dir 被测试脚本的路径
  • pattern 脚本名称匹配规则
1
2
3
4
5
6
7
import unittest
test_dir='./'
discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*py')

if __name__ == '__main__':
runner=unittest.TextTestRunner()
runner.run(discover)

非discover方式执行测试

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
from calculatory import Count
import unittest

class TestCount(unittest.TestCase):
def setUp(self):
print("Start Test!")

#构造测试用例,传入参数2,3
def test_add(self):
j=Count(2,3)
self.assertEqual(j.add(),5)
#self.assertNotEqual(j.add(),5)

def tearDown(self):
print("test finished!")


if __name__=='__main__':
unittest.main()

#构造具体测试集 适用于多个测试用例
suite=unittest.TestSuite()
#测试test_add()用例
suite.addTest(TestCount("test_add"))

#执行测试
runner=unittest.TextTestRunner()
runner.run(suite)

注意事项:

多级目录调用需要在每一个子目录下面新建一个init.py文件,文件内容可以为空,表示包含标准模块的的python模块目录