unittest官方文档

本篇随笔承接:

Python3+unitest自动化测试初探(中篇)

Python3+unitest自动化测试初探(上篇)

9、用例结果校验

用unittest来完成自动化测试时,结果校验无疑是非常重要的。用例校验不完整或者校验过于简单,是无法发现产品的缺陷或Bug的。就自动化测试来而言,其目的是代替部分手动测试,将测试人员从繁重重复的功能测试中解放出来。试想一下,一些缺少校验或简单校验的用例运行完后通过率即使达到100%,这能说明产品或版本没有任何问题吗?能够增强版本发布的信心吗?unittest提供了很多断言方法用于测试结果的校验。常用的断言方法如下:



所有的断言方法都提供一个可选参数msg,用于在测试失败时显示。

  • assertEqual(a, b,msg=None):校验a是否等于b,如果相等,测试通过,反之则测试失败。msg为可选参数,如果传入了该参数,在测试失败时会打印。
>>> class assertTest(unittest.TestCase):
... pass
...
>>> ast1 = assertTest() >>> ast1.assertEqual(1,2,msg="1 is not equal to 2")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/unittest/case.py", line 839, in assertEqual
assertion_func(first, second, msg=msg)
File "/usr/local/lib/python3.7/unittest/case.py", line 832, in _baseAssertEqual
raise self.failureException(msg)
AssertionError: 1 != 2 : 1 is not equal to 2
  • assertNotEqual(a, b, msg=None):校验a是否不等于b,如果不相等,测试通过。反之则测试失败。
  • assertTrue(x,msg=None):验证x是否为True,x可以为值或表达式,x为True则测试通过。反之,则测试失败,msg为可选参数,如果传入了该参数,在测试失败时会打印。
>>> ast1.assertTrue(1=2,msg="1=2,False")
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
>>> ast1.assertTrue(1==2,msg="1=2,False")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/unittest/case.py", line 692, in assertTrue
raise self.failureException(msg)
AssertionError: False is not true : 1=2,False
  • assertIs(a, b):判断a is b是是否成立。等价于判断id(a) == id(b)是否成立,如果成立,则测试通过。反之,测试失败。
  • assertIsNone(x):判断x是否为None。如果为None则测试通过,反之,测试失败。
  • assertIn(a, b):判断a是否在b中。如果在,则测试通过,反之,测试失败。
  • assertIsInstance(a, b):判断a是否为b的实例。如果是,则测试通过,反之,测试失败。

unittest还提供了如下方法用于检查异常,警告,日志信息。图片来自unittest官方文档。

检查异常,警告,日志的使用方法大同小异。在此不一一说明了,下面举例说明assertRaises(exc, fun, *args, **kwds)和assertRaises(exc, fun, *args, **kwds)的用法。

\ [ 示例1 ] assertRaises()的用法

#coding:utf-8
'''
定义一个除法的函数
当y==0时,会抛出错误ZeroDivisionError
'''
import unittest
def div(x,y):
return x/y #定义一个测试类assertTest,继承于unittest.TestCase
class assertTest(unittest.TestCase):
#pass表示什么也不做
pass
ast2 = assertTest()
'''
第一个参数为异常的类型
第二个为方法名称
后面为方法的参数
'''
ast2.assertRaises(ZeroDivisionError,div,1,0)
print("---------------------------------------")
ast2.assertRaises(ZeroDivisionError,div,1,1)

调用div(1,1)不会抛出异常ZeroDivisionError,所以assertRaises()测试失败,上述代码运行结果如下:



如果只传入了expetion或msg参数,就可以在with上下文管理器中测试一段代码而不仅仅是测试函数,就像下面这样。

with ast2.assertRaises(ZeroDivisionError):
div(1,1) with ast2.assertRaises(ZeroDivisionError):
div(1,0)

运行结果如下:

\ [ 示例2 ] assertRaises()的用法

#导入warnings模块
import warnings
#定义一个简单的函数,打印级别为UserWarning的告警
def warnTest():
warnings.warn("This is warning test") ast2.assertWarns(UserWarning,warnTest)
print("--------------------------------")
with ast2.assertWarns(UnicodeWarning):
warnTest()

warnTest()函数不会打印UnicodeWarning级别的告警,所以第二个告警校验会失败,运行结果如下:


点击这里返回本篇目录

10、跳过用例

