python之单元测试框架—unittest(补充)

一. unittest最核心的四个概念

unittest中最核心的四个概念是:test case,test suite,test runner,test fixture

TestCase:一个testcase的实例就是一个测试用例:测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)

TestSuite:多个测试用例集合在一起

TestLoader:是用来加载TestCase到TestSuite中的

TextTestRunner:用来执行测试用例的。其中的run(test)会执行TestSuite/TestCase中的run(result)方法

TextTestResult:保存TextTestRunner执行的测试结果

fixture:测试用例环境的搭建和销毁(setUp/setUpClass,tearDown/tearDownClass)

二. unittest初级使用

1. 导入unittest模块、被测文件或者其中的类

2. 创建一个测试类,并继承unittest.TestCase

3. 重写setUp和tearDown方法(如果有初始化条件和结束条件)

4. 定义测试函数,函数以test_开头

5. 在函数体中使用断言来判断测试结果是否符合预期结果

6. 调用unittest.main()方法来运行测试用例

实例

1. 在工程下创建一个My_UnitTest的包,在这个包下面,创建一个被测对象myClass.py和一个测试用例Test_Myclass.py

2. 如果要测试数学中的加法和减法,测试对象myClass.py的内容为

class Math:

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

    def minus(self, a, b):
        return a - b

3. 在测试用例中引入unittest,被测文件中的类,注意测试用例是以test_开头

import unittest
from revise.My_UnitTest.myClass import Math

class Test_MyClass(unittest.TestCase):

    def setUp(self):
        self.m = Math()

    def tearDown(self):
        pass

    def test_add(self):
        result = self.m.add(100, 23)
        self.assertEqual(123, result)

    #减法
    def test_minus(self):
        result = self.m.minus(235, 111)
        self.assertEqual(124, result)

4. 测试用例的执行顺序是以字母a-z和数字的从小到大的顺序来排列的,所以上述两个测试用例执行的顺序是add在前,minus再后,可以改改代码验证一下:

import unittest
from revise.My_UnitTest.myClass import Math

class Test_MyClass(unittest.TestCase):

    def setUp(self):
        self.m = Math()

    def tearDown(self):
        pass

    def test_add(self):
        result = self.m.add(100, 23)
        print("我先执行")
        self.assertEqual(123, result)

    #减法
    def test_minus(self):
        result = self.m.minus(235, 111)
        print("我后执行")
        self.assertEqual(124, result)

运行结果:

Testing started at 12:36 ...
D:\Program\python34\python.exe "D:\Program\PyCharm 2018.1.4\helpers\pycharm\_jb_unittest_runner.py" --path D:/python_workshop/python6/revise/My_UnitTest/Test_Myclass.py
Launching unittests with arguments python -m unittest D:/python_workshop/python6/revise/My_UnitTest/Test_Myclass.py in D:\python_workshop\python6\revise\My_UnitTest
我先执行
我后执行

Ran 2 tests in 0.001s

OK

如果希望minus先执行,add后执行,可以给前者函数名加一个1,后者加一个2

    def test_2_add(self):
        result = self.m.add(100, 23)
        print("我后执行")
        self.assertEqual(123, result)

    #减法
    def test_1_minus(self):
        result = self.m.minus(235, 111)
        print("我先执行")
        self.assertEqual(124, result)

5. 如果在setUp里实例化被测文件中的类,那么每一条测试用例都要实例化一次被测类,用setUpClass()可以只实例化一次,同理,tearDownClass也只做一次收尾工作

    @classmethod
    def setUpClass(cls):
        cls.m = Math()

    @classmethod
    def tearDownClass(cls):
        pass

6. 用unittest.main()的方法来运行测试用例Test_Myclass.py

import unittest
from revise.My_UnitTest.myClass import Math

class Test_MyClass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.m = Math()

    @classmethod
    def tearDownClass(cls):
        pass

    def test_2_add(self):
        result = self.m.add(100, 23)
        print("我后执行")
        self.assertEqual(123, result)

    #减法
    def test_1_minus(self):
        result = self.m.minus(235, 111)
        print("我先执行")
        self.assertEqual(124, result)

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

三. 断言Assert

TestCase类提供了一系列的断言,即结果比对的函数


Method


Checks that


New in


assertEqual(a, b)


a == b

 

assertNotEqual(a, b)


a != b

 

assertTrue(x)


bool(x) is True

 

assertFalse(x)


bool(x) is False

 

assertIs(a, b)


a is b


3.1


assertIsNot(a, b)


a is not b


3.1


assertIsNone(x)


x is None


3.1


assertIsNotNone(x)


x is not None


3.1


assertIn(a, b)


a in b


3.1


assertNotIn(a, b)


a not in b


3.1


assertIsInstance(a, b)


isinstance(a, b)


3.2


