Python自带一个单元测试框架,unittest模块,用它来做单元测试,它里面封装好了一些校验返回结果的方法和一些用例执行前的初始化操作

在说unittest之前,先说几个概念:

TestCase:测试用例

TestSuite:多个测试用例集合在一起

TestLoader:用来加载TestCase到TestSuite

TestRunner:执行测试用例,测试的结果保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

import unittest

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

 下面是一些常用的断言,也就是校验结果

        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

HTMLTestRunner模块,可以生成测试报告,这个模块需要自己安装,使用执行测试用例就会生成一个HTML的测试报告,里面会有每个测试用例的执行结果,

import HTMLTestRunner
import unittest
class MyTest(unittest.TestCase):#继承unittest.TestCase
def tearDown(self):
#每个测试用例执行之后做操作
print('111')
def setUp(self):
#每个测试用例执行之前做操作
print(22222)
def test_run(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
def test_run2(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
def test_run3(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
def test_run1(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
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(stream=fp,title='api测试报告',description='测试情况')
#生成执行用例的对象
runner.run(test_suite)
#执行测试套件

  如果我们有多个模块,每个模块下都写了很多Python文件,每个Python文件里面都有测试用例,那怎么把这个目录下的用例都执行呢,就是要先找到这个目录下的所有Python文件,然后找到里面的测试用例,逐个执行

import unittest,HTMLTestRunner
suite = unittest.TestSuite()#创建测试套件
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
#找到某个目录下所有的以test开头的Python文件里面的测试用例
for case in all_cases:
suite.addTests(case)#把所有的测试用例添加进来
fp = open('res.html','wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况')
runner.run(suite)
#运行测试

  我们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,但是上面产生的测试报告都是HTML格式的,Jenkins不认识,就在Jenkins里面显示不出来。那就要生成Jenkins认识的测试报告,Jenkins认识XML格式的报告,那就产生XML格式的报告,这就需要新的模块,xmlrunner,安装直接pip install xmlrunner

import unittest
import xmlrunner
#导入这个模块
class My(unittest.TestCase): def test1(self,a,b,c):
self.assertEqual(a+b,c) if __name__=='__main__':
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(My))
runner = xmlrunner.XMLTestRunner(output='report')#指定报告放的目录
runner.run(test_suite)

  运行之后,就会在report目录生成XML格式的测试报告了,还自动添加了日期

转载

Python模块unittest的更多相关文章

  1. Python之unittest测试代码

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

  2. 【转】python模块分析之unittest测试(五)

    [转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...

  3. Python中的单元测试模块Unittest快速入门

    前言 为什么需要单元测试? 如果没有单元测试,我们会遇到这种情况:已有的健康运行的代码在经过改动之后,我们无法得知改动之后是否引入了Bug.如果有单元测试的话,只要单元测试全部通过,我们就可以保证没有 ...

  4. python使用unittest模块selenium访问斗鱼获取直播信息

    import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unitt ...

  5. python单元测试unittest

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

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

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

  7. [转]python单元测试unittest

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

  8. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  9. 【转】python模块分析之typing(三)

    [转]python模块分析之typing(三) 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度 ...

随机推荐

  1. vue 无缝滚动文字

    前言 用vue做无缝滚动,字体弹幕 就上代码吧 <head> <meta charset="UTF-8"> <style> div, ul, l ...

  2. Text-CNN 文本分类

    1.简介 TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classifica ...

  3. PWM 定义

    简单的说,比如你有5V电源,要控制一台灯的亮度,有一个传统办法,就是串联一个可调电阻,改变电阻,灯的亮度就会改变.还有一个办法,就是PWM调节.不用串联电阻,而是串联一个开关.假设在1秒内,有0.5秒 ...

  4. Devexpress 10

    序言 Grid表格 资料 https://www.devexpresscn.com/

  5. BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划

    第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...

  6. Java虚拟机之JVM调节参数

    -XX:+PrintGC 使用这个参数,虚拟机启动后,每次GC就会打印日志. -XX:+UseSerialGC 使用串行垃圾回收器. -XX:+PrintGCDetails 打印详细信息.包括各个区的 ...

  7. Jedis下的ShardedJedis

    jedis客户端操作redis主要三种模式:单台模式.分片模式(ShardedJedis).集群模式(BinaryJedisCluster) ShardedJedis是通过一致性哈希来实现分布式缓存的 ...

  8. [BZOJ2560]串珠子:状压DP+容斥原理

    分析 为什么我去年6月做过这道题啊,估计当时抄的题解. 具体做法就是令\(f[S]\)表示保证连通点集\(S\)的方案数,\(g[S]\)表示不保证连通点集\(S\)的方案数. 容易想到: \[g[S ...

  9. linux命令之查找find &grep

    区别:find找目录下的文件:find+目录路径+条件表达式,grep找文件中的行:grep+匹配正则表达式+文件名 find命令 find命令的一般形式 find命令的常用选项及实例 find与xa ...

  10. json根据一个值返回对象,filter方法使用

    d = {   "student":[     {       "count":1000,       "stuList":[        ...