1、四个概念
1.1、测试固件(test fixture)
1、常见的测试固件:
1.1、setUp、tearDown:每个用例执行前或之后执行;可来做测试前的初始化工作和测试后的清理工作;
1.2、setUpClass、tearDownClass:在类执行前或之后执行;
1.2、测试用例(test case)
1、测试用例是在unittest中执行测试的最小单元;
2、Unittest中测试用例的方法必须以test开头,并且执行顺序依据方法名的ASCII值来排序;
1.3、测试套件(test suite)
1、测试套件就是一组测试用例,执行这个套件就可以执行这个套件下的所有测试用例;
1.4、测试运行器(test runner)
1、测试运行器用来执行测试用例,并返回测试用例执行的结果;
2、它还可以用图形、表格、文本等方式把测试结果形象的展示出来,如HTMLTestRunner;
1.5、Unittest用例示例
1.1、示例代码:
import unittest
class TestStorm(unittest.TestCase):
def setUp(self):
print("setUp")
def test_first(self):
self.assertAlmostEqual('storm', 'storm')
print("10")
def tearDown(self):
print("tearDown")
if __name__ == '__main__':
unittest.main()
1.2、执行结果:
1.6、总结
1、 测试类必须继承unittest.TestCase;
2、setUp和tearDown注意大小写;
3、测试用例以“test_”开头;
4、self.assertXXX是unittest提供的断言方法;
5、setUp和tearDown的位置不影响其执行的顺序;
1.7、测试执行结果打印总结
1、第1行显示测试开始执行的时间;
2、第2行显示测试执行的文件;
3、第3行显示执行一个测试用例花费了多长时间;
4、OK表示断言成功;
5、“setUp”和“tearDown”为程序执行输出的信息;
2、测试固件
2.1、测试固件简介
1、setUp:在每个测试方法前执行,负责测试前的初始化工作;
2、tearDown:在每个测试方法后执行,负责测试前的清理工作;
3、setUpClass:在所有测试方法执行前执行,负责单元测试前期准备。必须使用@classmethod装饰器进行修饰,在setUp函数之前执行,在整个测试过程中只执行一次;
4、tearDownClass:在所有测试方法执行后执行,负责单元测试前期准备。必须使用@classmethod装饰器进行修饰,在tearDown函数之后执行,在整个测试过程中只执行一次;
5、测试固件本省就是一个函数,和测试用例分别负责不同的工作;
2.2、用例示例
import unittest
class TestStorm(unittest.TestCase):
@classmethod # 注意必须有该装饰器
def setUpClass(cls): # 在整个class开始前执行1次
print("setUpClass")
def setUp(self): # 在每个测试用例前执行1次
print("setUp")
def test_1(self): # 第一个测试用例
print("first")
self.assertEqual("first", "first")
def test_2(self): # 第二个测试用例
print("second")
self.assertEqual("second", "second")
def tearDown(self): # 在每个测试用例后执行1次
print("teardown")
@classmethod
def tearDownClass(cls): # 在整个class后执行1次
print("tearDownClass")
if __name__ == '__main__':
unittest.main()
执行结果:
3、通过class构造测试集
3.1、第一种(两个class不在同一个py文件里)
1、目录demo下有两个测试文件demo1.py和demo3.py,把两个文件的测试用例整合到一个测试用例集中执行;
2、demo1.py文件内容:
import unittest
class TestStorm(unittest.TestCase):
def setUp(self):
print("setUp")
def test_first(self):
self.assertAlmostEqual('storm', 'storm')
print("10")
def tearDown(self):
print("tearDown")
if __name__ == '__main__':
unittest.main()
3、demo3.py文件内容
import unittest
first = 20
class TestStorm(unittest.TestCase):
def setUp(self): # 在每个测试用例前执行1次
print("setUp")
def test_1(self):
second = first + 5
print(second)
self.assertEqual(second, 25)
def test_2(self):
second = first + 10
print(second)
self.assertEqual(second, 30)
def test_3(self):
second = first + 20
print(second)
self.assertEqual(second, 40)
def tearDown(self): # 在每个测试用例后执行1次
print("teardown")
if __name__ == '__main__':
unittest.main()
4、 整合测试用例集
# 通过class构造测试集
import unittest
from Demo import demo3
from Demo import demo1
if __name__ == '__main__':
testcase1 = unittest.TestLoader().loadTestsFromTestCase(demo3.TestStorm)
testcase2 = unittest.TestLoader().loadTestsFromTestCase(demo1.TestStorm)
suite = unittest.TestSuite([testcase1, testcase2])
unittest.TextTestRunner().run(suite)
5、测试用例集执行结果:
3.2、第二种(两个class在同一个py文件里)
1、两个class在同一个py文件里;
2、代码如下:
import unittest
first = 20
class TestStorm1(unittest.TestCase):
def setUp(self):
# print("setUp")
pass
def test_first(self):
self.assertAlmostEqual('storm', 'storm')
print("10")
def tearDown(self):
# print("tearDown")
pass
class TestStorm2(unittest.TestCase):
def setUp(self): # 在每个测试用例前执行1次
# print("setUp")
pass
def test_1(self):
second = first + 5
print(second)
self.assertEqual(second, 25)
def test_2(self):
second = first + 10
print(second)
self.assertEqual(second, 30)
def tearDown(self): # 在每个测试用例后执行1次
# print("teardown")
pass
if __name__ == '__main__':
testcase = unittest.TestLoader().loadTestsFromTestCase(TestStorm2, TestStorm1)
suite = unittest.TestSuite([testcase])
unittest.TextTestRunner().run(suite)
3、执行结果如下:
4、通过addTest构建测试函数
1、我们可以通过addTest将某个class下的测试用例添加到集合,然后执行测试集合;
2、将demo目录下的demo3.py文件里的class里test_1和test_3用例添加的集合里,样例代码:
2.1、demo3.py文件如下:
import unittest
first = 20
class TestStorm(unittest.TestCase):
def setUp(self): # 在每个测试用例前执行1次
print("setUp")
def test_1(self):
second = first + 5
print(second)
self.assertEqual(second, 25)
def test_2(self):
second = first + 10
print(second)
self.assertEqual(second, 30)
def test_3(self):
second = first + 20
print(second)
self.assertEqual(second, 40)
def tearDown(self): # 在每个测试用例后执行1次
print("teardown")
if __name__ == '__main__':
unittest.main()
2.2、构建测试集合代码文件,如下:
import unittest
from Demo import demo3
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(demo3.TestStorm("test_1"))
suite.addTest(demo3.TestStorm("test_3"))
unittest.TextTestRunner().run(suite)
2.3、执行结果如下:
5、通过discover构建测试集合
1、我们可以通过unittest.TestLoader().discover(‘.’)在指定目录中寻找符合条件的测试用例,从而组成测试集合;
2、创建目录demo2;在目录里创建测试文件test_1.py和test_2.py(以test开头的测试文件)
目录及文件如下:
3、test_1.py文件代码:
import unittest
class Test_1(unittest.TestCase):
def setUp(self):
print("数据初始化")
def tearDown(self):
print("用例执行完后,数据清理")
def test_01(self):
print("测试用例:1")
def test_02(self):
print("测试用例:2")
if __name__ == '__main__':
unittest.main()
4、test_2.py文件代码:
import unittest
class Test_1(unittest.TestCase):
def setUp(self):
print("数据初始化")
def tearDown(self):
print("用例执行完后,数据清理")
def test_a(self):
print("测试用例:a")
def test_b(self):
print("测试用例:b")
if __name__ == '__main__':
unittest.main()
5、在demo2同一级目录,或自定义目录里创建批量执行测试文件的py文件;
例:创建文件:run_all_test.py
import unittest
if __name__ == '__main__':
testsuite = unittest.TestLoader().discover('./demo2') # 里面填写测试文件所在的路径
unittest.TextTestRunner().run(testsuite)
6、执行结果:
7、也可在终端中到存放测试文件的目录下执行命令行的方式,达到相同的结果;
6、用例执行次序
1、是测试用例能够按顺序执行;
2、将Demo目录里的demo5例的测试用例按指定顺序执行,样例代码如下:
2.1、demo5文件
import unittest
first = 20
class TestStorm1(unittest.TestCase):
def setUp(self):
# print("setUp")
pass
def test_1(self):
self.assertAlmostEqual('storm', 'storm')
print("10")
def test_2(self):
self.assertAlmostEqual('storm', 'storm')
print("150")
def tearDown(self):
# print("tearDown")
pass
class TestStorm2(unittest.TestCase):
def setUp(self): # 在每个测试用例前执行1次
# print("setUp")
pass
def test_1(self):
second = first + 5
print(second)
self.assertEqual(second, 25)
def test_2(self):
second = first + 10
print(second)
self.assertEqual(second, 30)
def tearDown(self): # 在每个测试用例后执行1次
# print("teardown")
pass
if __name__ == '__main__':
# testcase = unittest.TestLoader().loadTestsFromTestCase(TestStorm2, TestStorm1)
# suite = unittest.TestSuite([testcase])
# unittest.TextTestRunner().run(suite)
unittest.main()
2.2、整合代码:
import unittest
from Demo import demo5
if __name__ == '__main__':
# 按TestStorm2的test_2、test_1,TestStorm1的test_2、test_1顺序执行
suite = unittest.TestSuite()
suite.addTest(demo5.TestStorm2("test_2"))
suite.addTest(demo5.TestStorm2("test_1"))
suite.addTest(demo5.TestStorm1("test_2"))
suite.addTest(demo5.TestStorm1("test_1"))
unittest.TextTestRunner().run(suite)
2.3、执行结果: