unittest中更多的测试用例

随着软件功能的不断增加,对应的测试用例也会呈指数级增长。一个实现几十个功能的项目,对应的单
元测试用例可能达到上百个。如果把所有的测试用例都写在一个 test.py 文件中,那么这个文件会越来越臃肿,后期维护起来也比较麻烦。需要将这些用例按照所测试的功能进行拆分,分散到不同的测试文件中。
目录结构如下:
testpro/
├── count.py
├── testadd.py
├── testsub.py
└── runtest.py
文件拆分后的实现代码如下。
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 case start")
def tearDown(self): 
    print("test case end")
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)
if __name__ == '__main__': 
    unittest.main()

testsub.py

from calculator import Count import unittest
class TestSub(unittest.TestCase):
def setUp(self):
    print("test case start")
def tearDown(self): 
    print("test case end")
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)
if __name__ == '__main__': 
    unittest.main()

runtest.py

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)

这样的拆分带来了好处,可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件
中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,整体结构更加清晰。
这样的设计看上去很完美,但依然没有解决添加用例的问题,当用例达到成百上千条时,在 runtest.py 文件中通过 addTest()添加/删除测试用例就变得非常麻烦,那么有没有方法让 unittest 单元测试框架自动识别测试用例呢?答案是肯定的,TestLoader 类中提供的 discover()方法可以解决这个问题。
TestLoader
该类负责根据各种标准加载测试用例,并将它们返回给测试套件。正常情况下,不需要创建这个类的实例。unittest 提供了可以共享的 defaultTestLoader 类,可以使用其子类和方法创建实例,discover()方法就是其中之一。
discover(start_dir,pattern='test*.py',top_level_dir=None) 找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。

  • start_dir :要测试的模块名或测试用例目录。
  • pattern=’test*.py’ :表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“*”表示任意多个字符。
  • top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为 None。

现在通过 discover()方法重新实现 runtest.py 文件的功能。

runtest.py

import unittest
# 定义测试用例的目录为当前目录 
test_dir = './' #需要执行的文件路径
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')#执行所有以test开头的py文件
if __name__ == '__main__':
    runner = unittest.TextTestRunner() 
    runner.run(discover)

discover()方法会自动根据测试目录(test_dir)匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中,因此,可以直接通过 run()方法执行 discover ,大大简化了测试用例的查找与执行。

注意:在使用discover时不再是依照代码从上到下执行,如多个文件同时执行是以文件名a - z,A-Z,0 - 9 先后顺序 ,测试用例也是也是这个先后顺序。

如有两个文件:

a.py 和 b.py # a.py先执行
a1.py 和 a.py # a.py先执行
ab.py 和 ac.py #ab.py先执行
#类中的测试用例也是按名字这种先后顺序
class a():class b(): #class a先执行

如我们先要执行某个文件可在文件名前面加a,后执行加z。
文件名第一个字母相同就开始比对第二个,第二个相同就比对第三个。。。。

猜你喜欢

转载自blog.csdn.net/zha6476003/article/details/80495207
今日推荐