在一些场景下并不会执行所有的用例,而是选择性跳过一部分用例。unittest支持跳过单个用例或整个测试类。跳过用例需要用到unittest.skip()装饰器。

  • @unittest.skip(reason):无条件跳过单个用例或测试类,reason是跳过的原因。
  • @unittest.skipIf(condition, reason):if条件成立则跳过单个用例或测试类,reason是跳过的原因。
  • @unittest.skipUnless(condition, reason):条件为False则跳过单个用例或测试类,reason是跳过的原因。
  • @unittest.expectedFailure:标记测试用例为失败,不会出现在统计结果中。
  • exception unittest.SkipTest(reason):跳过用例并抛出异常。

[ 示例3 ]:直接跳过注册功能的用例

对userRegTest.py做如下修改,并执行userRegTest.py:

    @unittest.skip("skip test case of user reg")
def test_pwdlenerr_L1(self):
print("test case:test_pwdlenerr_L1")
res = self.user1.userReg()
self.assertEqual(res,"passwordLenError") #测试场景:正常注册
@unittest.skipIf(2>1,"skip if condiction")
def test_regsucess_L0(self):
print("test case:test_regsucess_L0")
res = self.user2.userReg()
self.assertEqual(res,"regSucess") #测试场景:用户名重名
@unittest.skipUnless(1<0,"skip unless.")
def test_regagain_L1(self):
print("test case:test_regagain_L1")
res = self.user3.userReg()
self.assertEqual(res,"SameNameError")

执行结果如下:

11、Test Discovery

unittest支持用例发现功能,在unittest.defaultTestLoader中实现。使用的时候需要传入两个参数:寻找的起始目录,匹配的测试文件的格式(默认test*.py)。用例发现也支持命令行模式。

[ 示例4 ]:testDiscover

    startPath = './testCases'
discover = unittest.defaultTestLoader.discover(start_dir=startPath,pattern='*Test.py')
print(discover)

运行结果:

12、加载用例

unittest支持从模块和测试类中提取测试用例创建测试套。在class unittest.TestLoader中实现。TestLoader常见的加载方法如下:

  • loadTestsFromTestCase(testCaseClass):从unittest.TestCase的子类即测试类中加载用例并返回测试套。
  • loadTestsFromName(name,module=None):从特定的字符串说明符中加载用例并返回测试套。
  • loadTestsFromNames(names,module=None):用法和 loadTestsFromName(name,module=None)类似,不同的是它可以接受字符串说明符列表,而不是一个。
  • loadTestsFromModule(module, pattern=None):从模块中加载所有测试用例,返回一个测试套件。
  • getTestCaseName(testCaseClass):返回一个有序的包含在testCaseClass中的方法名列表。

[示例5 ] :TestLoader用法举例


#coding:utf-8 import unittest
import testCases.userLoginTest,testCases.userRegTest
from testCases.userRegTest import regTest
from testCases.userLoginTest import loginTest loader = unittest.TestLoader() print("从测试类loginTest加载所有的用例:")
caseInLoginTest = loader.getTestCaseNames(loginTest)
print(caseInLoginTest) print("从测试模块中加载用例:")
loadByModule = loader.loadTestsFromModule(testCases.userLoginTest)
print(loadByModule) print("从测试类中加载用例:")
loadByTestClass = loader.loadTestsFromTestCase(regTest)
print(loadByTestClass)
print("从特定的字符串标识符中加载用例") loadBySpecifier = loader.loadTestsFromName("regTest.test_regagain_L1")
print(loadBySpecifier) print("从字符符标识符列表中加载用例")
specStrs = ["regTest.test_regagain_L1","test_regsucess_L0"]
loadBySpecifiers = loader.loadTestsFromNames(specStrs)
print(loadBySpecifiers)

运行结果如下:

在发布时间紧张,产品迭代频繁的情况下,很多时候上线一个新特性,对已发布的老特性采用的回归策略是:只执行L0即(Level 0)级别的测试用例。这个在unittest里面怎么实现呢?解决方案是:

  1. 规范特性L0用例的命名格式,比如:test_xxx_L0.
  2. 加载用例
  3. 通过正则表达式匹配出L0级别的用例集合,然后交给test runner执行。

(完)

点击这里返回本篇目录

