Python单元测试框架
作者:网络转载 发布时间:[ 2015/1/4 13:50:41 ] 推荐标签:Python 单元测试
更多关于测试条件
我之前建议过应使用Python内建断言机制来检查测试用例中的条件,而不应使用自己编写的替代品,因为assert更简单,简明且为大家所熟悉。
但是值得注意的是,如果在运行测试的同时Python优化选项被打开(生成“.pyo"字节码文件),那么assert语句将会被跳过,使得测试用例变得无用。
我为那些需要使用Python优化选项的用户编写了一个assert_方法并添加进TestCase类内。它的功能和内建的assert相同且 不会被优化删除,但是使用较麻烦且所输出错误信息帮助较小:
def runTest(self):
self.assert_(self.widget.size() == (100,100), "size is wrong")
我还在TestCase类中提供了failIf和failUnless两个方法:
def runTest(self):
self.failIf(self.widget.size() <> (100,100))
测试方法还可以通过调用fail方法使得测试立即失败:
def runTest(self):
...
if not hasattr(something, "blah"):
self.fail("blah missing")
# or just 'self.fail()'
测试相等性
常用的断言是测试相等性。如果断言失败,开发者通常希望看到实际错误值。
TestCase包含一对方法assertEqual和assertNotEqual用于此目的(如果你喜欢,你还可以使用别名:failUnlessEqual 和 failIfEqual):
def testSomething(self):
self.widget.resize(100,100)
self.assertEqual(self.widget.size, (100,100))
测试异常
测试经常希望检查在某个环境中是否出现异常。如果期待的异常没有抛出,测试将失败。这很容易做到:
def runTest(self):
try:
self.widget.resize(-1,-1)
except ValueError:
pass
else:
fail("expected a ValueError")
通常,预期异常源(译者注:将抛出异常的代码)是一个可调用对象;为此,TestCase有一个assertRaises方法。此方法的前两个参数是应该出现在“except”语句中的异常和可调用对象。剩余的参数是应该传递给可调用对象的参数。
def runTest(self):
self.assertRaises(ValueError, self.widget.resize, -1, -1)
通过PyUnit复用旧测试代码
一些用户希望将已有的测试代码不需转变为TestCase子类而直接从PyUnit中运行。
为此,PyUnit提供了一个FunctionTestCase类。这个TestCase子类可以用来包装已有测试函数。设置和清理函数也可以选择性地被包装。
对于以下测试函数:
def testSomething():
something = makeSomething()
assert something.name is not None
...
我们可以创建一个等同的测试用例实例:
testcase = unittest.FunctionTestCase(testSomething)
如果有附加的设置和清理方法需要由测试用例调用,可以如下操作:
testcase = unittest.FunctionTestCase(testSomething,
setUp=makeSomethingDB,
tearDown=deleteSomethingDB)
在JPython和Jython中使用PyUnit
虽然PyUnit主要是为“C” Python所编写,你仍然可以用Jython编写PyUnit测试,来测试你的Java或Jython软件。这比用Jython编写JUnit测试更可取。PyUnit也可以正确的与Jython前期版本,Jython 1.0和1.1协同工作。
当然,Java不包含TK GUI接口,所以PyUnit的基于TKinter的GUI是不能在Jython下工作的,但是基于文本的接口是可以正常工作的。
要在Jython中使用PyUnit的文本接口,只需简单的将标准C Python库模块文件‘traceback.py', 'linecache.py', 'stat.py' 和 'getopt.py'复制到可以被JPython引用到的位置上。你可以在任何C Python发布版中找到这些文件。(这是针对C Python 1.5.x版本的标准库,可能对其它版本Python不适用)
现在你完全可以像在C Python中那样编写你的PyUnit测试了。
注意事项
断言
参见 "更多关于测试条件" 部分所述注意事项。
内存使用
当异常在测试套件运行过程中被抛出时,因此产生的追溯(traceback)对象将被保存,以使失败信息可以在测试运行结束后被格式化输出。除了简便性,这样做的另一个优点是未来的GUI TestRunner可以在后期查看保存在追溯对象中的本地和全局变量。
一个可能的副作用是,当运行一个失败频率很高的测试套件时,为保存所有这些追溯对象而需要的内存使用量将成为一个问题。当然,如果很多测试是失败的,内存的消耗也只是你的问题中微不足道的一个。
使用条款
你可以依据Python所使用的自由条款来自由的使用,更改和重新发布此软件。我只要求我的名字,email地址和项目URL保留在代码和随行文档中,给予我作为原作者的尊重。
我编写此软件的初衷是为改进世界上软件质量而贡献微薄之力;我不求金钱回报。(这不是说我不欢迎赞助)
未来计划
一个关键的未来计划是将TK GUI和IDLE IDE整合在一起,欢迎加入!
除此之外,我没有要扩展此模块功能的庞大计划。我使PyUnit尽可能的简单(希望不能再简单了)因为我相信一些常用的辅助性的模块,比如日志文件比较,好还是由测试编写者自行编写。
更新与社区
新闻,更新以及更多信息可以在项目网站获得。
欢迎各种评论,建议和错误报告;只需给我发送电子邮件或者这个非常小量的邮件列表并发表你的评论。现在有大量的PyUnit使用者,他们都有智慧与大家分享。
鸣谢
Many thanks to Guido and his disciples for the Python language. In tribute, I have written the following haiku (or 'pyku', if you will):
Guido van Rossum
'Gawky Dutchman' gave birth to
Beautiful Python
I gratefully acknowledge the work of Kent Beck and Erich Gamma for their work on JUnit, which made the design of PyUnit a no-brainer.
Thanks also to Tim Voght; I discovered after I had implemented PyUnit that he had also implemented a 'pyunit' module as part of his 'PyWiki' WikiWikiWeb clone. He graciously gave me the go-ahead to submit my version to the community at large.
Many thanks to those who have written to me with suggestions and questions. I've tried to add appropriate credits in the CHANGES file in the download package.
Particular thanks to J¨|r?me Marant, who packaged PyUnit for Debian.
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11