unittest

为什么要学习unittest

提供用例组织与执行提供丰富的比较方法

断言提供丰富的日志

有点类似与Junit,这是python语言自带的

实例1

计算类calculator.py

class Count:
    def __init__(self,a,b):
        self.a=a
        self.b=b

    def add(self):
        return self.a+self.b

测试类test.py

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')

if __name__=='__main__':
    unittest.main()

解读:

  1. 单元测试类必须集成unittest.TestCase
  2. 运行单元测试的方法可以使用unittest.main()
  3. setUp、tearDown 是运行测试前、后的方法
  4. 测试方法名称前缀必须是test

实例2

from calculator import Count
import unittest

class TestCount(unittest.TestCase):
    def setUp(self):
        print('test start')
    def test_add(self):
        j=Count(2,3)
    def t_add2(self):
        j=Count(4,5)
        self.assertEqual(j.add(),9)
    def tearDown(self):
        print('test end')

if __name__=='__main__':
    # 构造测试套件
    suite = unittest.TestSuite()
    suite.addTest(TestCount("test_add"))
    suite.addTest(TestCount("t_add2"))
    # 执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)
    

解读:

  1. unittest.TestSuite() 是测试套件,可以往里面添加要测试的方法,方法名不是test开头的也可以添加进去
  2. unittest.TextTestRunner() 是第二种执行测试的方法runner.run(测试套件)

实例3

calculator.py

class Count:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def add(self):
        return self.a+self.b

    def sub(self):
        return self.a-self.b

mytest.py

import unittest


class MyTest(unittest.TestCase):
    def setUp(self):
        print('test case start')

    def tearDown(self):
        print('test case end')

testadd.py

from calculator import Count
from mytest import MyTest
import unittest


class TestAdd(MyTest):

    def test_add(self):
        j = Count(2, 3)
        self.assertEqual(j.add(), 5, 'result is not 5')

    def test_add2(self):
        j = Count(4, 5)
        self.assertEqual(j.add(), 8, 'result is not 9')


if __name__ == '__main__':
    unittest.main()

testsub.py

from calculator import Count
from mytest import MyTest
import unittest


class TestSub(MyTest):

    def test_sub(self):
        j = Count(2, 3)
        self.assertEqual(j.sub(), -1)

    def test_sub2(self):
        j = Count(4, 5)
        self.assertEqual(j.sub(), -1)


if __name__ == '__main__':
    unittest.main()

runtest.py

import unittest
# 加载测试文件
from testadd import TestAdd
from testsub import TestSub

# 构造测试类
suite = unittest.TestSuite()
suite.addTest(TestAdd("test_add"))
suite.addTest(TestAdd("test_add2"))
suite.addTest(TestSub("test_sub"))
suite.addTest(TestSub("test_sub2"))

if __name__ == '__main__':
    # 执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

解读:

  1. 自定义MyTest 是测试类的父类,里面编写了 fixture 也就是 测试前和测试后要做的工作;
  2. 把测试add和sub的方法专门提取成各自文件,使目录更加清晰
  3. 将runtest独立成一个文件,方便管理要测试方法

实例4

在实例3的基础上修改runtest

import unittest
# 加载测试文件,不需要手动加载测试文件了

start_dir='./'
suite = unittest.defaultTestLoader.discover(start_dir,'test*.py',None)

if __name__=='__main__':
    # 执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

解读:

  1. discover(start_dir,pattern='test*.py',top_level_dir=None) 找到指定目录下所有测试模块,返回suite

补充:

  1. 用例的执行顺序 是按照add的顺序 如果使用discover 按照字母的排序
  2. 跳过测试和标记为失败不管是不是成功 @unittest.skip()
posted @ 2022-01-04 09:35  bagdje  阅读(32)  评论(0)    收藏  举报