概念:
1.Test Case
一个Test Case的实例就是一个测试用例。
2.Test Suite
测试套件Test Suite用来组装单个测试用例。
3.Test Runner
通过TextTestRunner类提供run()方法执行test case/test suite。
4.Test Fixture
一个测试用例环境的搭建和销毁,就是一个fixture。通过setUp()和tearDown()方法实现。
例子:
calculator.py
#定义一个Count类,add()方法做两个整数相加,sub()方法做两个整数相减
class Count:
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
testadd.py
from calculator import Count
import unittest
#导入unittest模块,创建TesAdd类继承unittest的TestCase类
class TestAdd(unittest.TestCase):
#setUp()方法用于测试用例执行前的初始化工作
def setUp(self):
print("test case start")
def test_add(self):
j = Count(1, 2)
self.assertEqual(j.add(), 3)
#assertEqual()方法进行断言,判断是否相等
def test_add2(self):
j = Count(10, 11)
self.assertEqual(j.add(), 21)
#tearDown()方法用于测试用例执行后的工作
def tearDown(self):
print("test case end")
if __name__ == "__main__":
unittest.main()
#main()方法,将一个单元测试模块变成可以直接运行的测试脚本
testsub.py
from calculator import Count
import unittest
class TestSub(unittest.TestCase):
def setUp(self):
print("test case start")
def test_sub(self):
j = Count(1, 2)
self.assertEqual(j.sub(), -1)
def test_sub2(self):
j = Count(11, 10)
self.assertEqual(j.sub(), 1)
def tearDown(self):
print("test case end")
if __name__ == "__main__":
unittest.main()
runtest.py
import unittest
import testadd
import testsub
#TestSuite()类来创建测试套件,构造测试集
suite = unittest.TestSuite()
#addTest()方法添加测试用例
suite.addTest(testadd.TestAdd("test_add"))
suite.addTest(testadd.TestAdd("test_add2"))
suite.addTest(testsub.TestSub("test_sub"))
suite.addTest(testsub.TestSub("test_sub2"))
if __name__ == "__main__":
#调用TextTestRunner()类下面的run()方法运行suite所组装的测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
runtest_discover.py
import unittest
test_dir = "./"
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
#TestLoader类中discover()方法自动识别测试用例,避免使用addTest()操作麻烦
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
类 | 方法 | 作用 |
TestCase | setUp() | 用于测试用例执行前的初始化工作。 |
tearDown() | 用于测试用例执行后的善后工作,为下一个test case留下一个干净的环境。 | |
assertEqual() | 断言,判断是否相等。 | |
TestLoader | discover() | discover(start_dir, pattern='test*.py', top_level_dir=None). 自动根据测试目录(test_dir)匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中。 |
TestSuite | addTest() | 添加测试用例。 |
TextTestRunner | run() | 运行测试用例。 |
main() | unittest全局方法,将一个单元测试模块变成可以直接运行的测试脚本,并自动执行它们。 |
方法 | 检查 | 说明 | 版本 |
assertEqual(a, b) | a == b | assertEqual(firse, second, msg=None) 断言第一个参数和第二个参数是否相等,如果不相等测试失败。msg可选参数,用于定义测试失败打印信息。 | |
assertNotEqual(a, b) | a != b | assertNotEqual(firse, second, msg=None) 断言第一个参数与第二个参数是否不相等,如果相等测试失败。 | |
assertTrue(x) | bool(x) is True | assertTrue(expr, msg=None) 断言测试表达式为true,测试通过。否则失败。 | |
assertFalse(x) | bool(x) is False | assertFalse(expr, msg=None) 断言测试表达式为false,测试通过。否则失败 | |
assertIs(a, b) | a is b | assertIs(first, second, msg=None) 断言第一个参数和第二个参数是否为同一个对象。是则测试通过。 | 3.1 |
assertIsNot(a, b) | a is not b | assertIsNot(first, second, msg=None) 断言第一个参数和第二个参数是否为同一个对象。不是则测试通过。 | 3.1 |
assertIsNone(x) | x is None | assertNone(expr, msg=None) 断言表达式是否为None对象。是则测试通过。 | 3.1 |
assertIsNotNone(x) | x is not None | assertNotNone(expr, msg=None) 断言表达式是否为None对象。不是则测试通过。 | 3.1 |
assertIn(a, b) | a in b | assertIn(first, second, msg=None) 断言第一个参数是否在第二个参数中,即第二个参数是否包含第一个参数。包含则测试通过。 | 3.1 |
assertNotIn(a, b) | a not in b | assertNotIn(first, second, msg=None) 断言第一个参数是否在第二个参数中,即第二个参数是否包含第一个参数。不包含则测试通过。 | 3.1 |
assertInstance(a, b) | isinstance(a, b) | assertInstance(obj, cls, msg=None) 断言obj是否为cls的一个实例。是则测试通过。 | 3.2 |
assertNotInstance(a, b) | not isinstance(a, b) | assertNotInstance(obj, cls, msg=None) 断言obj是否为cls的一个实例。不是则测试通过。 | 3.2 |
方法 | 说明 |
unittest.skip(reason) | 无条件地跳过装饰的测试,说明跳过测试的原因。 |
unittest.skipIf(condition, reason) | 条件为真时,跳过装饰的测试 |
unittest.skipUnless(condition, reason) | 条件为真时,执行测试,其他时候都跳过测试。 |
unittest.expectedFailure() | 测试标记为失败。不管测试结果是否失败,统一标记为失败。 |
例子:
decorator.py
import unittest
class MyTest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
@unittest.skip("直接跳过测试")
def test_skip(self):
print("test 1")
@unittest.skipIf(2 > 1, "当条件为真时跳过测试")
def test_skip_if(self):
print("test 2")
@unittest.skipUnless(2 > 1, "当条件为真时执行测试")
def test_skip_unless(self):
print("test 3")
#不管结果如何,标记为失败
@unittest.expectedFailure
def test_expected_Failure(self):
self.assertEqual(1, 2)
if __name__ == "__main__":
unittest.main()
结果:
说明:点(.)代表用例执行通过;F表示用例执行失败;E表示用例执行出错;S表示跳过执行用例。