一、unittest核心概念

1.unittest四个核心概念

unittest四个核心概念包括:TestCase、TestSuite、TestRunner、Test Fixture
TestCase:即测试用例,测试用例是最小的测试单元。 它检查对一组特定输入的特定响应。 unittest提供了一个基类TestCase,它可用于创建一个新的测试用例。
一个TestCase的实例就是一个测试用例。一个测试用例就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
 
TestSuite:即测试套件,他是多个测试用例或者测试套件聚合在一起的集合,TestSuite可以嵌套TestSuite。
 
TestRunner:TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
 
Test Fixture:测试用例环境的搭建和销毁,在测试用例执行之前和之后会做的一些操作
 

2.unittest属性

unitte包含很多属性,其中常见的属性如下:

'TestResult', 'TestCase', 'TestSuite','TextTestRunner', 'TestLoader'
'FunctionTestCase', 'main','defaultTestLoader', 'SkipTest', 'skip',
'skipIf', 'skipUnless','expectedFailure', 'TextTestResult',
'installHandler','registerResult', 'removeResult', 'removeHandler'
from .result import TestResult
from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
skipUnless, expectedFailure)
from .suite import BaseTestSuite, TestSuite
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
findTestCases)
from .main import TestProgram, main
from .runner import TextTestRunner, TextTestResult
from .signals import installHandler, registerResult, removeResult, removeHandler

二、testCase

 

1.TestCase所含的方法

使用unittest是,需要创建一个类,该类继承unittest.TestCase,次数这个类可以看做是一个测试用例:
例如:class unTest(unittest.TestCase):
TestCase也是一个类,该类继承Object,这个类里面还有很多很多很多的方法,常用的就有:setUp、tearDown、setUpClass、tearDownClass、run以及各种断言方法。

'addCleanup', 'addTypeEqualityFunc', 'assertAlmostEqual',
'assertAlmostEquals', 'assertCountEqual', 'assertDictContainsSubset',
'assertDictEqual', 'assertEqual', 'assertEquals', 'assertFalse',
'assertGreater', 'assertGreaterEqual', 'assertIn', 'assertIs',
'assertIsInstance', 'assertIsNone', 'assertIsNot', 'assertIsNotNone',
'assertLess', 'assertLessEqual', 'assertListEqual', 'assertLogs',
'assertMultiLineEqual', 'assertNotAlmostEqual', 'assertNotAlmostEquals',
'assertNotEqual', 'assertNotEquals', 'assertNotIn',
'assertNotIsInstance', 'assertNotRegex',
'assertNotRegexpMatches', 'assertRaises', 'assertRaisesRegex',
'assertRaisesRegexp', 'assertRegex', 'assertRegexpMatches',
'assertSequenceEqual', 'assertSetEqual', 'assertTrue',
'assertTupleEqual', 'assertWarns', 'assertWarnsRegex',
'assert_', 'countTestCases', 'debug', 'defaultTestResult',
'doCleanups', 'fail', 'failIf', 'failIfAlmostEqual',
'failIfEqual', 'failUnless', 'failUnlessAlmostEqual',
'failUnlessEqual', 'failUnlessRaises', 'failureException', 'id',
'longMessage', 'maxDiff', 'run', 'setUp', 'setUpClass',
'shortDescription', 'skipTest', 'subTest', 'tearDown',
'tearDownClass'

2.几个常用方法讲解

(1)setUp和tearDown
setUp是前置设置条件,在自动化测试中setUp主要是进行测试前的初始化工作,比如在接口测试前面做一些前置的参数赋值,数据库操作等,一个测试用例执行之前,会先执行setUp方法,有几个测试用例,就会执行几次setUp方法
tearDown后置还原工作,teardown是测试后的清除工作,比如参数还原或销毁,数据库的还原恢复等,和setUp方法一样,有几个测试用例就执行几次

import unittest

class unTest(unittest.TestCase):
def setUp(cls):
print("前置条件执行~\n")
def tearDown(cls):
print("后置条件执行~")
def test_add(self):
print(2+3)
def test_minus(self):
print(3-2)
if __name__ == '__main__':
unittest.main()
运行结果:上面一共有两个方法(测试用例),所以setUp和tearDown都各执行了两次

