unittest单元测试框架

news2024/11/25 7:07:58

目录

前言:

一、unittest模块的各个属性说明

二、使用unittest框架编写测试用例思路

三、使用unittest框架编写测试用例实例


前言:

unittest是Python自带的单元测试框架,可以用于编写和执行单元测试。

一、unittest模块的各个属性说明

点击返回目录

    先来聊一聊unittest模块的各个属性,所谓知己知彼方能百战百胜,了解unittest的各个属性,对于后续编写用例有很大的帮助。

1.unittest的属性如下:

['BaseTestSuite', 'FunctionTestCase', 'SkipTest', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'TestSuite', 'TextTestResult',
'TextTestRunner', '_TextTestResult', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__unittest',
'case', 'defaultTestLoader', 'expectedFailure', 'findTestCases', 'getTestCaseNames', 'installHandler', 'loader', 'main',  'makeSuite', 
'registerResult', 'removeHandler', 'removeResult', 'result', 'runner', 'signals', 'skip', 'skipIf', 'skipUnless', 'suite', 'util']

说明:

1、unittest.TestCase:TestCase类,所有测试用例类继承的基本类。

class BaiduTest(unittest.TestCase):

2、unittest.main():使用她可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。

(1)执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

3、unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。

4、unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。

5、unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:

discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

6、unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure(): expectedFailure()测试标记为失败。

2.TestCase类的属性如下:

['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'_addSkip', '_baseAssertEqual', '_classSetupFailed', '_deprecate', '_diffThreshold', '_formatMessage', '_getAssertEqualityFunc',
'_truncateMessage', 'addCleanup', 'addTypeEqualityFunc', 'assertAlmostEqual', 'assertAlmostEquals', 'assertDictContainsSub
set', 'assertDictEqual', 'assertEqual', 'assertEquals', 'assertFalse', 'assertGreater', 'assertGreaterEqual', 'assertIn', 'assertIs', 'assert
IsInstance', 'assertIsNone', 'assertIsNot', 'assertIsNotNone', 'assertItemsEqual', 'assertLess', 'assertLessEqual', 'assertListEqual',
'assertMultiLineEqual', 'assertNotAlmostEqual', 'assertNotAlmostEquals', 'assertNotEqual', 'assertNotEquals', 'assertNotIn', 
'assertNotIsInstance', 'assertNotRegexpMatches', 'assertRaises', 'assertRaisesRegexp', 'assertRegexpMatches', 'assertSequence
Equal', 'assertSetEqual', 'assertTrue', 'assertTupleEqual', 'assert_', 'countTestCases', 'debug', 'defaultTestResult', 'doCleanups', 
'fail', 'failIf', 'failIfAlmostEqual', 'failIfEqual', 'failUnless', 'failUnlessAlmostEqual', 'failUnlessEqual', 'failUnlessRaises', 'failureException',
'id', 'longMessage', 'maxDiff', 'run', 'setUp', 'setUpClass', 'shortDescription', 'skipTest', 'tearDown', 'tearDownClass']

说明:

1、setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。

2、tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。

3、assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。
assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。
assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。
assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。
assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。
assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。
assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。
assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。
assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。
assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。
assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。
assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。

3.TestSuite类的属性如下:(组织用例时需要用到)

['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__module__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'_addClassOrModuleLevelException', '_get_previous_module', '_handleClassSetUp', '_handleModuleFixture', '_handleModule
TearDown', '_tearDownPreviousClass', '_tests', 'addTest', 'addTests', 'countTestCases', 'debug', 'run']

说明:

addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。

                    suite = unittest.TestSuite()
suite.addTest(test_baidu.BaiduTest('test_baidu'))

4.TextTextRunner的属性如下:(组织用例时需要用到)

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_makeResult', 'buffer', 'descriptions',
'failfast', 'resultclass', 'run', 'stream', 'verbosity']

说明:

run(): run()方法是运行测试套件的测试用例,入参为suite测试套件。
runner = unittest.TextTestRunner()
runner.run(suite)

二、使用unittest框架编写测试用例思路

设计基本思路如下:

