一、摘要

本片博文将介绍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(conditionreason) # 有条件跳过,当condition满足的情况下便跳过此装饰器装饰的用例
@unittest.skipUnless(conditionreason) # 有条件跳过,当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(testFuncsetUp=NonetearDown=Nonedescription=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(六)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 3. 单元测试框架(unittest)1——TestCase

    1. import unittest 引入unittest模块:   2. class SearchTest (unittest.TestCase): 定义一个继承于TestCase类的子类:   3 ...

随机推荐

  1. Mysql统计每年每个月的数据——详细教程

    Mysql统计每年每个月的数据(前端页面统计图实现) 最终想实现的效果图,在这里就不多废话了,直接上效果图,由于测试数据有几个月是为0的,所以数据图看着会有点怪怪. 接下来是数据库的两个表,这里直接给 ...

  2. go json解析Marshal和Unmarshal

    Decoder: package main import ( "encoding/json" "fmt" "io" "log&qu ...

  3. Spring Cloud Ribbon说明

    浅谈Spring Cloud Ribbon的原理 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Clo ...

  4. 让Sublime Text3支持新建.vue高亮显示模板

    首先要使用Package Control,安装要好 Vue Syntax Highlight和sublimetmpl插件. 1, 在Packages\SublimeTmpl\templates目录下新 ...

  5. IDEA忽略不必要提交的文件

    1.在idea中安装插件用来生成和管理 .gitignore 文件,安装成功后重启idea 2.新建.gitignore 文件 3.将不需要提交的文件添加到.gitignore  4.删除缓冲文件 . ...

  6. 奇妙的算法【4】-汉诺塔&哈夫曼编码

    1,汉诺塔问题[还是看了源码才记起来的,记忆逐渐清晰] 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着6 ...

  7. SQL Server 2017 左补齐

    DECLARE @NUM CHAR(3)='7  'SELECT RIGHT('0000000'+CONVERT(VARCHAR(50),1+ RTRIM(@NUM)),7) ​​​​

  8. C++ raw string literal

    raw string literal 以   R"(  开头, )" 结束,是可以跨越多行的字符串字面值,转义字符如 \t\n 在raw string literal中是普通的文本 ...

  9. vue slot的使用(transform动画)

    slot的说明就看vue的官方文档  但是有点模糊 理解: 是对组件的扩展,通过slot插槽向组件内部指定位置传递内容,通过slot可以父子传参:   解决什么问题:正常情况下,<Child&g ...

  10. iOS 9.0中UIAlertController的用法。

    1.我为什么要写这篇博客记录它? 答:因为 UIAlertView和UIActionSheet 被划线了 苹果不推荐我们使用这两个类了,也不再进行维护和更新,为了以后方便使用我来记录一下.如图所示 正 ...