单元测试--unittest

单元测试框架: unittest  pytest

uniittest:

  unittest是python内置的单元测试框架,具有编写用例,组织用例,执行用例,输出测试报告等自动化框架的条件。

  unittest中的5个重要概念:test Fixture,TestCase,TestSuite,TestLoder,TextTestRunner

    Test Fixture:搭建测试环境的准备及清理工作,准备执行测试需要的数据,环境等;使用方法setUp(),tearDown(),setUpClass(),tearDownClass();什么时候使用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。

    TestCase:一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试 代码 (run),以及测试后环境的还原(tearDown)。unittest中测试用例方法都是以test开头的,且执行顺序会按照方法名的ASCII值排序。

    TestSuite:将多个测试用例集合到一起,可以是多个test case,也可以是testSuite,甚至可以test case和 test suite一起。

    TestLoder:加载test case到test suite中

    TextTestRunner:用来执行测试用例

    TextTestResult:存储测试用例的执行结果

  工作原理: 

     1.写好测试用例TestCase;注意测试类需要继承unittest.TestCase,一个函数一条测试用例,不能传参,只支持self参数,函数名必须用test 开头

     2.将测试用例通过testLoder加载到TestSuit存储

     3.通过TextTestRunner()来运行testSuit

     4.通过TextTestResult()生成测试报告

     5.整个过程集成在unittest.main()模块中

     注:TestCase和TestSuit 可以是一个或多个

  常见断言方法:

    

 

 

例:对MathMethod进行单元测试

MathMethod.py

class MathMethod:
    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

    def multi(self):
        return self.a*self.b

testMathMethod.py

import unittest
import os,sys
current_dir=os.path.dirname(os.path.abspath(__file__))
#print(current_dir)
sys.path.append(current_dir)
#print(sys.path)
from MathMethod import MathMethod

class testMathMethod(unittest.TestCase):

    def test_add_integer(self):
        res=MathMethod(3,5).add()
        self.assertEqual(8,res)

    def test_add_zero(self):
        res=MathMethod(0,0).add()
        self.assertEqual(0,res)

执行测试用例:
runTest.py
import unittest,os,sys
dir_path=os.path.dirname(os.path.abspath(__file__))
sys.path.append(dir_path)
from testMathMethod import testMathMethod
import testMathMethod

#方法一,使用testSuit添加测试用例执行

suit=unittest.TestSuite()  #创建一个suit集 存储测试用例
suit.addTest(testMathMethod('test_add_integer'))  #添加测试用例
suit.addTest(testMathMethod('test_add_zero'))
run=unittest.TextTestRunner()  #实例 TextTestRunner()
run.run(suit)  #执行测试

#方法二 ,使用testLoder加载测试用例到testSuit执行
loder=unittest.TestLoader()  #创建一个加载器
#suit.addTest(loder.loadTestsFromTestCase(testMathMethod))  #通过测试用例名加载测试用例
suit.addTest(loder.loadTestsFromModule(testMathMethod))  #通过模块名加载 测试用例,导入时直接导入模块
run=unittest.TextTestRunner()
run.run(suit)

#生成测试报告
with open('test_result.txt','w+') as file:
    loder=unittest.TestLoader()  #创建一个加载器
    suit.addTest(loder.loadTestsFromModule(testMathMethod)) 
    runner=unittest.TextTestRunner(file,verbosity=2,descriptions='测试报告')
    #verbosity 默认为1,0输出测试执行结果,1 输出测试失败的详细信息  2 输出详细测试执行结果 
    runner.run(suit) 
#自动根据测试用例路径匹配查找测试用例文件(test*.py),并将查找到的测试用例添加到测试套件
suit2=unittest.defaultTestLoader.discover(filepath,pattern='test*.py')

 

posted @ 2020-06-24 12:56  木子的学习笔记  阅读(194)  评论(0编辑  收藏  举报