一、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. HIve分组查询返回每组的一条记录

    select a.lng,a.lat from (select row_number() over ( partition by uid,grid_id) as rnum,weighted_centr ...

  2. CSS:CSS 尺寸 (Dimension)

    ylbtech-CSS:CSS 尺寸 (Dimension) 1.返回顶部 1. CSS 尺寸 (Dimension) CSS 尺寸 (Dimension) 属性允许你控制元素的高度和宽度.同样,它允 ...

  3. springBoot使用PageHelper当超过最大页数后仍然返回数据

    在SpringBoot中使用PageHelper分页插件时,如果设置pagehelper.reasonable=true时,pageNum<=0 时会查询第一页, pageNum>page ...

  4. CPU指令集的虚拟化(x86)

    IA-32 (x86)[edit] Main article: X86 virtualization The IA-32 instruction set of the Pentium processo ...

  5. HDU 6693 Valentine's Day (概率)

    2019 杭电多校 10 1003 题目链接:HDU 6693 比赛链接:2019 Multi-University Training Contest 10 Problem Description O ...

  6. Java jar文件

    JAR(Java Archive)是基于ZIP文件格式的文件格式. 它用于捆绑Java应用程序或小程序的资源,类文件,声音文件,图像等. 它还提供数据压缩.一个JAR文件作为一种特殊类型的ZIP文件. ...

  7. mariadb入门

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方 ...

  8. 四(2)、springcloud之Ribbon负载均衡

    2.Ribbon负载均衡 ​ Ribbon在工作时分成两步第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server. 第二步再根据用户指定的策略,在从server取到的 ...

  9. span里面插入文字

    .text-box span::before{   content:attr(data-text);}

  10. 【HDOJ】 P2054 A == B ?

    题目意思不太多解释,具体WA的情况可以举出一下特例 0 +0 0.00 0 +1 -2 +1.00 -1.00 +.2 -.2 .0 .1 等等 不过可以发现对上面的数据处理,可以分为以下几步 1.找 ...