assertNotIsInstance(a, b)


not isinstance(a, b)


3.2

四. unittest进阶使用

方式一:类名("方法名")的集合

testsuite:

  addTest()  添加一个测试用例

  addTests([..])  添加多个测试用例,addTests的参数是一个测试用例的集合

  注意:addTests中执行用例的顺序是按添加的先后顺序进行的,如果这样添加用例可能造成断言失败:

  suite.addTests([TestFileOperate("test_00_read_all"),
                TestFileOperate("test_01_write_data"),
                TestFileOperate("test_03_read_all"),
                TestFileOperate("test_02_add_data")])

  正确的做法是:

  suite.addTests([TestFileOperate("test_00_read_all"),
                TestFileOperate("test_01_write_data"),
                TestFileOperate("test_02_add_data"),
                TestFileOperate("test_03_read_all")])

s = unittest.TestSuite()

s.addTest(testStudent("test_do_homework"))

runner = unittest.TextTestRunner()

runner.run(s)

实例1:addTest的使用

在My_UnitTest包下创建一个main.py

main.py中的代码如下:

import unittest
from revise.My_UnitTest.Test_Myclass import Test_MyClass

#实例化测试套件对象
s = unittest.TestSuite()
#调用addTest来加载测试用例——addTest(类名("用例函数名称"))——添加一个测试用例
s.addTest(Test_MyClass("test_add"))
s.addTest(Test_MyClass("test_minus"))

#使用TextTestRunner来运行测试用例
#实例化
runner = unittest.TextTestRunner()
#用run方法就是用来运行测试用例的
runner.run(s)

运行结果,控制台输出如下:

D:\Program\python34\python.exe D:/python_workshop/python6/revise/My_UnitTest/main.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

实例2:addTests的使用

import unittest
from revise.My_UnitTest.Test_Myclass import Test_MyClass

#实例化测试套件对象
s = unittest.TestSuite()
#加载多个测试用例——参数为列表——列表当中为测试用例
s.addTests([Test_MyClass("test_add"), Test_MyClass("test_minus")])
#使用TextTestRunner来运行测试用例
#实例化
runner = unittest.TextTestRunner()
#用run方法就是用来运行测试用例的
runner.run(s)

运行结果:

D:\Program\python34\python.exe D:/python_workshop/python6/revise/My_UnitTest/main.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

输出测试报告-text-到文件

#创建一个文件,以写的方式打开

fs = open("test_result.txt", "w")

runner = unittest.TextTestRunner(fs)

runner.run(s)

实例3:输出测试报告到文件

import unittest
from revise.My_UnitTest.Test_Myclass import Test_MyClass

#实例化测试套件对象
s = unittest.TestSuite()
#加载多个测试用例——参数为列表——列表当中为测试用例
s.addTests([Test_MyClass("test_add"), Test_MyClass("test_minus")])

#使用TextTestRunner来运行测试用例
#打开一个文件
fs = open("test_run_result.txt", "w")
#实例化
runner = unittest.TextTestRunner(fs)
#用run方法就是用来运行测试用例的
runner.run(s)

运行结果,控制台没有输出,发现当前目录下多了一个文本文件test_run_result.txt

控制台输出的信息写到文本文件中了

方式二:unittest.TestLoader.discover方法匹配目录下的用例

假如现在目录下存在两个测试用例,Test_Myclass.py和Test)_Myclass2.py,如果用addTests的方法添加用例到测试套件,未免有点麻烦,这时候需要使用TestLoader()这个类

代码如下:

import unittest, os

#实例化测试套件对象
s = unittest.TestSuite()
#1.实例化TestLoader对象  2.使用discover去找到一个目录下的所有测试用例
loader = unittest.TestLoader()
#3.使用addTests将找到的测试用例放在测试套件下
s.addTests(loader.discover(os.getcwd()))
#运行
runner = unittest.TextTestRunner()
runner.run(s)

运行结果:

....
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK

注意:源码中discover方法, start_dir是要寻找的目录路径,pattern是查找条件,即在指定的目录下查找以"test"开头的测试用例(事实上,这个查找是不区分大小写的,即Test开头的也能找到)

方式三:unittest.TestLoader.loadTestsFromModule匹配模块中的测试用例

ps:TetLoader类、TestSuite类需要先实例化再使用

五. 美化测试报告—html

python有提供第三方库支持输出的测试报告为html样式

库名:HtmlTestRunner

导入:from HtmlTestRunnerNew import HTMLTestRunner

使用方式:

s = unittest.TestSuite()

s.addTests(测试用例)

fp = open(dir_config.htmlreport_dir + "/API_autoTest_{0}.html".format(curTime), "wb")

runner = HTMLTestRunnerNew.HTMLTestRunner(

      stream = fp,

      title = "QCD接口测试报告",

      description = "QCD接口测试报告",

      tester = "xiaozhai"

      )