(2)setUpClass和tearDownClass
setUpClass和tearDownClass的功能和setUp、tearDown类似,不同的是,setUpClass和tearDownClass在整个测试模块中,只会执行一次,即所有测试用例执行之前执行setUpClass,在所有测试用例执行完成之后,执行tearDownClass
注意:在使用setUpClass和tearDownClass之前,记得添加一个@classmethod

import unittest

class unTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass前置条件执行~\n")
@classmethod
def tearDownClass(cls):
print("tearDownClass后置条件执行~")
def test_add(self):
print(2+3)
def test_minus(self):
print(3-2)
if __name__ == '__main__':
unittest.main()
执行结果如下:

三、TestSuite

 
把多个测试用例集合在一起,需要用到testsuite套件,使用testsuite的作用是,用例可以按照添加的前后顺序来执行(执行顺序后面会分开讲),前面说过,把测试用例放入到suite集合中,需要用TestLoad来进行导入。例:

import unittest

class unTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass前置条件执行~\n")
@classmethod
def tearDownClass(cls):
print("tearDownClass后置条件执行~")
def test_add(self):
print(2+3)
def test_minus(self):
print(3-2)
if __name__ == '__main__':
unittest.main()
以上的代码进行改造,把if后面的代码去掉,换成suite模式
 

1.按模块加载TestLoader()

方法是:(1)定义一个集合名称,一般直接用suite(也可以自己取名)
     (2)调用unittest的TestLoader()方法,把测试用例添加到集合suite中
       (3)调用unittest的TextTestRunner()方法执行集合里面的测试用例

import unittest
class unTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass前置条件执行~\n")
@classmethod
def tearDownClass(cls):
print("tearDownClass后置条件执行~")
def test_add(self):
print(2+3)
def test_minus(self):
print(3-2)
suite=unittest.TestLoader().loadTestsFromTestCase(unTest)
unittest.TextTestRunner(verbosity=2).run(suite)

2.按类加载makeSuite

suite=unittest.TestSuite(unittest.makeSuite(类名)),这种方法会加载类中所有的测试用例

import unittest
from test01 import * suite=unittest.TestSuite(unittest.makeSuite(unTest02))
unittest.TextTestRunner(verbosity=2).run(suite)

3.addTest方法

suite=unittest.TestSuite()
suite.addTest(unTest("test_add"))
这种方法是逐个加载类中的测试用例

import unittest
from test01 import * suite=unittest.TestSuite()
suite.addTest(unTest("test_add"))
suite.addTest(unTest("test_minus"))
suite.addTest(unTest02("test_multi"))
unittest.TextTestRunner(verbosity=2).run(suite)

四、TestLoader

testloader是unittest中的一个方法,作用是把测试用例加载到集合中,加载的方式一共有4中:
loadTestsFromTestCase、loadTestsFromModule、loadTestsFromName、loadTestsFromNames

1.loadTestsFromTestCase方法

loadTestsFromTestCase是按类加载方式,即通过加载类,把该类下面的所有的测试用例(方法)加载到suite集合中:loadTestsFromTestCase(类名)

import unittest
class unTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass前置条件执行~\n")
@classmethod
def tearDownClass(cls):
print("tearDownClass后置条件执行~")
def test_add(self):
print(2+3)
def test_minus(self):
print(3-2)
#通过类加载,把unTest下面所有的方法都添加到suite中
suite=unittest.TestLoader().loadTestsFromTestCase(unTest)
unittest.TextTestRunner(verbosity=2).run(suite)

2.loadTestsFromModule方法

loadTestsFromModule方法是按模块加载测试用例,loadTestsFromModule括号里面是模块名
模块一:test01.py,里面有两个类,一共5个方法

import unittest
class unTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass前置条件执行~\n")
@classmethod
def tearDownClass(cls):
print("tearDownClass后置条件执行~")
def test_add(self):
print(2+3)
def test_minus(self):
print(3-2)
class unTest02(unittest.TestCase):
def test_multi(self):
print(2 * 3)
同目录下,另创建一个模块:test_run.py