Python3+unitest自动化测试初探(下篇)的更多相关文章

  1. Python3+unitest自动化测试初探(中篇)

    目录 6.生成测试报告 7.编写邮件发送工具 8.发送邮件 发布 0 86 编辑 删除 Python3+unitest自动化测试初探(中篇)(2019-04-18 01:41) 发布 3 245 编辑 ...

  2. Python3+unitest自动化测试初探(上篇)

    目录 1.概念介绍 2.准备工作 3.一个简单的例子 4.test fixture 5.测试套 1.概念介绍 unit test:单元测试,可以简单粗暴地理解成用一段代码去测试另外一段代码.unitt ...

  3. Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing 'value'

    Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing ' ...

  4. 第9期《python3接口自动化测试》课程,6月29号开学!

    2019年 第9期<python3接口自动化测试>课程,6月29号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学 本期上课时间:6月29号-7月28号,每周六.周日晚上20:3 ...

  5. 《手把手教你》系列技巧篇(六十五)-java+ selenium自动化测试 - cookie -下篇(详细教程)

    1.简介 今天这一篇,宏哥主要讲解:利用WebDriver 提供可以读取.添加和删除cookie 信息的相关操作方法.验证浏览器中是否存在某个cookie.原因是:因为基于真实的cookie 的测试是 ...

  6. 18年selenium3+python3+unittest自动化测试教程(下)

    第六章 自动化测试进阶实战篇幅 1.自动化测试实战进阶之网页单选性别资料实战 简介:讲解使用selenium修改input输入框和单选框 2.自动化测试之页面常见弹窗处理 简介:讲解使用seleniu ...

  7. 18年selenium3+python3+unittest自动化测试教程(上)

    第一章 自动化测试课程介绍和课程大纲 1.自动化测试课程介绍 简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平 python3.7+selenium3 pycharm 第二章自动化 ...

  8. 浏览器自动化测试初探 - 使用phantomjs与casperjs

    收录待用,修改转载已取得腾讯云授权 作者:yangchunwen 首先要解释一下为什么叫浏览器自动化测试,因为本文只关注发布后页面功能的自动化测试,也就是UI层面的自动化. 浏览器测试有别于js代码的 ...

  9. Python3+Selenium3自动化测试-(二)

    python3 元素定位和操作方法总结 # coding=utf-8 ''' #8种元素定位方法 find_element_by_id() find_element_by_name() find_el ...

随机推荐

  1. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

  2. 在openjdk8下看Unsafe源码

    尽管有传言JAVA9可能会移除Unsafe类,但不妨碍我们理解它的原理.因为类不在了,native方法还在那里.就像菜换样了,食材就那些没变.一个好厨师不仅仅需要会做菜,还需要能识别食材特性...来吧 ...

  3. Android 两种方式实现类似水波扩散效果

    原文链接 https://mp.weixin.qq.com/s/M19tp_ShOO6esKdozi7Nlg 两种方式实现类似水波扩散效果,先上图为敬 自定义view实现 动画实现 自定义view实现 ...

  4. C#-Xamarin的Android项目开发(二)——控件应用

    相信我,这不是一篇吐槽文章.... 基础控件 Android的控件和控件样式非常特别,它是一种内联特别高的设计模式,换句话说,它是非常烂的设计.... 但在这种特别的关系里还是有一定的规律的,下面我们 ...

  5. Apache Mina -2

    我们可以了解到 mina是个异步通信框架,一般使用场景是服务端开发,长连接.异步通信使用mina是及其方便的.不多说,看例子. 本次mina 使用的例子是使用maven构建的,过程中需要用到的jar包 ...

  6. 深入vue - 源码目录及构建过程分析

     公众号原文链接:深入vue - 源码目录及构建过程分析   喜欢本文可以扫描下方二维码关注我的公众号 「前端小苑」 ​“ 本文主要梳理一下vue代码的目录,以及vue代码构建流程,旨在对vue源码整 ...

  7. Stackoverflow上有哪些声望高or值得关注的国人

    Stackoverflow上有哪些声望高/值得关注的国人? 以下回答并不严格按照 Reputation 排名来列,也不收录不确定是Chinese(中国人或华人)的用户,欢迎补充- 1.李杨 @Li L ...

  8. .NETCore 千星项目模块化开发框架 SimplCommerce 详解

    SimplCommerce 是 github 上过千星的.netcore 商城示例项目,本文详解他的模块化框架现实思路,其业务(如产品.订单)不作介绍.因作者文笔水平很差,它又很值得学习和推荐,就算不 ...

  9. Pycharm:书签的使用

    创建匿名书签 有时候我们的代码会写很长,为了查找方便,我们会在经常需要查看的地方插入一个书签.在 Pycharm 中,将光标移动到需要创建书签的行,按 F11 可以创建一个匿名书签,匿名书签的显示是行 ...

  10. C#读写Excel的几种方法

    1 使用Office自带的库 前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel 读写代 ...