1、初识
calculator.py
class Count:
def __init__(self, a, b):
self.a = int(a)
self.b = int(b)
def add(self):
return self.a + self.b
from calculator import Count
import unittest
# 测试用例
class KestCount(unittest.TestCase):
# 用例执行初始化
def setUp(self):
print("test start")
def test_add(self):
j = Count(2, 3)
# 断言继承自TestCase,调用函数是不是==5
self.assertEqual(j.add(), 5)
# 用例执行完的善后
def tearDown(self):
print("test end")
# 当自己直接执行的时候,执行。。当作为模块引入的时候,不执行下面的
if __name__ == '__main__':
# 会执行继承TestCase的用例,执行所有以test开头命名的测试方法
unittest.main()
2、Text Suite的使用
# 当有多个测试用例时
# 单元测试包括:Test Case测试用例
# 和Test Suite测试套件,可通过addTest将多个测试用例集合起来
# 和Test Runner测试执行,通过TextTestRunner类提供的run()来执行testsuite或TestCase
# 和test fixture测试环境的搭建和销毁,包括setUp和tearDown
from calculator import Count
import unittest
class TestCount(unittest.TestCase):
def setUp(self):
print('test begin')
def test_add1(self):
j = Count(2,3)
self.assertEqual(j.add(), 5)
def test_add2(self):
j = Count(41, 23)
# 断言方法
# assertEqual(a, b, msg),a和b是否相等,不相等输出msg,可选
# assertNotEqual(a, b, msg),与上个相反
# assertTrue(expr, msg),expr表达式是true
# assertFalse(expr, msg),expr表达式是false
# assertIn(a, b, msg),b包含a吗,"hello world"包含"hello"
# assertNotIn(a, b, msg)相反
self.assertEqual(j.add(), 64)
def tearDown(self):
print('test end')
if __name__ == '__main__':
# 构建测试集
suite = unittest.TestSuite()
# 通过addTest有选择的执行测试用例,可以同时执行1个或多个
# suite.addTest(TestCount('test_add1'))
suite.addTest(TestCount('test_add2'))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
3、扩展calculator.py中的方法
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
# 扩展测试用例:calculator文件,增加了sub方法
from calculator import Count
import unittest
class TestAdd(unittest.TestCase):
def setUp(self):
print('test add start')
def add1(self):
j = Count(2, 3)
self.assertEqual(j.add(), 5)
def add2(self):
j = Count(1, 2)
self.assertEqual(j.add(), 3)
def tearDown(self):
print('add end')
class TestSub(unittest.TestCase):
def setUp(self):
print('test sub start')
def test_sub1(self):
j = Count(3, 2)
self.assertEqual(j.sub(), 1)
def test_sub2(self):
j = Count(4, 2)
self.assertEqual(j.sub(), 2)
def tearDown(self):
print('test sub end')
if __name__ == '__main__':
# 测试用例执行的顺序,为添加套件的顺序,
# unittest.main()是以ASCII码的顺序
suite = unittest.TestSuite()
suite.addTest(TestAdd('add1'))
suite.addTest(TestAdd('add2'))
suite.addTest(TestSub('test_sub1'))
suite.addTest(TestSub('test_sub2'))
runner = unittest.TextTestRunner()
runner.run(suite)
# 当setUp和tearDown都一样时,可以抽离
# class MyTest(unittest.TestCase):
# def setUp():
# def tearDown():
# class TestAdd(MyTest):
# ......
4、discover的使用
# 将每个测试类和run都拆分
# 这只是一个run文件
# discover()方法匹配测试用例文件,并将查找的测试用例组装到测试套件中
# 而不需要通过suite一个一个添加套件
# 识别以test开头的测试用例,test3.py中的add方法,没有以test开头,所以不会识别
import unittest
# 定义测试用例的目录为当前目录,匹配以test开头的文件
# 为当前目录,想要查找子目录,需要每个子目录放一个__init__.py文件,变为当前目录包的子包
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
5、跳过测试
# 跳过测试,当不想测试那条时,可以跳过
# 这些方法同样可以应用于测试类,只要写在测试类上面就行
import unittest
class TestSkip(unittest.TestCase):
def setUp(self):
print('start')
def tearDown(self):
print('end')
@unittest.skip("跳过测试")
def test1(self):
print('无条件跳过测试,并说明原因')
@unittest.skipIf(3>2, "当条件为true时,跳过测试")
def test2(self):
print("当条件为true时,跳过测试,说明原因")
@unittest.skipUnless(3>2, "当条件为true时执行测试")
def test3(self):
print('当条件为true时执行测试,说明原因')
# 无论结果为什么,一律失败
@unittest.expectedFailure
def test4(self):
print('无论结果都失败')
if __name__ == '__main__':
unittest.main()