介绍单元测试的好文:https://mp.weixin.qq.com/s/njxc8GXSlc3z_RibK70ROg

  • setUpModule/tearDownModule:在整个模块的开始和结束时被执行。
  • setUpClass/tearDownClass: 在测试类的开始和结束时被执行。
  • setUp/tearDown:在测试用例的开始与结束时被执行
    注意:setUpClass/tearDownClass的写法稍有不同,首先通过@classmethod进行装饰,其次方法的参数为cls,也可以是别的。每一个上面都要进行装饰
import unittest

class MyTest(unittest.TestCase):  # 继承unittest.TestCase
def tearDown(self):
# 每个测试用例执行之后做操作
print('') def setUp(self):
# 每个测试用例执行之前做操作
print('') @classmethod
def tearDownClass(self):
# 必须使用 @ classmethod装饰器, 所有test运行完后运行一次
print('')
@classmethod
def setUpClass(self):
# 必须使用@classmethod 装饰器,所有test运行前运行一次
print('') def test_a_run(self):
self.assertEqual(, ) # 测试用例 def test_b_run(self):
self.assertEqual(, ) # 测试用例 if __name__ == '__main__':
unittest.main()#运行所有的测试用例

unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以TestAdd会优于TestBdd类被执行,test_aaa()方法会优于test_ccc被执行,因而它并没有按照用例从上到下的顺序执行

如果要测试的函数里包含的函数会连接数据库,或者发起http请求。你不想出发真实的操作,或者你纯粹就是不行调用这个函数。那这时候就用到mock模块了。

==========常用的断言

assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b

assertIsInstance(obj,cls,msg=None)

assertNotIsInstance(obj,cls,msg=None)

可能有人会好奇,为什么不使用内置断言语句 assert,而要额外提供这么多断言方法并使用呢?原因是通过使用 unittest 提供的断言方法,测试框架在运行结束后,能够聚合所有的测试结果并产生信息丰富的测试报告。而直接使用 assert 虽然也可以达到验证被测对象是否符合预期的目的,但在用例出错时,报错信息不够丰富

unittest 支持用例自动(递归)发现:

默认发现当前目录下所有符合 test*.py 测试用例

使用 python -m unittest 或 python -m unittest discover

通过 -s 参数指定要自动发现的目录, -p 参数指定用例文件的名称模式

python -m unittest discover -s project_directory -p "test_*.py"

通过位置参数指定自动发现的目录和用例文件的名称模式

python -m unittest discover project_directory "test_*.py"

unittest 支持执行指定用例:

指定测试模块

python -m unittest test_module1 test_module2

指定测试类

python -m unittest test_module.TestClass

指定测试方法

python -m unittest test_module.TestClass.test_method

指定测试文件路径(仅 Python )

python -m unittest tests/test_something.py

如果我们希望每个测试方法之前前后分别执行测试前置和清理方法,那么需要在测试类中定义好 setUp()[11] 和 tearDown()[12]

如果我们希望单个测试类中只执行一次前置方法,再执行该测试类中的所有测试,最后执行一次清理方法,那么需要在测试类中定义好 setUpClass()[13] 和 tearDownClass()[14]

如果我们希望单个测试模块中只执行一次前置方法,再执行该模块中所有测试类的所有测试,最后执行一次清理方法,那么需要在测试模块中定义好 setUpModule()[15] 和 tearDownModule()[16]

==============

安装 HTMLTestRunner,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果

import HtmlTestRunner
import unittest
class MyTest(unittest.TestCase):#继承unittest.TestCase
def tearDown(self):
#每个测试用例执行之后做操作
print('')
def setUp(self):
#每个测试用例执行之前做操作
print()
def test_run(self):
# self.assertEqual(,)
self.assertIs(,)
#测试用例
def test_run2(self):
# self.assertEqual(,)
self.assertIs(,)
#测试用例
def test_run3(self):
# self.assertEqual(,)
self.assertIs(,)
#测试用例
def test_run1(self):
# self.assertEqual(,)
self.assertIs(,)
#测试用例
if __name__ == '__main__':
test_suite = unittest.TestSuite()#创建一个测试集合
test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例
#test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法
fp = open('res.html','wb')#打开一个保存结果的html文件
runner =HtmlTestRunner.HTMLTestRunner()#生成执行用例的对象
runner.run(test_suite) #执行测试套件

==============找到当前目录下所有测试用例

import unittest
import HtmlTestRunner
if __name__ == '__main__':
suite = unittest.TestSuite()#创建测试套件
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
#找到某个目录下所有的以test开头的Python文件里面的测试用例
for case in all_cases:
suite.addTests(case)#把所有的测试用例添加进来
myrunner = HtmlTestRunner.HTMLTestRunner()
myrunner.run(suite)
print 'over'