# coding=utf-8  #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
#2.注释:包括记录创建时间,创建人,项目名称。
'''Created on 2016-7-27
@author: Jennifer
Project:使用unittest框架编写测试用例思路
'''
#3.导入unittest模块
import unittest
#4.定义测试类,父类为unittest.TestCase。
#可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。
#可继承unittest.TestCase的各种断言方法。
class Test(unittest.TestCase):
#5.定义setUp()方法用于测试用例执行前的初始化工作。#注意,所有类中方法的入参为self,定义方法的变量也要“self.变量”#注意,
输入的值为字符型的需要转为int型
    def setUp(self):
        self.number=raw_input('Enter a number:')
        self.number=int(self.number)
======================================================================最重要的一点
#6.定义测试用例,以“test_”开头命名的方法#注意,方法的入参为self#可使用unittest.TestCase类下面的各种断言方法用于对测试
结果的判断#可定义多个测试用例#最重要的就是该部分
    def test_case1(self):
        print self.number
        self.assertEqual(self.number,10,msg='Your input is not 10')
        
    def test_case2(self):
        print self.number
        self.assertEqual(self.number,20,msg='Your input is not 20')
 
    @unittest.skip('暂时跳过用例3的测试')
    def test_case3(self):
        print self.number
        self.assertEqual(self.number,30,msg='Your input is not 30')
=========================================================================
#7.定义tearDown()方法用于测试用例执行之后的善后工作。#注意,方法的入参为self
    def tearDown(self):
        print 'Test over'
#8如果直接运行该文件(__name__值为__main__),则执行以下语句,常用于测试脚本是否能够正常运行
if __name__=='__main__':
#8.1执行测试用例方案一如下:#unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。
#执行顺序是命名顺序:先执行test_case1,再执行test_case2
    unittest.main()
                                                                                         
'''#8.2执行测试用例方案二如下:
#8.2.1先构造测试集
#8.2.1.1实例化测试套件
    suite=unittest.TestSuite()
#8.2.1.2将测试用例加载到测试套件中。
#执行顺序是安装加载顺序:先执行test_case2,再执行test_case1
    suite.addTest(Test('test_case2'))
    suite.addTest(Test('test_case1'))
#8.2.2执行测试用例
#8.2.2.1实例化TextTestRunner类
    runner=unittest.TextTestRunner()
#8.2.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例)
    runner.run(suite)'''
    
'''#8.3执行测试用例方案三如下:
#8.3.1构造测试集(简化了方案二中先要创建测试套件然后再依次加载测试用例)
#执行顺序同方案一:执行顺序是命名顺序:先执行test_case1,再执行test_case2
    test_dir = './'
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
#8.3.2执行测试用例
#8.3.2.1实例化TextTestRunner类
    runner=unittest.TextTestRunner()
#8.3.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例)
    runner.run(discover)   
'''
使用方案一执行测试用例结果如下:
Enter a number:1010Test overEnter a number:.10Fs
Ran 3 tests in 6.092s
FAILED (failures=1, skipped=1)10Test over

因为先执行test_case1,再执行test_case2,所以第一次输入10时,执行通过,返回. 第二次输入10时,执行不通过,返回F,最终一个用例通过,一个用例失败,还有一个用例是直接跳过的(装饰器)。

 使用方案二执行测试用例结果如下:

Enter a number:10
10
Test over
Enter a number:F10.
Ran 2 tests in 4.973s
FAILED (failures=1) 
10
Test over

因为先执行test_case2,再执行test_case1,所以第一次输入10时,执行不通过,返回F , 第二次输入10时,执行通过,返回. ,最终一个用例通过,一个用例失败。

使用方案三执行测试用例结果如下(执行测试用例顺序同方案一):

Enter a number:10
10
Test over
Enter a number:.10
Fs
Ran 3 tests in 6.092s
FAILED (failures=1, skipped=1)
10
Test over

因为先执行test_case1,再执行test_case2,所以第一次输入10时,执行通过,返回. 第二次输入10时,执行不通过,返回F,最终一个用例通过,一个用例失败,还有一个用例是直接跳过的(装饰器)。

三、使用unittest框架编写测试用例实例

点击返回目录

目录结构:

百度搜索测试用例Test Case:

# coding=utf-8
'''Created on 2016-7-22
@author: Jennifer
Project:登录百度测试用例
'''
from selenium import webdriver
import unittest, time
 
class BaiduTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30) #隐性等待时间为30秒
        self.base_url = "https://www.baidu.com"
    
    def test_baidu(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").clear()
        driver.find_element_by_id("kw").send_keys("unittest")
        driver.find_element_by_id("su").click()
        time.sleep(3)
        title=driver.title
        self.assertEqual(title, u"unittest_百度搜索")
 
    def tearDown(self):
        self.driver.quit()
 
if __name__ == "__main__":
    unittest.main()

有道翻译测试用例Test Case:

# coding=utf-8
'''Created on 2016-7-22
@author: Jennifer
Project:使用有道翻译测试用例
'''
from selenium import webdriver
import unittest, time
 
class YoudaoTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30) #隐性等待时间为30秒
        self.base_url = "http://www.youdao.com"
    
    def test_youdao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("translateContent").clear()
        driver.find_element_by_id("translateContent").send_keys(u"你好")
        driver.find_element_by_id("translateContent").submit()
        time.sleep(3)
        page_source=driver.page_source
        self.assertIn( "hello",page_source)
 
    def tearDown(self):
        self.driver.quit()
 
if __name__ == "__main__":
    unittest.main()

web测试用例:通过测试套件TestSuite来组装多个测试用例。

# coding=utf-8
'''Created on 2016-7-26
@author: Jennifer
Project:编写Web测试用例
'''
import unittest
from test_case import test_baidu
from test_case import test_youdao
 
#构造测试集
suite = unittest.TestSuite()
suite.addTest(test_baidu.BaiduTest('test_baidu'))
suite.addTest(test_youdao.YoudaoTest('test_youdao'))
 
if __name__=='__main__':
    #执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

测试结果:

说明:.代表用例执行通过,两个点表示两个用例执行通过。F表示用例执行不通过。

 作为一位过来人也是希望大家少走一些弯路,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!

留【自动化测试】即可【自动化测试交流】:574737577(备注ccc)icon-default.png?t=N5F7http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=hIqEQD5B5ZyLT0S-vFq64p5MCDBc8jJU&authKey=O%2B3T95fjNUNsYxXnPIrOxvkb%2BbuFd1AxuUP5gCbos34AQDjaRG2L6%2Fm9gGakvo94&noverify=0&group_code=574737577

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux内核4.14版本——drm框架分析(9)——DRM_IOCTL_MODE_GETCONNECTOR(drm_mode_getconnector)

目录 1. drm_mode_getconnector分析 1.1 找到connector 1.2 计算该connector的encoder数量 1.3 把connector支持的encoder和数量返回给用户 1.4 把找到的connector的参数返回给应用 1.5 填充mode(很重要) 1.6 把找到的connector的参数返回给应用 …

excel爬虫相关学习2:excel 和 vba 爬虫相关xmlhttp方法

目录 前言:vba 爬虫相关xmlhttp的方法 1 什么是xmlhttp 1.1 定义 1.2 特点 定义XMLHTTP对象: XMLHTTP方法: open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword) send(varBody) setRequestHeader(bstrHeader, bstrValue) …

Java 被挤出前三。。

TIOBE 2023 年 06 月份的编程语言排行榜已经公布,官方的标题是:Python 还会保持第一吗?(Will Python remain number 1?) 在过去的 5 年里,Python 已经 3 次获得 TIOBE 指数年度大奖,这得益于…

简述Spring中IOC核心流程

基础概念 IOC 和 DI IOC,即控制反转。是Spring的一种设计思想。传统程序设计中,我们创建一个对象是通过 new 关键字,是程序主动去创建依赖对象,而在spring中专门有一个容器来创建和管理这些对象,并将对象依赖的其他对…

rpm详解——原理,命令详细讲解

目录 三个问题 什么是RPM SRPM (Source RPM) RPM软件包 RPM 查询命令 查询已安装的RPM软件信息 查询文件/目录属于哪个RPM软件 查询未安装的RPM包文件 RPM 软件包的安装、卸载 安装 卸载 RPM 升级与更新 三个问题 先抛出三个问题,最后简单解释一下。 …

HiveSQL 电商场景TopK统计

数据准备 CREATE TABLE test.test2 ( user_id string, shop string ) ROW format delimited FIELDS TERMINATED BY \t; INSERT INTO TABLE test.test2 VALUES ( u1, a ), ( u2, b ), ( u1, b ), ( u1, a ), ( u3, c ), ( u4, b ), ( u1, a ), ( u2, c ), ( u5, b ), ( u4, b )…

基于人工智能的AI理发师能帮托尼老师做什么?

BarberGPT是一个人工智能理发师,它可以让您在照片上尝试不同的发型。您只需要上传您的照片,标记您的头发,然后就可以看到惊人的变化。BarberGPT使用了先进的深度学习技术,可以根据您的脸型、肤色和发质生成适合您的发型。BarberGP…

