一、摘要

假设我们有一组测试方法差别非常小,比如仅仅是所需要的参数有少许变化时,我们的自动化测试如何进行?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. Andrew Ng机器学习课程11之使用machine learning的建议

    Andrew Ng机器学习课程11之使用machine learning的建议 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 2015-9-28 艺少

  2. ASP.NET MVC4中的异步控制器

    在抛弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需要再蛋疼的给每个Action写两个方法, 也无需傻傻的手动对异步Action计数器增减了(AsyncMa ...

  3. java枚举的线程安全及序列化

    原文链接:https://www.cnblogs.com/z00377750/p/9177097.html https://www.cnblogs.com/chiclee/p/9097772.html ...

  4. 【leetcode算法-简单】28. 实现strStr

    [题目描述] 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如 ...

  5. java中this的使用

    java中的this随处可见,用法也多,现在整理有几点:this1.当全局变量跟局部变量重名时,表示使用全局变量(此时this指代本类对象)例有一类class A{    String name;   ...

  6. SSH协议(1)-工作原理及过程

    转载. https://blog.csdn.net/cjx529377/article/details/77659199 SSH全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录 ...

  7. jQuery笔记归纳

      使用jQuery前首先需要导如jQuery包:https://jquery.com/(点击下载按钮,进入后点击鼠标右键另存为即可下载)    例如:<script type="te ...

  8. go 函数 命名返回值

    Go 的返回值可以被命名,并且像变量那样使用. 返回值的名称应当具有一定的意义,可以作为文档使用. 没有参数的 return 语句返回结果的当前值.也就是`直接`返回. 直接返回语句仅应当用在像下面这 ...

  9. zookeeper-waches

    1. 设置watches data watches: getData() exist() child watches: getChildren() 2. 触发watches setData(): da ...

  10. MyBatis_02 框架

    今日内容 动态SQL语句 Xml方式 注解方式 MyBatis的缓存 MyBatis的关联查询 MyBatis逆向工程 动态SQL语句 动态SQL是什么 就是相对与固定SQL.就是通过传入的参数不一样 ...