PyUnit提供的动态方法,只编写一个测试类来完成对整个软件模块的测试,这样对象的初始化工作可以在setUp()方法中完成,而资源的释放则可以在tearDown()方法中完成。

使用PyUnit可以像xunit那样设置一个个函数,分别测试不同的数据和不同的用例。

例如,构建下面的测试类,测试远程API服务

  class Request:
def __init__(self):
pass
def request(self,RequestMethod,RequestURL,param,requestHeaders):
return Request.__dict__[RequestMethod](self,RequestURL,param,requestHeaders)
def get(self,RequestURL,param,requestHeaders):
RequestURL=RequestURL+"?"+urllib.parse.urlencode(param)
req = url.Request(RequestURL)
result = url.urlopen(req).read()
return result
def post(self,RequestURL,param,requestHeaders):
postdata= json.dumps(param)
req = url.Request(
url = RequestURL,
data = postdata.encode("utf-8"),
headers = requestHeaders
)
result = url.urlopen(req).read()
return result

想要知道其中执行结果,构造下面的测试类

  class APITest(unittest.TestCase):
def setUp(self):
self.r=Request()
def test_UserPermisionQueryPost(self):
RequestURL="http://10.125.198.137/permission/table/listUserTablePermissions.json"
RequestMethod="post"
requestHeaders={"Accept":"*/*",}
param={
"tablePermissionParam": {
"currentPage": 1,
"pageSize": 50,
"tablename": "s_auction_auctions",
"usernames": [
""
]
}
}
expectResult=b'{"returnCode":"0","returnValue":[{"id":2067,"username":"067765","tablename":"s_auction_auctions","packagename":"yunti1.taobao","readlevelpermission":2,"permissiontime":
"2014-03-18 06:02:10","distabletime":"2015-03-18 06:02:08","permissionstatus":1,"gmtCreate":"2014-03-18 06:02:10","gmtModify":"2014-03-18 06:02:10","columns":["id","title"]}]}'
self.assertEqual(self.r.request(RequestMethod,RequestURL,param,requestHeaders),expectResult)
def test_UserPermisionQueryGet(self):
RequestMethod="get"
RequestURL="http://10.125.198.137/permission/table/listUserTablePermissions"
param={"tablename":"s_auction_auctions"}
expectResult=b'{"returnCode":"0","returnValue":[{"id":2067,"username":"067765","tablename":"s_auction_auctions","packagename":"yunti1.taobao","readlevelpermission":2,"permissiontime":
"2014-03-18 06:02:10","distabletime":"2015-03-18 06:02:08","permissionstatus":1,"gmtCreate":"2014-03-18 06:02:10","gmtModify":"2014-03-18 06:02:10","columns":["id","title"]},{"id":2066,
"username":"","tablename":"s_auction_auctions","packagename":"yunti1.taobao","readlevelpermission":2,"permissiontime":"2014-03-18 06:02:10","distabletime":"2015-03-18 06:02:08",
"permissionstatus":1,"gmtCreate":"2014-03-18 06:02:10","gmtModify":"2014-03-18 06:02:10","columns":["id","title"]}],"count":2}'
self.assertEqual(self.r.request(RequestMethod,RequestURL,param,""),expectResult)

PyUnit模块中定义了一个名为main的全局方法,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中的测试方法,并自动执行它们。如果Python程序员能够按照约定(以test开头)来命名所有的测试方法,那就只需要在测试模块的最后加入如下几行代码即可:

if __name__=='__main__':
unittest.main()

或者通过自己添加的方式决定哪些用例需要真正的被执行

 def suite():
suite = unittest.TestSuite()
suite.addTest(APITest("test_UserPermisionQueryGet"))
suite.addTest(APITest("test_UserPermisionQueryPost"))
runner = unittest.TextTestRunner()
runner.run(suite)

当选择main函数作为入口的时候,还可以获取到帮助信息

python3 ./Request.py  -h
Usage: Request.py [options] Options:
-h, --help show this help message and exit
-v, --verbose Verbose output
-q, --quiet Quiet output
-f, --failfast Stop on first fail or error
-c, --catch Catch ctrl-C and display results so far
-b, --buffer Buffer stdout and stderr during tests

直接在命令行中指定testSuite.testcase

python3 ./Request.py APITest.test_UserPermisionQueryGet
.
----------------------------------------------------------------------
Ran 1 test in 0.179s OK

pyunit实现数据测试框架的更多相关文章

  1. [译]PyUnit—Python单元测试框架(1)

    1. 原文及参考资料 原文链接:http://docs.python.org/2/library/unittest.html# 参考文档: http://pyunit.sourceforge.net/ ...

  2. Python unittest(PyUnit)单元测试框架

    PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...

  3. Pyunit测试框架

    一.概述 本系列主要解决的问题是“接口自动化测试”,选择的测试语言是 python 脚本语言.截至目前为止,python是公认的最好的用于自动化应用的语言之一 二.PyUnit测试框架 使用 pyth ...

  4. python自动化测试(3)- 自动化框架及工具

    python自动化测试(3) 自动化框架及工具 1   概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到 ...

  5. Python自动单元测试框架

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-pyunit/ 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写 ...

  6. [转] Python自动单元测试框架

    一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software ...

  7. Java单元测试框架 JUnit

    Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...

  8. Core Python Notes

    开发需要在读 Python 核心编程,一些 Point 记录如下. ******************************************** 版本相关 标准版的 Python 是用 C ...

  9. DevOps 开源工具

    1. 开发工具 版本控制&协作开发 版本控制系统 Git Git 是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.开源中国 Git 代码托管平台:http:/ ...

随机推荐

  1. CCOrbitCamera卡牌翻转效果

    static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngl ...

  2. Android(java)学习笔记114:LayoutInflater和findViewById

    1. 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(). 不同点是LayoutInflater是用来找res/layout/下的xml布局文件, ...

  3. java.lang.ClassNotFoundException: com.servlet.HandlesearchclassesServlet

    错误的原因: 原来命名为Handlesearchclasses导致与系统预留字冲突, 导致servlet找不到,出现404错误, 因此该变类名和web.xml里面的配置文件即可.

  4. MeasureSpec介绍

    在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统 ...

  5. RedHat7搭建yum源服务器

    1.新建目录 # mkdir -p /content/rhel7/x86_64/{isos,dvd}/ 2.上传RedHat安装光盘镜像,上传后的路径为 /content/rhel7/x86_64/i ...

  6. asp.net中web.config配置节点大全详解【转】

    web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web ...

  7. stop()方法的精准应用

    stop()方法在动画中扮演了很精彩的角色,他能够阻止连续动画或连续事件出现累积的状况,令动画有条不紊的进行. 1语法结构 stop([clearQueue],[gotoEnd]); 这两个参数都是可 ...

  8. Java Concurrency - Semaphore 信号量

    Semaphore 是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得 semaphore.如果 semaphore 的内部计数器的值大于 0,那么 semapho ...

  9. double的值太大,以及补0

    当double的值太大的时候,比如1000000000 用DecimalFormat: double d = 1.0E7; System.out.println(new DecimalFormat(& ...

  10. SQL_从星期一到星期六自动打卡SQL代码

    create proc sp_MarkAutoKQ as begin ) ---创建两个变量,接收当前时间和当天是星期几 set @dateA=getdate() ---获取当前时间 set @dat ...