discover()方法中的start_dir只能加载当前目录下的.py文件,如果加载子目录下的.py文件,需在每个子目录下放一个_init_.py文件。

  • discover(start_dir,pattern='test*.py',top_level_dir=None)
  • start_dir:要测试的模块名或测试用例的目录
  • pattern='test.py':表示用例文件名的匹配原则,此处文件名以“test”开头的“.py”类型的文件,“”表示任意多个字符。
  • top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None.

===================

python 杂记-unittest的更多相关文章

  1. python单元测试unittest

    单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和 调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而 ...

  2. Python中unittest采用不同的参数组合产生独立的test case

    我们在使用Python的unittest做自动化或者单元测试时,有时需要一个测试用例根据不同的输入.输出组合而执行多次,但是,unittest中一个用例只能有一组参数组合执行,如果采用循环的方式,在生 ...

  3. 老李分享:开发python的unittest结果输出样式

    老李分享:开发python的unittest结果输出样式   Python的unittest结果命令行输出,格式比较乱.为了提高格式输出的可读性,实现可以不同的颜色标识.所以准备扩展Python的un ...

  4. [转]python单元测试unittest

    单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单 ...

  5. python:unittest之跳过测试和预期失败的用例

    在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...

  6. 常见的python的unittest用法

    python的unittest好处是通过python脚本编写用例,每个用例可以单独调试初始化和清理动作,因为都是用例都是代码所以调试起来也很方便:它的缺点是得先学会python,难易程度见仁见智吧,对 ...

  7. Python之unittest测试代码

    前言 编写函数或者类时,还可以为其编写测试.通过测试,可确定代码面对各种输入都能够按要求的那样工作. 本次我将介绍如何使用Python模块unittest中的工具来测试代码. 测试函数 首先我们先编写 ...

  8. Python单元测试unittest - 单元测试框架

    一.unittest简介 unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性. 二.unittest相关概念 ...

  9. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

随机推荐

  1. 使用静态方法CreateInstance()创建数组

    Array类是一个抽象类,所以不能使用构造函数来创建数组.但除了可以使用C#语法创建数组的实例之外,还可以使用静态方法CreateInstance()创建数组. 如果事先不知道元素的类型,该静态方法就 ...

  2. SCI-hub使用技巧(下载外文文献)

    下载外文文献方法指南: (1)首先查找需要下载文献的DOI (2)在Sci-Hub主页搜索框输入URL.DOI或者PMID. (3)点击open即可看见下载界面. 参考文献:https://mp.we ...

  3. nginx tar包安装 包含openssl,rewrite,stream,sticky 等模块

    最近需要使用nginx 但是发现有时缺少一些模块. 所以 在学习如何增加上相应的模块. 主要学习的网站: 沧海书生 Ansible爱好者 https://www.cnblogs.com/tssc/p/ ...

  4. python---pth包路径

    为依赖包添加环境变量 (这一步很关键)PYTHONPATH C:\tensorflow\models\research;C:\tensorflow\models\research\slim6.然后并没 ...

  5. Reids原理之IO模型

    众所周知Redis是单进程单线程的应用,在如今多核横行的时代,我们不免有疑问,单线程的redis怎么就成了高性能的代表 当有多个线程同时调用redis的时候,那么单线程的redis是怎么处理的呢,这里 ...

  6. CentOS7+Docker+MangoDB下部署简单的MongoDB分片集群

    简单的在Docker上快速部署MongoDB分片集群 前言 文中使用的环境如下 OS:CentOS Linux release 7.5.1804 (Core) Docker:Docker versio ...

  7. [LOJ 6485]LJJ学二项式定理(单位根反演)

    也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 \(T\)组询问,每次给\(n,s,a_0,a_1,a_2,a_3\)求 \(\begin{aligned}\left ...

  8. javascript 之 扩展对象 jQuery.extend

    在JQuery的API手册中,extend方法挂载在JQuery 和 JQuery.fn两个不同的对象上,但在JQuery内部代码实现的是相同的,只是功能各不相同. 官方解释: jQuery.exte ...

  9. VS.NET(C#)--2.3良构的XHTML

    良构的XHTML 1.关闭所有标签 2.禁止标签嵌套 3.区分大小写 4.引号  所有属性值都要置于引号中 5.唯一的根元素<html></html> 6.保留字符 XML中五 ...

  10. winform 替换word文档中的字段(包含图片添加),生成导出PDF文件(也可是word文件)

    1.先打开你需要替换的word文档,在想要后续更换字段值的地方添加“书签”. 2.将模板文档存放在 程序的Debug文件下. 3.生成文件的按钮点击事件 代码: string templatePath ...