Python单元测试框架unittest
学习接口自动化测试时接触了unittest单元测试框架,学习时参照了虫师编写的《selenium2自动化测试实战》,个人觉得里面讲的例子还比较容易理解的。
一、基础
1、main()和框架的简单使用,例:
import unittest #导包
import calculator import Count
class TestCount(unittest.TestCase): #继承unittest
def setUp(self):
print("test start")
def test_add(self):
i = Count(2,3)
self,assertEqual(j.add(),5)
def tearDown(self):
print("test end")
if __name__=='__main__':
unittets.main()
上面的代码,先引入unittest模块,创建TestCout类继承unittest的TestCase类
assertEqual()是unittest框架提供的断言方法,判断两者是否相等
unittest提供了全局的main()方法。可以将一个单元测试模块变成可以直接运行的测试脚本。
main()方法使用testLoader类来搜索所有包含在该模块总以“test”命名开头的测试方法,并自动执行他们
备注:setup和teardown和obotframework里的初始化清除类似。
2、执行测试集
if __name__ == '__main__':
#构造测试集
suite=unittest(TestAdd("test_add"))
suite.addTest(TestAdd("test_add2"))
suite.addTest(TestSub("test_sub")) #TestSub是要被执行测试用例的类名,test_sub方法名 #运行测试集合
8 runner = unittest.TestTestRunner()
9 runner.run(suite)
通过TestSuite类的addTest()方法把不同测试类中的测试方法组装到测试套件中
3、常用断言方法
assertEqual(a,b) #a==b
assertNotEqual(a,b) #a!=b
asserTrue(x) #bool(x)is True
assertFalse(x) #bool(x) is False
assertIs(a,b) #a is b
assertIsNot(a,b) #a is not b
assertIsNone(x) #x is None
assertIn(a,b) #a in b
assertNotIn(a,b) #a not in b
assertIsInstance(a,b) #isinstance(a,b)
assertNotIsInstance(a,b) #not isinstance(a,b)
4、跳过测试
在运行测试时,有时需要跳过某些测试用例,或当用例复合某个条件时跳过测试,或直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器
unittest.skip(reason) #无条件地跳过装饰的测试,说明跳过的原因
unittest.skipIf(condition,reason) #如果条件为真,跳过装饰的测试
unittest.skipUnless(condition,reason) #除非条件为真,跳过装饰的测试
unittest.expectedFailure() #不管执行直接是否失败,都标记为失败
例:
@unittest.skip("直接跳过测试")
def test_skip(self):
3 print("test") @unittest.skip(3>2,“当条件为True时跳过测试”)
def test_skip_if(self):
print("test111") @unittest.skipUnless(3>2,"当条件为True时,执行测试")
def test_skip_unless(self):
print("test22") @unittest.expected_Failure
def test_expected_failure(self):
assertEqual(2,3) if __name__=='__main__':
18 unittest.main()
5、discover()
a、TestLoader()
该类负责根据各自标准加载测试用例,并将他们返回给测试套件。unittest提供了可以共享的defaultTestLoader类,可以使用其子类和方法创建实例,比如discover()
b、discover(start_dir,pattern='test*.py',top_level_dir=None)
作用:找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定
start_dir:要测试的模块名或测试用例目录
pattern='test*.py':匹配文件名以“test"开头的”.py"类型的文件,“*”表示任意多个字符
top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None
示例:
import unittest #定义测试用例的目录为当前目录
test_dir='./'
discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') if __name__=='__main__':
runner=unittest.TextTestRunner()
runner.run(discover)
discover()方法会自动根据测试目录(test_dir)匹配查找测试用例(test*.py),并将查找到的测试用例组装到测试条件中。
二、unittest数据参数化
unittest本身不支持参数化,但是可以借助其他方法
1、unittest中使用第3方插件parameterized进行参数化
首先在DOS中键入以下命令安装parameterized
python -m pip install parameterized
导包:
from parameterized import parameterized
例:
import unittest
from pylibrary.PyLib import * class Interface_Report2(unittest.TestCase): #开始使用parameterized
@parameterized.expand([ #引用装饰器,准备参数,传入下方的函数
("2018-09-26", '2018-09-26', "测试", "",49,'TotalCallNum'),
("2018-09-26", '2018-09-26', "测试", "",60,'TotalCallAnsweredNum'),
("2018-09-26", '2018-09-26', "测试", "",60,'RingNum'),
("2018-09-13", '2018-09-13', "测试", "",4,'TotalCallNum_Transfer'),
]) def test_Agreport1(self,start_time,end_time,template_name,ag_num,testData,reportData): #当执行到此会自动接收上面传入的参数
self.num = testData
self.report_num1 = PyLib().getAgReport(start_time,end_time,template_name,ag_num)
self.report_num=self.report_num1[0][reportData]
self.assertEqual(self.num,self.report_num) if __name__ == '__main__': unittest.main(verbosity=2) #verbosity表示测试结果的信息复杂度,分别使用0,1,2,其具体的含义如下:
#0(静默模式):仅仅获取总的测试用例数以及总的结果
#1(默认模式):此时在每个成功的用例前面有个’.’,每个失败的用例前面有个’F’
#2(详细模式):测试结果会显示每个测试用例的所有相关信息
2、unittest的ddt库
pip install ddt
首先创建一个数据文件:test_ddt_file.json
{
"test_Agreport1_01":{
"start_time":"2018-09-26",
"end_time":"2018-09-26",
"template_name": "测试",
"ag_num":"",
"testData":49,
"reportData":"TotalCallNum"
},
"test_Agreport1_02":{
"start_time":"2018-09-26",
"end_time":"2018-09-26",
"template_name": "测试",
"ag_num":"",
"testData":60,
"reportData":"TotalCallAnsweredNum"
},
"test_Agreport1_03":{
"start_time":"2018-09-26",
"end_time":"2018-09-26",
"template_name": "测试",
"ag_num":"",
"testData":60,
"reportData":"RingNum"
},
"test_Agreport1_04":{
"start_time":"2018-09-13",
"end_time":"2018-09-13",
"template_name": "测试",
"ag_num":"",
"testData":4,
"reportData":"TotalCallNum_Transfer"
}
}
创建测试用例:
import unittest
from pylibrary.PyLib import *
from ddt import ddt, file_data @ddt
class Interface_Report2(unittest.TestCase): @file_data("D:\\Python_code\\test_ddt_file.json")
def test_Agreport1(self,start_time,end_time,template_name,ag_num,testData,reportData):
self.num = testData
self.report_num1 = PyLib().getAgReport(start_time,end_time,template_name,ag_num)
self.report_num=self.report_num1[0][reportData]
self.assertEqual(self.num,self.report_num) if __name__ == '__main__': unittest.main(verbosity=2)
三、命令行运行
命令行运行我使用的比较少,一般用pycharm直接就运行了。以下作为以后参考使用吧
通过命令行运行:模块、类、或者单个测试方法,具体的操作是如下:
运行测试模块:python -m unittest test_module1 test_module2
运行测试类:python -m unittest test_module.TestClass
运行测试方法:python -m unittest test_module.TestClass.test_method
可以在一个列表中添加需要运行的模块名、类名、方法名。
可以通过使用-v参数获取更详细的测试信息:python -m unittest -v test_module
可以通过-h参数查看命令行所有参数:python -m unittest -h
命令行参数:
-b --buffer
在测试运行期间标准输出流和标准错误流被缓存。输出通过测试信息。
输出在测试失败或错误时正常回显,并添加到失败消息中。
-c --catch
Ctrl+C在测试运行期间等待当前测试结束,然后报告到目前为止的所有结果。
第二个Ctrl+C会引发KeyboardInterrupt异常。
-f --failfast
在第一个错误或故障时停止测试运行。
命令行也可用于测试发现(Test Discovery),用于运行项目中的所有测试或仅用于子集。
Unittest支持简单的测试发现(Test Discovery)。为了与测试发现兼容,
所有测试文件必须是可从项目的根目录导入的模块或包(这意味着它们的文件名必须是有效的标识符)。
Test Discovery是通过TestLoader.discover()实现,也可以通过命令行实现。
基本的命令行用法:
cd project_directory #进入项目目录根目录
python -m unittest discover #执行命令
discover子命令的参数如下:
-v , --verbose
详细输出
-s , --start-directory directory
执行发现的起始目录(directory),默认是当前目录(.)
-p, --pattern pattern
匹配测试文件的模式(pattern),默认是test*.py
-t, --top-level-directory directory
项目(directory)的目的的根目录(默认是起始目录)
-s、-p、-t命令可以在一个命令行中联合使用。下面两个命令是等价的:
python -m unittest discover -s project_directory -p "*_test.py"
python -m unittest discover project_directory "*_test.py"
作为一个路径,可以传递一个包名称,例如myproject.subpackage.test作为开始目录。
然后将导入提供的软件包名称,并将其在文件系统上的位置用作开始目录。
注意:测试发现通过导入来加载测试。一旦测试发现已经从指定的开始目录中找到所有测试文件,
它将路径转换为要导入的包名称。例如foo / bar / baz.py将导入为foo.bar.baz。
如果有全局安装的软件包,并尝试在软件包的不同副本上进行测试发现,
那么导入可能发生在错误的位置。如果发生这种情况,测试发现将警告并退出。
如果提供开始目录作为包名称而不是目录的路径,则发现假定它从其导入的任何位置是想要的位置,因此不会得到警告。
测试模块和包可以通过load_tests协议自定义测试加载和发现。
'''
import os
#进入到TestHello.py路径下
os.chdir(".//TestSuit_01")
print os.getcwd()
print '''可以通过命令行测试信息'''
#运行测试模块TestHello.py
os.system("python -m unittest TestHello")
#运行测试类TestHello
os.system("python -m unittest TestHello.TestHello")
#运行测试方法
os.system("python -m unittest TestHello.TestHello.test_Hello")
print "#"*50
print '''可以通过使用-v参数获取更详细的测试信息'''
#运行测试模块TestHello.py
os.system("python -m unittest -v TestHello")
#运行测试类TestHello
os.system("python -m unittest -v TestHello.TestHello")
#运行测试方法
os.system("python -m unittest -v TestHello.TestHello.test_Hello")
print "#"*50
print '''可以通过-h参数查看命令行所有参数:python -m unittest -h'''
os.system("python -m unittest -h")
print "#"*50
print "命令行参数:-b -c -f"
#运行测试模块TestHello.py
os.system("python -m unittest -b TestHello")
#运行测试类TestHello
os.system("python -m unittest -c TestHello.TestHello")
#运行测试方法
os.system("python -m unittest -f TestHello.TestHello.test_HelloType")
print "#"*50
#使用测试发现命令执行所有测试
print "使用测试发现执行项目中的所有测试"
#进入到UnttestPro
os.chdir("../")
print "The current path:",os.getcwd()
#全部使用默认的参数
Python单元测试框架unittest的更多相关文章
- Python单元测试框架unittest使用方法讲解
这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容,需要的朋友可以参考下 概 ...
- Python单元测试框架unittest之深入学习
前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test c ...
- Python单元测试框架unittest之单用例管理(一)
一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...
- Python单元测试框架unittest重要属性 与 用例编写思路
前言 本文为转载,原文地址作者列举python unittest这个测试框架的主要属性和 测试用例思路 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行, ...
- python单元测试框架-unittest(一)
简介 unittest单元测试框架不仅可以适用于单元测试,还可以使用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. ...
- Python单元测试框架——unittest
测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过se ...
- Python单元测试框架 unittest详解
一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. TestCase :通过继承TestCase类,我们可 ...
- python单元测试框架-unittest(四)之用例综合框架管理
简述为何如要框架? 前面测试用例与执行都是写在一个文件,当用例数量不断增加的时候,用例的执行与管理变得非常麻烦,因此需要对用例根据具体的功能模块来使用单独的模块来管理.就像一所学校要根据不同年级进行分 ...
- Python3 Selenium自动化web测试 ==> 第一节 起始点之Python单元测试框架 unittest
前置步骤 Python版本:3.6.4 selenium版本:3.11.0 >>> import selenium >>> help(selenium) IDE:P ...
随机推荐
- Windows 10安装Docker 步骤及顺序
最近在工作中,重新安装Docker时,遇到了一点坑,故将自己解决经验分享一下~ Hardware assisted virtualization and data execution protecti ...
- mat-form-field must contain a MatFormFieldControl错误的解决方法
下面的代码竟然出错了: <mat-form-field> <input matInput placeholder="输入名称"> </mat-form ...
- 第四周Java作业
老师说让用二维数组找最大,也就是最大和块,要求必须挨着,我其实不会写这个程序,所以我只能把自己的思路写出来 我觉得可以大问题缩小,我的思路是先把四个数一个正方形来进行计算,然后六个数矩形,把他化成两个 ...
- Nginx配置选项
--prefix=path 定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录.默认使用 /usr/local/nginx. --sbin-path=path 设置nginx的可执行 ...
- python下载及安装
1, 许多新学员不知道开始学Python需要安装什么,需要准备什么,特地写下这篇文档给一脸懵逼的新同学们作为指导文档. 2, 首先,学Python需要有一台电脑,这是必须的.老师的系统是windows ...
- Oracle VM Virtual 安装 ubuntu 后设置全屏
按照正常流程在vm中安装了ubuntu之后,发现ubuntu系统无法全屏显示,解决途径如下: 1.在vm中点击设置 2.选择“安装增强功能” 3.正常情况下,我们可以在桌面看到一个光盘图标(文件名:V ...
- day1:java学习第一天之eclipse安装
选择开发语言的学习其实不用纠结,如果你说自己是做开发的,连最流行的开发语言都不会,好像说不过去,并且最流行也说明用的人多,优秀的人也会,自己要提高要多向优秀的人学习.想明白这点其实选择就好说了,再一个 ...
- MyBatis探究-----返回Map类型数据
1.使用@MapKey @MapKey:告诉mybatis封装Map的时候使用哪个属性作为Map的key Map<K, V>:键是这条记录的主键key,值是记录封装后的javaBean 1 ...
- SQL Server 复制表结构以及数据,去除表中重复字段
--复制另一个数据库中的某张表的结构及数据--select * from Test.dbo.TestTable(查询表中所有数据) --into [表名] 插入当前数据库新表,如果没有该表就创建 se ...
- tomcat启动命令行中文乱码
1.找到${CATALINA_HOME}/conf/logging.properties 2.添加语句:java.util.logging.ConsoleHandler.encoding = GBK ...