单元测试框架的功能:
1.提供用例组织与执行
2.提供丰富的比较方法
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
不用测试框架所编写的单元测试如下所示:
from calculator import Count
class TestCount:
def test_add(self):
try:
j=Count(2,3)
add=j.add()
assert(add==5),'Integer addition result error!'
except AssertionError as msg:
print(msg)
else:
print('Test pass!')
mytest=TestCount()
mytest.test_add()
使用unittest单元测试框架来编写测试用例如下所示:
from calculator import Count
import unittest
class TestCount(unittest.TestCase):
#初始化工作
def setUp(self):
print("test start")
def test_add(self):
j=Count(2,3)
self.assertEqual(j.add(),5)
#收尾工作
def tearDown(self):
print("test end")
#__main__代表直接使用该test1.py
if __name__=='__main__':
unittest.main()
if__name__=="__main__":语句说明
1、python文件的后缀为.py
2、.py文件既可以用来直接执行,也可以用来作为模块被导入
3、在python中导入模块一般使用的是import
unittest中重要的概念:
1、Test Case:一个测试用例
2、Test Suite:测试用例集
3、Test Runner:测试执行策略
4、Test Fixture:一个完整的测试用例环境
from calculator import Count
import unittest
class TestCount(unittest.TestCase):
#初始化工作
def setUp(self):
print("test start")
def test_add(self):
j=Count(2,3)
self.assertEqual(j.add(),5)
def test_add2(self):
j=Count(41,76)
self.assertEqual(j.add(),117)
#收尾工作
def tearDown(self):
print("test end")
#__main__代表直接使用该test2.py
if __name__=='__main__':
suite=unittest.TestSuite()
suite.addTest(TestCount("test_add"))
suite.addTest(TestCount("test_add2"))
runner=unittest.TextTestRunner()
runner.run(suite)
组织单元测试用例
当被测功能和测试用例增加后,unittest框架需要扩展和组织新增的测试用例
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
testadd.py
from calculator import Count
import unittest
class TestAdd(unittest.TestCase):
#初始化工作
def setUp(self):
print("test start")
def test_add(self):
j=Count(2,3)
self.assertEqual(j.add(),5)
def test_add2(self):
j=Count(41,76)
self.assertEqual(j.add(),117)
#收尾工作
def tearDown(self):
print("test end")
#__main__代表直接使用该test2.py
if __name__=='__main__':
unittest.main()
testsub.py
from calculator import Count
import unittest
class TestSub(unittest.TestCase):
#初始化工作
def setUp(self):
print("test start")
def test_sub(self):
j=Count(2,3)
self.assertEqual(j.sub(),-1)
def test_sub2(self):
j=Count(71,46)
self.assertEqual(j.sub(),25)
#收尾工作
def tearDown(self):
print("test end")
#__main__代表直接使用该test2.py
if __name__=='__main__':
unittest.main()
runtest.py
如果用例特别多,可以使用discover
import unittest
import testadd
import testsub
suite=unittest.TestSuite()
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__':
runner=unittest.TextTestRunner()
runner.run(suite)
如果用例特别多,可以使用discover
import unittest
test_dir='./'
discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
if __name__=='__main__':
runner=unittest.TextTestRunner()
runner.run(discover)
用例执行顺序
unittest框架默认根据ASCII码的顺序加载测试用例,如果想改变这个规则,就不能使用main()方法了,而是需要通过TestSuite类的addTest()方法按照一定的顺序来加载
discover()的加载测试用例的规则与main()方法相同