国产监控数据库产品lepus最新版学习和部署(V5.1)

目录 lepus是什么? 二进制安装(最新v5.1) 1.基础环境 2.安装NSQ 3.NSQ消息测试 4.安装lepus 5.初始化数据库 6.修改配置文件 7.启动服务组件 8.安装lepus-console 9.运行和访问控制台 lepus是什么? Lepus数据库监控系统…

Docker容器应用为工业连接提供了新选择

一 智能数据管理 Docker容器应用可灵活部署在异构计算平台上,且仅需占用少量的资源,这可为工业4.0提供一种新的数据集成方案。Docker容器应用程序是提供特定功能的小型软件模块,可在自动化领域中用于智能数据管理。而Softing推出的一个新产品…

简要介绍 | CUDA底层原理:加速高性能计算的关键技术

注1:本文系“简要介绍”系列之一,仅从概念上对CUDA的底层原理进行非常简要的介绍,不适合用于深入和详细的了解。 CUDA底层原理:加速高性能计算的关键技术 CUDA Refresher: The GPU Computing Ecosystem | NVIDIA Technical Blog 1…

通过SECS/GEM平台实现半导体设备与EAP系统互联

在半导体电子和光伏行业大量的设备需要通过SECS/GEM协议与EAP系统进行互联。 常见的设备互联需求主要分为以下几类: 1.生产过程自动化:设备通过EAP下发指令进行切换程序、条码或RFID标签采集、Foup自动加载与卸载、晶圆生产加工自动化,减少…

6 种方式读取 Springboot 的配置,老司机都这么玩(原理+实战)

从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑。 我整理了几种获取配置属性的方式,目的不仅是要让大家学会如何使用,更重要的是弄清配置加载、读取的底层…

Windows WSL子系统Ubuntu22.04安装Nvidia显卡驱动

最近在研究AI,如果在Linux系统中部署的话需要重装系统,有些麻烦,又不想折腾。所以闲置很久没研究的WSL又拿起来研究了,当然部署ai还需要显卡驱动的支持,就必须先安装显卡驱动。 还没有安装过WSL的童鞋可以看我之前发布…

在 javascript 中清除 canvas 画布

文章目录 在 JavaScript 中清除画布在 HTML 中使用 JavaScript 创建画布 我们使用 canvas 来绘制图形。 它提供了多种绘制的方法,如圆形、方框、文字、添加图片等,我们在使用canvas时需要清除它并在上面绘制。 本文介绍如何在 JavaScript 中清除画布。 …

LogicFlow:自定义 bpmn 用户节点(1)

切入正题之前,首先我们先了解下面板上面节点的几个重要属性,如下图: 虽然 logicflow 内置插件里面有用户节点(bpmn:userTask),但是你若是想实现下面这种形式,就需要自己重新写个节点了。 上面…

MongoDB_5.0.18下载及安装(CentOS7)

文章目录 MongoDB安装(Centos7)1、下载地址2、安装流程2.1 下载server包2.2 安装server包2.3 修改默认mongod.conf配置文件2.4 启动服务2.5 这样就可以通过远程工具进行链接使用,创建mongodb用户,详细请查看其他文档 3、分享远程工…

球王梅西的力量

这次阿根廷来中国参加友谊赛,场内场外都有很多值得大众思考的,无论是对主办方的各种吐槽,还是对球迷近乎疯狂的追星行为,又或者是疫情放开后,大众积压已久的情绪,好象以往国外球队来,无论是顶级…

Axure教程——滑动拼图解锁

本文将教大家如何用AXURE中的动态面板制作拼图解锁 一、效果 预览地址:https://74wxu6.axshare.com 二、功能 拖动图片到指定位置提示“验证成功”,如果没到指定位置则提示“验证没成功,请重新验证” 三、制作 1、制作拼图 加入底部验证图…

【Python 随练】乒乓球比赛名单

题目: 两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,请编程序找出三队赛手的名单。 简介:…

【软考-中级】系统集成项目管理工程师【总】

持续更新中。。。。。。。。。。。。。。。 学习目标:完成2023上半年 软件中考任务 目标23年5月 考试前 完成 相关知识点学习 和练习 核心 十五至尊图: 上面图是考试的核心,需要背下来 一、信息化知识(重点)一般…