import unittest
import test01#导入模块一:test01 suite=unittest.TestLoader().loadTestsFromModule(test01)
unittest.TextTestRunner(verbosity=2).run(suite)
执行结果:

3.loadTestsFromName方法

loadTestsFromName(self, name, module=None),括号中name是字符串类型,即测试用例名称,module是模块名,可写可以不写,如果写了模块名,则name中就不必再指出属于哪个模块,如果不写module,则name中从module开始
test01为上面第 2点的一个模块,在另一个test.run.py模块中
(1)name=’test01.unTest.test_minus‘,module不填,运行结果也是正常的
import unittest

suite=unittest.TestLoader().loadTestsFromName('test01.unTest.test_minus')
unittest.TextTestRunner(verbosity=2).run(suite)
(2)name='unTest.test_minus',module=test01,下面两种方法运行都正常,运用module时,记得要先导入模块

import unittest
import test01 suite=unittest.TestLoader().loadTestsFromName('unTest.test_minus',test01)
#suite=unittest.TestLoader().loadTestsFromName('unTest.test_minus',module=test01)
unittest.TextTestRunner(verbosity=2).run(suite)

4.loadTestsFromNames方法

loadTestsFromNames方法和loadTestsFromName方法类似,只不过loadTestsFromNames(self,names,module)中,names是一个列表,即同时加载同个模块中的多个测试用例

import unittest
import test01 suite=unittest.TestLoader().loadTestsFromNames(['unTest.test_minus','unTest.test_add'],test01)
unittest.TextTestRunner(verbosity=2).run(suite)

五、TextTestRunner

TextTestRunner()也是一个类,继承object,该类下面有两个常用的方法:_makeResult()、run(),所以要使用run方法执行suite,需要先调用这个类

unittest.TextTestRunner().run(suite)
TextTestRunner()括号中可以带一个参数verbosity
sun()方法是执行测试集合

六、输出测试报告

unittest默认输出的测试报告是控制台模式的,也有txt和html模式

1.输出txt格式

测试报告txt格式使用的方法是unittest自带的TextTestRunner()方法
import unittest
import test01 suite=unittest.TestLoader().loadTestsFromModule(test01)
filename=r"F:\reports\test.txt"
file=open(filename,'a')
runner=unittest.TextTestRunner(
stream=file,
descriptions=True,
verbosity=2
)
runner.run(suite)

2.输出html格式

unittest组件HTMLTestRunner可以生成一个简单的的HTML报告
使用方法:
(1)设置测试报告的保存路径,比如保存在F盘的reports文件夹下,报告的文件明个为:re.html,路径为:F:\\reports\re.html

filename=“F:\\reports\re.html"
(2)把运行结果写到re.html文件中

file=open(filename,"wb")
(3)初始化runner

runner = HTMLTestRunner.HTMLTestRunner(
stream=file,
title="测试标题",
description="报告中的文字描述"
)
stream:是测试报告存放的地方和报告的名字
title:是报告中显示最上方的标题
description:是展示在报告中的文字描述
(4)运行脚本

runner.run(suite)
例如打印一个简单的报告:

import unittest
import test01
import HTMLTestReportCN suite=unittest.TestLoader().loadTestsFromModule(test01)
filename=r"F:\reports\test.html"
file=open(filename,'wb')
runner=HTMLTestReportCN.HTMLTestRunner(
stream=file,
title="html测试报告",
tester="joba",
verbosity=2
)
runner.run(suite)
其中
(1)html写进文件中时,需要用“wb"二进制的格式
(2)HTMLTestReportCN是中文的报告格式,需要从网上下载py文件HTMLTestReportCN:以中文形式输出报告,使用形式和HTMLTestRunner差不多,只是在初始化runner稍有差异,可以带tester,对比英文版如下:

unittest(1)的更多相关文章

  1. 理解unittest(六)

    unittest,顾名思义就是一个单元测试框架,但是它不仅适用于单元测试,还适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成 ...

  2. unittest(一)IDE导出的代码分析

    在 Python 语言下有诸多单元测试框架,如 unittest.Pytest.nose 等,其中 unittest 框架(原名 PyUnit 框架)为 Python 语言自带的单元测试框架,从 Py ...

  3. unittest(简介)

    一.unittest框架介绍: unittest框架是python中的一个单元测试框架,该模块包括许多的类如 TestCase 类.TestSuite 类.TextTestRunner 类.TestR ...

  4. Python单元测试框架:unittest(二)

    一.直接使用TestCase 注意所有测试方法都需要以test开头.代码如下: import unittest class Test1(unittest.TestCase): @classmethod ...

  5. Python unittest(PyUnit)单元测试框架

    PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...

  6. unittest(8)- 学习ddt

    import unittest from ddt import ddt, data, unpack """ 1.正常情况下,测试函数(即测试用例)中不可以传参,如果要使用 ...

  7. python单元测试框架-unittest(五)之跳过测试和预期失败

    概要 @unittest.skip(reason): skip(reason)装饰器:直接跳过测试,并说明跳过测试的原因. @unittest.skipIf(reason): skipIf(condi ...

  8. python单元测试框架-unittest(四)之用例综合框架管理

    简述为何如要框架? 前面测试用例与执行都是写在一个文件,当用例数量不断增加的时候,用例的执行与管理变得非常麻烦,因此需要对用例根据具体的功能模块来使用单独的模块来管理.就像一所学校要根据不同年级进行分 ...

  9. python单元测试框架-unittest(三)之用例执行顺序

    执行顺序规则: 测试类或测试方法的数字与字母顺序0~9,A-Z 执行如下脚本,理解用例执行顺序 #coding=utf-8 import unittest class Test1(unittest.T ...

随机推荐

  1. 基于VMWare配置VxWorks开发环境

    常规VxWorks的开发环境都是基于目标开发板或目标机来构建的,但并非所有人都具备这样的条件,所以本文主要介绍如何基于vmware来构建VxWorks开发环境.   Step 1. 安装vmware ...

  2. 【hive 日期函数】Hive常用日期函数整理

    1.to_date:日期时间转日期函数 select to_date('2015-04-02 13:34:12');输出:2015-04-02122.from_unixtime:转化unix时间戳到当 ...

  3. 词表征 3:GloVe、fastText、评价词向量、重新训练词向量

    原文地址:https://www.jianshu.com/p/ca2272addeb0 (四)GloVe GloVe本质是加权最小二乘回归模型,引入了共现概率矩阵. 1.基本思想 GloVe模型的目标 ...

  4. HDU 6697 Closest Pair of Segments (计算几何 暴力)

    2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...

  5. C++ 操作json文件

    一.环境搭建: 参考文章:https://blog.csdn.net/fakine/article/details/79272090 二.创建实例: #include <stdio.h> ...

  6. git常用操作笔记

    这是我看了廖雪峰的git教程,写的笔记,仅作为一个学习的记录 一.大多数我们面临的是已经有一个进行中的项目了,我们只需克隆下来就可以了 1.安装git,安装完后,可输入git,回车,查看是否已安装 2 ...

  7. 2018-2-13-win10-uwp-音频

    title author date CreateTime categories win10 uwp 音频 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...

  8. ADS 命令行命令介绍

    armasm 1. 命令:armasm [选项] -o 目标文件 源文件 2. 选项说明 -Errors 错误文件名        ;指定一个错误输出文件 -I 目录[,目录]          ;指 ...

  9. Oracle之数据类型问题

    做项目涉及到Oracle数据库中数据类型:字符串型的问题 我不太清楚varchar(32)到底代表着什么? 通过搜索了解到:oracle中有三种常用的类型:varchar2(byte),varchar ...

  10. pandas--排序和排名

    排序 要对行或列索引进行排序,可使用sort_index方法,它将返回一个已排序的新对象: Series 1.对Series索引排序 obj=Series(range(4),index=['d','a ...