Python 2.1及以后的版本,将unittest作为一个标准模块放入Python开发包中。
使用unittest编写测试用例的规则
- import unittest
- 创建一个测试类,必须要继承unittest.TestCase类
- 创建一个测试方法,且方法要以“test” 开头
from calculator import Calculator
import unittest
class TestAdd(unittest.TestCase):
def test_add(self):
c =Calculator(3,5)
result = c.add()
self.assertEqual(result,8)
if __name__ =='__main__':
unittest.main() //通过main()方法来执行测试用例;按照测试类、方法的名称ASCII值大小的顺序执行用例
unittest的执行结果
- “.” 表示测试用例执行通过
- “F”表示执行失败
- “E” 表示执行错误
- "s“表示运行跳过
三个重要概念
1. Test Case
最小的测试单元,即测试方法。unittest提供了TestCase基类,我们创建的测试类要继承该基类,它可以 用来创建新的测试用例。
2. Test Suite
测试用例、测试套件或两者的集合,用于组装一组要运行的测试。
使用TestSuite类来创建测试套件。
3. Test Runner
Test Runner是一个组件,用于协调测试的执行并向用户提供结果。
unittest提供了TextTestRunner类运行测试用例。
测试用例执行顺序
unittest默认按照ASCII码的顺序加载测试用例(包括测试目录和测试文件、测试类、测试方法),即它并不是按照测试用例的创建顺序从上到下执行的。
discover()和main()方法的执行顺序是一样的。故想让某个测试文件先执行,可以在命名上加以控制。
如何控制测试用例的执行顺序?
可以通过TestSuite类的addTest()方法按照一定的顺序来加载测试用例,这样想先被执行的用例就可以先加载。
from calculator import Calculator
import unittest
class TestAdd(unittest.TestCase):
def test_add(self):
c =Calculator(3,5)
result = c.add()
self.assertEqual(result,8)
def test_add_decimals(self):
c=Calculator(3.5,5.5)
result=c.add()
self.assertEqual(result,9)
class TestSub(unittest.TestCase):
def test_sub(self):
c =Calculator(5,1)
result = c.sub()
self.assertEqual(result,4)
if __name__ =='__main__':
#创建测试套件
suit = unittest.TestSuite()
suit.addTest(TestSub("test_sub")) //添加测试用例
suit.addTest(TestAdd("test_add_decimals"))
#创建测试运行器
runner = unittest.TextTestRunner()
runner.run(suit)
执行多个测试用例
unittest.defaultTestLoader.discover()方法可以从多个文件中查找测试用例。
该类根据各种标准加载测试用例,并将它们返回给测试套件。
discover(start_dir, pattern='Test*.py', top_level_dir=None)
- start_dir : 待测试的模块名/测试用例目录