unittest学习

一、什么是单元测试&单元测试的对象

1.定义:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作
2.单元测试中最核心的四个概念:test case(测试用例),test suite(测试套件),test runner(测试运行器),test fixture(测试环境数据准备和数据清理或者测试脚手架)
 1)test case:一个testcase的实例就是一个测试用例。测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)
 2)TestSuite:多个测试用例集合在一起。
 3)TestLoader:用来加载Testcase到TestSuite中。
 4)TextTestRunner:用来执行测试用例,其中run(test)会执行TestSuite/TestCase中的run(result)方法。
 5)test fixture:测试用例环境的搭建和销毁

image.png

综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

二、初级使用

1.步骤

 1)导入unittest模块,被测文件或者其中的类
 2)创建一个测试类,被继承unittest.TestCase
 3)重写setUp和tearDown方法(如果有初始化条件和结束条件)
 4)定义测试函数,函数名以test_开头
 5)在函数体中使用断言来判断测试结果是否符合预期结果
 6)调用unittset.main()方法运行测试用例--------无此方法也是可以运行

2.使用setUp和tearDown方法,每次执行测试用例都会执行初始化化条件和结束条件

image.png

由代码看到,每次执行用例前都会执行初始化条件和结束条件,两个测试用例,共执行了两次初始化条件和结束条件。

3.设置setupClass和teardownClass:执行所有测试用例,仅执行一次初始化条件和结束条件

image.png

4.断言Assert----结果对比的函数

Method Checks that
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 判断是否是同一现象
assertIsNot(a,b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a,b):a是否在b中 a in b
assertNotIn(a,b) a not in b
assertIsInstance(a,b):实例对象 isInstance(a,b)
assertNotIsInstance(a,b) not isInstance(a,b)

设置断言,当某条测试用例执行失败,不会影响其他测试用例的执行


image.png
image.png

也可以直接用 ==,!=,<=,>=来判断


image.png

写一个方法,通过unittest来执行


image.png

image.png

三、进阶使用

1.TestSuite:

 addTest():添加单个测试用例
 addTests([,,]):添加多个测试用例


image.png

2.addTest的参数:是一个测试用例的列表

 1. 方式一:类名(‘方法名’)的集合
 2.方式二:unittest.TestLoader.discover方法匹配目录下的用例-----用的最多的,测试用例在一个目录下
discover方法中默认匹配模式是从当前目录下找以test开头的py文件。测试用例的顺序执行是根据字母a-z,0-9的顺序执行的。
 3.方式三:unittest.TestLoader.loadTestsFromModule匹配模块中的测试用例
PS:TestLoader类、TestSuite类、TestRunner类需要先实例化再使用

如下是一个单元测试的实例


image.png
#实例:采用unittest.TestLoader.discover方式加载测试用例。
######定义函数:Myclass_test.py
class Myclass_Test():

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

    def sum(self):
        sum = self.a + self.b
        return sum

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

######定义测试类1:test_Myclass1.py
import unittest
from my_Unittest import Myclass_test

class Test_myclass(unittest.TestCase):

    def setUp(self):
        self.myclass = Myclass_test.Myclass_Test(11,10)

    def test_sum(self):
        sum = self.myclass.sum()
        print('class1sum = '+str(sum))
        self.assertEqual(21,sum)

    def test_sub(self):
        sub = self.myclass.sub()
        print('class1sub = '+str(sub))
        self.assertNotEqual(10,sub)

######定义测试类2:test_Myclass2.py
import unittest
from my_Unittest import Myclass_test

class Test_myclass(unittest.TestCase):

    def setUp(self):
        self.myclass = Myclass_test.Myclass_Test(1,10)

    def test_sum(self):
        sum = self.myclass.sum()
        print('class2sum = '+str(sum))
        self.assertEqual(11,sum)

    def test_sub(self):
        sub = self.myclass.sub()
        print('class2sub = '+str(sub))
        self.assertNotEqual(10,sub)

######主函数的调用:Myclass_main.py
import unittest
import os

#实例化测试套件对象
s = unittest.TestSuite()
#实例化TestLoader的对象
loader = unittest.TestLoader()
#使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
run = unittest.TextTestRunner()
run.run(s)

3.测试报告的生成

第一种:text文件----写到txt文件中

#第一种:unittest自带的方法
#创建一个文件,以写的方式打开

import unittest
import os

#实例化测试套件对象
s = unittest.TestSuite()
#实例化TestLoader的对象
loader = unittest.TestLoader()
#使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
fs  = open('test_run_report.txt','w')
run = unittest.TextTestRunner(fs)
run.run(s)

第二种:html测试报告
需下载HTMLTestRunner.py文件,http://tungwaiyip.info/software/HTMLTestRunner.html
下载后放到Python安装目录的Lib目录下即可。同时需修改文件中部分内容,附上链接:https://www.cnblogs.com/hellomaster/p/11040277.html

image.png

HTMLTestRunner参数详解:
verbosity
=1的时候 默认值为1,不限制完整结果,即单个用例成功输出’.’,失败输出’F’,错误输出’E’
=0的时候。不输出信息
=2的时候,需要打印详细的返回信息
--stream:测试报告写入文件的存储区域
--title:测试报告的主题
--description:测试报告的描述

import os
from HTMLTestRunner import *

#  实例化测试套件对象
s = unittest.TestSuite()
#  实例化TestLoader的对象
loader = unittest.TestLoader()
#  使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
with open(os.getcwd() +"/test_report.html","wb") as fp:
    runner = HTMLTestRunner(
        stream=fp,
        verbosity=1,
        title="测试报告标题",
        description="测试报告描述信息",
    )
    runner.run(s)


HTMLTestRunner踩坑记录:
1、导入的时候,尽量写成from HTMLTestRunner import *,如果是import HTMLTestRunner,那么下面调用的时候,要写成HTMLTestRunner.HTMLTestRunner

image.png

https://www.cnblogs.com/hellomaster/p/11040277.html

2、使用with open写入文件的时候,runner.run要放在with open里面
https://www.cnblogs.com/chuiyuedefeng/p/11902018.html

3、因为写入的是二进制文件,所以写入方式要用wb,使用w会报错
https://blog.csdn.net/kingyuan666/article/details/81214954

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容