一、摘要

假设我们有一组测试方法差别非常小,比如仅仅是所需要的参数有少许变化时,我们的自动化测试如何进行?unittest框架为这种场景提供了一种方式,它允许我们用subTest()上下文管理器在一个测试方法内识别这种细小的不同,这么说可能有点晕

实际上我觉得还不如直接看代码更能清晰的表达它为我们的测试带来了什么

二、代码实例

# coding:utf-8
import unittest class NumbersTest(unittest.TestCase): def test_even(self):
"""
使用subTest上下文管理器,区分细小的变化
取模运算,返回除法的余数,但是参数是0到5的整数,没必要单独写方法
"""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0) if __name__ == '__main__':
unittest.main()

执行这段代码的结果会是:

SubTest failure: Traceback (most recent call last):
File "C:\Python37\lib\unittest\case.py", line , in testPartExecutor
yield
File "C:\Python37\lib\unittest\case.py", line , in subTest
yield
File "D:\Programs\Python\Demo\unittest4\subtestDemo.py", line , in test_even
self.assertEqual(i % , )
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
raise native_error
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
old(self, first, second, msg)
File "C:\Python37\lib\unittest\case.py", line , in assertEqual
assertion_func(first, second, msg=msg)
File "C:\Python37\lib\unittest\case.py", line , in _baseAssertEqual
raise self.failureException(msg)
AssertionError: != SubTest failure: Traceback (most recent call last):
File "C:\Python37\lib\unittest\case.py", line , in testPartExecutor
yield
File "C:\Python37\lib\unittest\case.py", line , in subTest
yield
File "D:\Programs\Python\Demo\unittest4\subtestDemo.py", line , in test_even
self.assertEqual(i % , )
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
raise native_error
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
old(self, first, second, msg)
File "C:\Python37\lib\unittest\case.py", line , in assertEqual
assertion_func(first, second, msg=msg)
File "C:\Python37\lib\unittest\case.py", line , in _baseAssertEqual
raise self.failureException(msg)
AssertionError: != SubTest failure: Traceback (most recent call last):
File "C:\Python37\lib\unittest\case.py", line , in testPartExecutor
yield
File "C:\Python37\lib\unittest\case.py", line , in subTest
yield
File "D:\Programs\Python\Demo\unittest4\subtestDemo.py", line , in test_even
self.assertEqual(i % , )
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
raise native_error
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
old(self, first, second, msg)
File "C:\Python37\lib\unittest\case.py", line , in assertEqual
assertion_func(first, second, msg=msg)
File "C:\Python37\lib\unittest\case.py", line , in _baseAssertEqual
raise self.failureException(msg)
AssertionError: != One or more subtests failed
Failed subtests list: (i=), (i=), (i=) Ran test in .020s FAILED (failures=) Process finished with exit code

而如果我们不使用subTest(), 只是写个简单的循环去断言,当程序执行到第一个断言失败时就会终止了,后边可能还有断言能够成功的也就不会被执行了

# coding:utf-8
import unittest class NumbersTest(unittest.TestCase): def test_even(self):
for i in range(0, 6):
# with self.subTest(i=i):
print("当前参数是:%d" % i)
self.assertEqual(i % 2, 0) if __name__ == '__main__':
unittest.main()

执行结果会是:

当前参数是:
当前参数是: Ran test in .010s FAILED (failures=) != Expected :
Actual :
<Click to see difference> Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
old(self, first, second, msg)
File "C:\Python37\lib\unittest\case.py", line , in assertEqual
assertion_func(first, second, msg=msg)
File "C:\Python37\lib\unittest\case.py", line , in _baseAssertEqual
raise self.failureException(msg)
AssertionError: != During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "C:\Python37\lib\unittest\case.py", line , in testPartExecutor
yield
File "C:\Python37\lib\unittest\case.py", line , in run
testMethod()
File "D:\Programs\Python\Demo\unittest4\subtestDemo.py", line , in test_even
self.assertEqual(i % , ) Process finished with exit code

