单元测试框架之unittest(六)
一、摘要
本片博文将介绍unittest框架的一些轻便有效的特性,在我们的测试中经常可以用到
- 如果有一些测试方法不想执行,如果有些测试方法在某些条件下不执行 该当如何?
- 如果有些方法未在unittest框架下编写,又想使用unittest框架执行,该当如何?
- 如果想自定义一个执行顺序该当如何?
二、代码实例
如果有一些测试方法不想执行,如果有些测试方法在某些条件下不执行 该当如何?
# coding : utf-8
import unittest
import random
import sys class TestSequenceFunctions(unittest.TestCase):
a = 1
b = 2 def setUp(self):
self.seq = list(range(10))
self.list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13] @unittest.skip("就跳过了不为什么")
def test_shuffle(self):
random.shuffle(self.seq)
self.seq.sort()
self.assertEqual(self.seq, list(range(10)))
self.assertRaises(TypeError, random.shuffle, (1, 2, 3)) @unittest.skipIf(a != 1, "如果a不等于1就跳过此测试方法")
def test_choic(self):
element = random.choice(self.seq)
self.assertTrue(element in self.seq) @unittest.skipUnless(b > 1, "除非b大于1,否则跳过")
def test_sample(self):
with self.assertRaises(ValueError):
random.sample(self.seq, 20)
for element in random.sample(self.seq, 5):
self.assertTrue(element in self.seq) @unittest.expectedFailure
def test_randomshuffle(self):
random.shuffle(self.list)
print(self.list)
self.assertEqual(self.list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13]) if __name__ == '__main__':
unittest.main(verbosity=2)
执行结果会是:
Expected failure: 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 assertListEqual
self.assertSequenceEqual(list1, list2, msg, seq_type=list)
File "C:\Python37\lib\unittest\case.py", line , in assertSequenceEqual
self.fail(msg)
File "C:\Python37\lib\unittest\case.py", line , in fail
raise self.failureException(msg)
AssertionError: Lists differ: [, , , , , , , , , , ] != [, , , , , , , , , , ] First differing element : - [, , , , , , , , , , ]
+ [, , , , , , , , , , ] 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\unittest6\SkipDemo.py", line , in test_randomshuffle
self.assertEqual(self.list, [, , , , , , , , , , ])
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.1\helpers\pycharm\teamcity\diff_tools.py", line , in _patched_equals
raise error
teamcity.diff_tools.EqualsAssertionError: :: [, , , , , , , , , , ] != [, , , , , , , , , , ] Ran tests in .010s OK (skipped=, expected failures=) Skipped: 就跳过了不为什么
代码解析:
unittest为我们提供了多种跳过测试用例的方法,当我们的大量用例在不同场景下可能有些用例并不想执行,例如回归测试、例如新部署的一套环境需要对主功能进行验证、例如有些用例需要具备条件才执行等等场景我们便需要这些跳过用例的方法,当然我们可以将那些不想执行的用例注释掉,但也可以采用如下装饰器给测试方法加上注解
@
unittest.
skip
(reason) # 无条件跳过,reason是用来描述为什么跳过它
@
unittest.
skipIf
(condition, reason) # 有条件跳过,当condition满足的情况下便跳过此装饰器装饰的用例
@
unittest.
skipUnless
(condition, reason) # 有条件跳过,当condition满足的情况下便要执行此装饰器装饰的用例,与上一个相反
@
unittest.
expectedFailure # 用于标记期望执行失败的测试方法,如果该测试方法执行失败,则被认为成功,如果执行成功,则被认为失败
- 并且当测试模块被装饰器装饰为跳过时,它的setUpModule()和tearDownModule()也就不会执行了
- 同样的当测试类被装饰器装饰为跳过时,它的setUpClass()和tearDownClass()也就不会执行了
- 一样的当测试方法被装饰器装饰为跳过时,它的setUp()和tearDown()也就不会执行了
如果想自定义一个执行顺序该当如何?
在前边的文章中介绍了多种执行用例的方式,首先unittest.main()这种方式启动单元测试去执行,各测试方法的执行顺序是按所有方法名的字符串的ASCII码排序后的顺序执行的
如果想自定义顺序执行,我们需要使用TestSuite(), 它的执行顺序是按照我们addTest()的次序进行执行的
# encoding = utf-8
import unittest
from unittest3.TestSuiteDemo2 import * def suite():
suite = unittest.TestSuite()
suite.addTest(TestRandomFunction("test_randomchoice"))
suite.addTest(TestRandomShuffleFunction("test_randomshuffle"))
return suite if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
如果有些方法未在unittest框架下编写,又想使用unittest框架执行,该当如何?
当我们的一些老代码并没建立在unittest的体系中,但是如果想使用unittest去执行它,又不想将所有老代码转换到unittest的时候,unittest为我们提供了unittest.
FunctionTestCase
(testFunc, setUp=None, tearDown=None, description=None)
假设我们有个测试方法如下
def test_randomchoice(self):
var = random.choice(self.str)
self.assertTrue(var in self.str)
print(var)
它并没有建立在unittest框架中,只是一个独立的函数,那么我们可以创建等价的测试用例
testcase = unittest.FunctionTestCase(test_randomchoice, setUp=makeSomethingDB, tearDown=deleteSomethingDB)
然而并不建议使用这种方法,如果大量的这种代码出现,将使得测试代码比较混乱难以维护,和重构
单元测试框架之unittest(六)的更多相关文章
- unittest单元测试框架之unittest 框架的总结(七)
1. Unittest 是 python 自带的单元测试框架,可以用其作为自动化框架来组织测试用例(测 试用例的执行顺序)的执行. 2. Unittest 框架的流程: 写好 TestCase 通过 ...
- 单元测试框架之unittest(七)
一.摘要 前篇文章已经详细介绍了unittest框架的特性,足以满足我们日常的测试工作,但那并不是unittest的全部,本片博文将介绍一些应该知道但未必能经常用到的内容 然而,想全部掌握unitte ...
- 单元测试框架之unittest(一)
一.单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试.为测试共享setUp和shutDown. ...
- Python单元测试框架:unittest(一)
Python单元测试框架unittest使用方法讲解 主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测 ...
- unittest单元测试框架之unittest 框架的总结2(八)
unittest 下的属性 1.Unittest.TestCase:所有测试用例类继承的基本类 2.Unittest.main():将一个单元测试模块变为可直接运行的测试脚本 If __name__ ...
- 单元测试框架之unittest(二)
一.摘要 本章笔者将详细介绍组织测试代码的相关内容,所用的测试例子会是冒泡排序,笔者在从业这么久之后回想很多面试都要问冒泡排序,虽然不知道为什么要问这个,但还是希望大家掌握,它与自动化测试关系不大属于 ...
- 单元测试框架之unittest(五)
一.摘要 单元测试里很重要的一个部分就是断言,unittest为我们提供了很多断言方法,断言方法分为三类,一种是用来断言被测试的方法的,另一种是测试是否抛正确异常的,第三种是用来断言日志是否包含应有信 ...
- 单元测试框架之unittest(四)
一.摘要 假设我们有一组测试方法差别非常小,比如仅仅是所需要的参数有少许变化时,我们的自动化测试如何进行?unittest框架为这种场景提供了一种方式,它允许我们用subTest()上下文管理器在一个 ...
- 3. 单元测试框架(unittest)1——TestCase
1. import unittest 引入unittest模块: 2. class SearchTest (unittest.TestCase): 定义一个继承于TestCase类的子类: 3 ...
随机推荐
- 斑马打印机ZBL语言
ZBL手册:https://pan.baidu.com/s/1I8DaMUlf-9ytUwqtURw8rw 下面是打印CODE128条形码的代码 ^XA^FO100,100^BY6 ...
- thinkPHP 类库映射 类库导入
遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射.命名类库映射相当于给类文件定义了一个别名, ...
- CenOS 7 java链接redis数据库
完整代码 public class App { public static void main(String[] args) { System.out.println("Hello Worl ...
- Sping 补充完成修改功能
1.视图层完整示例 <form action="#" th:action="@{/update/{id}(id=${user.id})}" th:obje ...
- sql语句中,取得schema中的所有表信息及表的定义结构
postgressql下'検索スキーマの中で.全てテーブルselect tablename from pg_tables where schemaname='test' mysql下'検索スキーマの中 ...
- MapReduce 工作流程
1. Map 阶段 ============================================= 2. Reduce 阶段
- “无法改变的设计”——浅谈Java中的final关键字
在Java中,final关键字可以用来修饰类.变量(包括成员变量和局部变量).方法,下面从这三个方面分别说明. final方法 当一个方法被final修饰时,表明这个方法不能被子类重写. 下面程序试图 ...
- python学习-42 装饰器 --- 函数闭包1
函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson( ...
- 『Python基础』第1节 Windows环境下安装Python3.x
一. Python安装 1. 下载安装包 https://www.python.org/downloads/release/python-374/ # 3.7安装包 # 如需安装python2.7版本 ...
- AtCoder Grand Contest 040 A - ><
传送门 对于某个位置,只要知道这个位置往左最多的连续 $\text{<}$ 的数量 $x$ 和往右最多的连续 $\text{>}$ 的数量 $y$ 那么这个位置最小可能的数即为 $max( ...