一、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. PHP base64_decode+gzinflate压缩和解密代码图文教程

    今天碰到的这个问题,是我在更换一个WP主题是遇到.目前的情况如下,我想要把如下的超链接去掉,后台代码找到了在sidebar1.php文件中. 打开此文件发现是一长串的字符: 经过百度.google后, ...

  2. 【系统安全性】四、认证Authentication

    四.认证Authentication 1.为什么要认证 对请求.数据进行认证,判断伪造的数据 HTTP请求很脆弱,抓包软件很强大,容易伪造身份,非法获取数据 2.摘要认证 对象:客户端参数.服务端响应 ...

  3. (转)短信vs.推送通知vs.电子邮件:app什么时候该用哪种方式来通知用户?

    转:http://www.360doc.com/content/15/0811/00/19476362_490860835.shtml 现在,很多公司都关心的一个问题是:要提高用户互动,到底采取哪一种 ...

  4. Jquery里live事件移除原因

    live()事件 $('a').live('click', function() { alert("That tickles!") }); live事件Jq把alert函数绑定到$ ...

  5. Machine Learning 之二,什么监督性学习,非监督性学习。

    1.什么是监督性学习?Supervised  Machine Learning. 在监督性学习,我们给定一个数据集以及我们已经知道正确输出的结果,然后找到一个输入和输出的关系. In Supervis ...

  6. 基本TCP Sockets编程

    一.socket 函数 #include <sys/socket.h> int socket (int family, int type, int protocol); Returns: ...

  7. Python学习笔记(九)——字符串

    # 5.1 字符串的拼接 str1 = '我今天一共走了' num = 1280 str2 = '步' print(str1+str(num)+str2) # 计算字符串长度 print(len(st ...

  8. leetcode-399-除法求值

    方法一:dfs+图 class Solution: def calcEquation(self, equations: List[List[str]], values: List[float], qu ...

  9. idea bug解决

    1.编译时错误:软件包 javax.servlet.http 不存在import javax.servlet.http.HttpServletRequest 解决办法:把servlet-api.jar ...

  10. 判断访问浏览器客户端类型(pc,mac,ipad,iphone,android)

    <script type="text/javascript"> //平台.设备和操作系统 var system = { win: false, mac: false, ...