单元测试框架之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 ...
随机推荐
- 2019-10-24 李宗盛 spss作业
3.1数据排序. 在统计分析时最初的变量. 可能不符合统计分析的要求,需要用户对目标数据进行整理,来符合分析方法个案排序.数据——个案排序.排序依据,排序顺序,变量排序 数据——变量排序 变量视图 ...
- 判断浏览器是否ie6
if ($.browser.msie && ($.browser.version == "6.0") && !$.support.style) { ...
- Dapper操作Sql Server和MySql数据库
1. 在配置文件web.config中添加连接字符串 <connectionStrings> <add name="sqlconnectionString" co ...
- Docker准备
1. 引言 Docker是目前最流行的容器技术,是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.是开发人员和系统管理员使用容器开发,部署和运行应用程序的平台.也许我们 ...
- Java基础---Java方法的重载Overload
对于功能类似的方法来说,因为参数列表不一样,却需要记住那么多不同的方法名称,太麻烦. 方法的重载(Overload):多个方法的名称一样,但是参数列表不一样.好处:只需要记住唯一一个方法名称,就可以实 ...
- Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归
此处将抽象和结构.自定义函数.参数的使用.作用域.递归放在一起学习,看起来很怪是不是? 但实际上这几者之间是有紧密联系的,不然Python基础教程(第三版)的作者为什么会把它们放在一起哪?手动滑稽 好 ...
- Unity塔防游戏的创建
看了下塔防游戏的教程,比我想像的还简单一些,有些收获: (1)敌人的移动路径,其时比较简单,用了N个Empty GameObject作为路径点,然后做一个总的Empty GameObject 作为父级 ...
- Mybatis分页的方式以及实现
方式 分页的分类: 1.物理分页:只从数据库中查询当前页的数据 优点:不占用很多内存 缺点:效率比价低(相比于逻辑分页) 2.逻辑分页:从数据库将所有记录查询出来,存储到内存中,展示当前页,然后数 ...
- linux, kill掉占用60%多cpu的进程,几秒后换个pid 和 command 又出现
linux, kill掉占用60%多cpu的进程,几秒后换个pid 和 command 又出现?快速清理木马流程.假设木马的名字是xysbqaxjqy,如果top看不到,可以在/etc/init.d目 ...
- 【原创】大叔经验分享(90)linux服务器iowait和负载很高
# top top - 21:21:51 up 207 days, 1:30, 5 users, load average: 0.90, 0.79, 1.62 Tasks: 249 total, 1 ...