unittest
1 test case是单元测试中的最小个体
- 最简单的TestCase子类只需实现一个测试方法(名字以test开头)就可以实现对特定测试代码的执行
- 如果setUp()方法引发异常,框架会认为该测试遇到了错误,测试方法就不会被执行。
- 只要setUp()执行成功了,那么不管测试方法是否成功,tearDown()方法都会执行。
- 各测试方法的执行顺序是根据方法名字符串形式进行排序的。
2 test suite是test case的合集,通常用test suite将test case汇总然后一起执行。
3 test runner是一个执行器,它可以执行case并提供结果给用户。它可以提供图形界面、文本界面或者返回一个值表示测试结果
例
import unittest class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("当类测试方法被执行前会被调用的一个类方法")
@classmethod
def tearDownClass(cls):
print("当类测试方法被执行前会被调用的一个类方法")
def setUp(self): print("我是每一个测试方法之前都会运行一次") def test1(self): print("我是测试方法1") #bool(x) is True self.assertTrue(True) def test2(self): print("我是测试方法2") # first msg = second msg self.assertEqual(1,1) def test3(self): print("我是测试方法3") # bool(x) is False self.assertFalse(False) #x断言抛出指定的异常 with self.assertRaises(FileNotFoundError): open("1111") def tearDown(self): print("我在每一个测试方法之后都会运行一次") if __name__ == '__main__': unittest.main(verbosity=2)
在运行用例的时候可以加入verbosity=2参数, 打印出测试的详细信息, 默认为verbosity=1, 默认为0,不打印任何一条用例的执行结果
2 测试套件(Test suite)
import unittest class TestSuiteS(unittest.TestCase): def test1(self): #a!=b self.assertNotEqual(2,1) print("我是测试方法1") def test2(self): #a is b self.assertIs("a","a") print("我是测试方法2") def test3(self): #a is not b self.assertIsNot("a","b") print("我是测试方法3") def test4(self): # x is None self.assertIsNone(None) print("我是测试方法4") def test5(self): # x Not is Noe self.assertIsNotNone(1) print("我是测试方法5") def suite(): #返回一个套件 suite = unittest.TestSuite(); #添加TestCase到TestSuite中 suite.addTest(TestSuiteS("test1")) suite.addTest(TestSuiteS("test2")) suite.addTest(TestSuiteS("test3")) suite.addTest(TestSuiteS("test4")) suite.addTest(TestSuiteS("test5")) return suite if __name__ == '__main__': #返回一个执行器 runner = unittest.TextTestRunner()
#执行器执行套件 runner.run(suite())
3 跳过测试
可以跳过单个测试或者跳过整个测试类,可以将一个测试标记为预计失败,但是这个测试结果不会记录在TestResult中记录
import unittest
class TestSuper():
pass
class TestSub(TestSuper):
pass
sub = TestSub()
super = TestSuper()
#@unittest.skip 跳过类
class TestSkip(unittest.TestCase):
@unittest.skip("我被跳过了")
def test1(self):
print("我是测试方法1")
@unittest.skipIf(True, "如果条件为真时跳过测试")
def test2(self):
print("我是测试方法2")
# @unittest.skipUnless(False, "条件不为真时跳过测试")
def test3(self):
self.assertNotIsInstance(sub, super)
print("我是测试方法3")
# @unittest.expectedFailure#预期失败
def test4(self):
self.assertIsInstance("a", str)
print("我是测试方法4")
if __name__ == '__main__':
unittest.main(verbosity=2)