单元测试框架之unittest(四)的更多相关文章

  1. 单元测试框架之unittest(七)

    一.摘要 前篇文章已经详细介绍了unittest框架的特性,足以满足我们日常的测试工作,但那并不是unittest的全部,本片博文将介绍一些应该知道但未必能经常用到的内容 然而,想全部掌握unitte ...

  2. Python单元测试框架:unittest(一)

    Python单元测试框架unittest使用方法讲解 主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测 ...

  3. unittest单元测试框架之unittest 框架的总结(七)

    1. Unittest 是 python 自带的单元测试框架,可以用其作为自动化框架来组织测试用例(测 试用例的执行顺序)的执行. 2. Unittest 框架的流程: 写好 TestCase 通过 ...

  4. 单元测试框架之unittest(一)

    一.单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试.为测试共享setUp和shutDown. ...

  5. unittest单元测试框架之unittest 框架的总结2(八)

    unittest 下的属性 1.Unittest.TestCase:所有测试用例类继承的基本类 2.Unittest.main():将一个单元测试模块变为可直接运行的测试脚本 If __name__ ...

  6. 单元测试框架之unittest(六)

    一.摘要 本片博文将介绍unittest框架的一些轻便有效的特性,在我们的测试中经常可以用到 如果有一些测试方法不想执行,如果有些测试方法在某些条件下不执行 该当如何? 如果有些方法未在unittes ...

  7. 单元测试框架之unittest(二)

    一.摘要 本章笔者将详细介绍组织测试代码的相关内容,所用的测试例子会是冒泡排序,笔者在从业这么久之后回想很多面试都要问冒泡排序,虽然不知道为什么要问这个,但还是希望大家掌握,它与自动化测试关系不大属于 ...

  8. 单元测试框架之unittest(五)

    一.摘要 单元测试里很重要的一个部分就是断言,unittest为我们提供了很多断言方法,断言方法分为三类,一种是用来断言被测试的方法的,另一种是测试是否抛正确异常的,第三种是用来断言日志是否包含应有信 ...

  9. 单元测试框架之unittest(三)

    一.摘要 前边的文章我们看到执行测试用例的是通过调用unittest.mian()函数,它会将模块的测试用例收集起来并执行,然而当我们的测试用例增多了以后,这样的执行非常不灵活而且没有效率,我们更愿意 ...

随机推荐

  1. 生成 n 个不同的随机数且随机数区间为 [0,n)

    生成 n 个不同的随机数且随机数区间为 [0,n) Java 实现 import java.util.ArrayList; import java.util.List; import java.uti ...

  2. Mysql: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

    2019-05-28 01:53:42.762 [message remind thread-24] ERROR druid.sql.Statement - {conn-10327, stmt-320 ...

  3. java读写cookie中文乱码解决方法

    1.写入的时候: public boolean addCookie( HttpServletRequest req, HttpServletResponse resp){ //创建 Cookie co ...

  4. WUSTOJ 1283: Hamster(Java)

    1283: Hamster 参考博客 wust_tanyao的博客 题目   第0个月有1对仓鼠.仓鼠的寿命是M个月,仓鼠成年后每个月生一对仓鼠(一雌一雄),问N个月后有仓鼠多少对.更多内容点此链接 ...

  5. T100——错误信息提示传入参数显示

    LET l_str1 = l_xccc.xccc901LET l_str2 = l_inat015LET l_str = l_str1.trim(),'|',l_str2.trim() CALL cl ...

  6. scratch少儿编程第一季——01、初识图形化界面编程的神器

    各位小伙伴大家好: 说到2018年互联教育的热门事件,那就不得不提Scratch. 相信各位不关注信息技术领域的各位家长也都听说过这个东西. 对于小学阶段想要接触编程或信息技术学生来说,Scratch ...

  7. node 标准输入流和输出流

    使用node 在 CMD 控制台获取输入的指令: 方式一: process.stdin.resume(); process.stdin.setEncoding('utf-8'); process.st ...

  8. Apache2.4+Tomcat7.0+php5.5整合配置详解

    在上一篇的基础上,继续添加php的配置 一.首先下载php5.5 首先下载php5.5,到官网下载http://www.php.net/downloads.php,参考http://www.cnblo ...

  9. html如何点击子元素事件而不触发父元素的点击事件——阻止冒泡

    如果子元素和父元素都有点击事件,会出现点击事件冒泡的情况. 1.如何避免冒泡: html: <html> <head></head> <body> &l ...

  10. (八)mybatis之多对多

    一.需求分析 需求:查询所有用户的信息以及每个用户所属的组的信息 分析:一个用户可以有多个组,一个组也可以由多个用户. 多对多,可以设置一张中间表,该表存放的是用户表和组表的对应关系. 二.创建数据库 ...