runner.run(s)

代码修改如下:

import unittest, os, time
from HTMLTestRunnerNew import HTMLTestRunner

#实例化测试套件对象
s = unittest.TestSuite()
#1.实例化TestLoader对象  2.使用discover去找到一个目录下的所有测试用例
loader = unittest.TestLoader()
#3.使用addTests将找到的测试用例放在测试套件下
s.addTests(loader.discover(os.getcwd()))

#获取当前时间
curTime = time.strftime("%Y-%m-%d_%H-%M-%S")
#在当前目录下创建一个html文件
fp = open(os.getcwd() + "/autoTest_report_{0}.html".format(curTime), "wb")

#运行测试用例,生成测试报告
runner = HTMLTestRunner(
        stream=fp,
        title="单元测试报告",
        description="Math类的单元测试报告",
        tester="xiaozhai"
)
runner.run(s)

运行效果:

D:\Program\python34\python.exe D:/python_workshop/python6/revise/My_UnitTest/main.py
ok test_add (Test_Myclass.Test_MyClass)
ok test_minus (Test_Myclass.Test_MyClass)
ok test_add (Test_Myclass2.Test_MyClass2)
ok test_minus (Test_Myclass2.Test_MyClass2)

Time Elapsed: 0:00:00.001000
Sun Jul  8 18:17:18 2018 - Start Test:test_add (Test_Myclass.Test_MyClass)
Sun Jul  8 18:17:18 2018 - Start Test:test_minus (Test_Myclass.Test_MyClass)
Sun Jul  8 18:17:18 2018 - Start Test:test_add (Test_Myclass2.Test_MyClass2)
Sun Jul  8 18:17:18 2018 - Start Test:test_minus (Test_Myclass2.Test_MyClass2)

参考文章

https://blog.csdn.net/huilan_same/article/details/52944782

原文地址:https://www.cnblogs.com/cnhkzyy/p/9250664.html

时间: 2024-11-06 10:17:52

python之单元测试框架—unittest(补充)的相关文章

Python单元测试框架unittest之深入学习

前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图(下面的类图以及解释均来源于网络,原文链接): 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程,包括测

第六章:单元测试框架unittest

单元测试框架unittest 单元测试 单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等.总的来说,单元就是人为规定的最小的被测功能模块. 单元测试框架 在单元测试框架出现之前,开发人员在创建可执行测试时饱受折磨.最初的做法是在应用程序中创建一个窗口,配有"测试控制工具(harness)".它只是一

Python单元测试框架 unittest

Python单元测试框架 作者: Steve Purcell, <stephen_purcell at yahoo dot com>翻译: Heiz, <heiz dot yuan at gmail dot com>项目网站: http://pyunit.sourceforge.net/ 目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代

Python必会的单元测试框架 —— unittest

用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库--unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那你用unittest来应该是很轻松的,它们的工作方式都差不多. unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 下面我们分别来解释这四个概念的意思,先来看一张unittest的静态

Python单元测试框架 —— unittest

文章转自 :https://blog.csdn.net/huilan_same/article/details/52944782 unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那你用unittest来应该是很轻松的,它们的工作方式都差不多. unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture 下面我们分别来解释这四个概念的意思,先来看一张unittes

Python单元测试框架unittest测试过程简介

测试步骤 1. 导入unittest模块 import unittest 2. 编写测试的类继承unittest.TestCase class Tester(unittest.TestCase) 3. 编写测试的方法必须以test开头 def test_add(self) def test_sub(self) 4.使用TestCase class提供的方法测试功能点 Method Checks that New in assertEqual(a, b) a == b   assertNotEqu

单元测试框架Unittest

Unittest官方 4个重要概念: Test fixture(测试固件):初始化.清除 Test case(测试用例),test suite(测试套件),test runner(测试运行器) 两种单元测试加载方法: 1.unittest.main() 2.将所有test case 添加到test suit中,然后一次性加载 知识点: 1.测试类要继承unittest.TestCase类 2.每个用例方法 test开头(self) 3.setUp和tearDown方法在每个用例执行前后都会执行

Python自动单元测试框架(摘要笔记)

规范Python单元测试 原文:https://www.ibm.com/developerworks/cn/linux/l-pyunit/ 测试是一个贯穿于整个开发过程的连续过程,从某个意义上说,软件开发的过程实际上就是测试过程.正如Martin Fowler所说的"在你不知道如何测试代码之前,就不该编写程序.而一旦你完成了程序,测试代码也应该完成.除非测试成功,你不能认为你编写出了可以工作的程序." 测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试

[转] Python自动单元测试框架

一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的"很好的状态"得加个问号).测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题. 可惜的是,软件开发人员很少能在编码