Python 测试框架:选择和运行测试

发表于:2009-9-14 14:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:IBM

  衍生测试(Generative tests)

  正如在第一篇文章中看到的,py.test 和 nose 都支持编写为简单函数的测试,这会大大简化 Python 测试的编写:

  # test_new.py - simple tests functions

  def testTrue(self):

  assert True == 1

  def testFalse(self):

  assert False == 0

  如果只需要在某一特定环境中检查组件行为,那么测试函数和更传统的测试类都可以满足需要。但是,如果要执行一系列测试,它们基本相同,只有一些参数有差异,那么怎么办?

  为了更容易实现这种测试,避免多次复制并粘贴测试函数以及设置惟一的名称,py.test 和 nose 都支持衍生测试(generative test)。这里的思想是,您提供一个测试函数,它实际上是一个迭代器,然后使用它的 yield 语句并提供调用参数,从而返回一系列函数。例如,如果希望针对一系列 Web 浏览器运行一个测试,可以编写下面这样的代码:

  # test_browser.py

  def check(browser, page):

  t = TestBrowser(browser)

  t.load_page(page)

  t.check_status(200)

  def test_browsers():

  for b in 'ie6', 'ie7', 'firefox', 'safari':

  for p in 'index.html', 'about.html':

  yield check, b, p

  对于衍生测试,py.test 更方便。因此您能够更加轻松的分辨出正在运行的测试,并在一个或多个测试失败时理解测试报告,在每个元组中提供的第一项可以是一个名称,它会作为测试名称的组成部分输出:

  # Alternate yield statement, for py.test

  ...

  yield 'Page %s browser %s' % (b,p), check, b, p

  当前,许多项目使用手工测试或者只能使用 unittest 支持的功能,这些技术非常笨拙。衍生测试提供了好得多的参数化测试解决方案。

  setup 和 teardown

  在设计和编写测试套件时,一个大问题是如何处理共同的 setup 和 teardown 代码。许多真实的测试并不像本文给出的示例函数这么简单;它们必须执行一些复杂的操作,比如在 Firefox 中打开网页并单击 “Continue” 按钮,然后检查结果。在开始实际测试(比如打开页面并单击按钮)之前,测试必须先完成一些步骤。

  现在,考虑如果一百个功能性测试都要这样执行测试,会怎么样。它们都需要通过调用共同的 setup 例程运行 Firefox,然后才能执行自己的测试。与此相应,为了取消 setup 所做的操作,可能还有 teardown 代码。这样,在测试套件中就会增加两百个额外的函数调用。每个测试函数会像下面这样:

  # How test functions look if they each do setup and teardown

  def test_index_click_continue():

  do_big_setup()          # <- the same in every test

  t = TestBrowser(browser)

  t.load_page('index.html')

  t.click('#continue')

  t.check_status(200)

  do_big_teardown()       # <- the same in every test

  为了消除这些重复的代码,许多测试框架提供了一次性指定每个测试都需要运行的 setup 和 teardown 代码的机制。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号