2

我的 Pyramid 项目之一中有一个测试文件。它有一套包含六个测试的套件:

...
from .scripts import populate_test_data

class FunctionalTests(unittest.TestCase):

    def setUp(self):
        settings = appconfig('config:testing.ini',
                             'main',
                             relative_to='../..')
        app = main({}, **settings)
        self.testapp = TestApp(app)
        self.config = testing.setUp()
        engine = engine_from_config(settings)
        DBSession.configure(bind=engine)
        populate_test_data(engine)

    def tearDown(self):
        DBSession.remove()
        tearDown()

    def test_index(self):
        ...

    def test_login_form(self):
        ...

    def test_read_recipe(self):
        ...

    def test_tag(self):
        ...

    def test_dish(self):
        ...

    def test_dashboard_forbidden(self):
        ...

现在,当我运行时nosetests templates.pytemplates.py提到的文件在哪里),我得到以下输出:

......E
======================================================================
ERROR: templates.populate_test_data
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yentsun/env/local/lib/python2.7/site-packages/nose-1.1.2-py2.7.egg/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/home/yentsun/env/local/lib/python2.7/site-packages/nose-1.1.2-py2.7.egg/nose/util.py", line 622, in newfunc
    return func(*arg, **kw)
TypeError: populate_test_data() takes exactly 1 argument (0 given)

----------------------------------------------------------------------
Ran 7 tests in 1.985s

FAILED (errors=1)

当我使用指定的测试套件运行测试时nosetests templates.py:FunctionalTests,输出如预期的那样正常:

......
----------------------------------------------------------------------
Ran 6 tests in 1.980s

OK

为什么我有不同的输出以及为什么要运行额外的(第 7 次)测试?

更新。这有点令人沮丧,但是当我从名称中删除单词testpopulate_test_data时(它变成了populate_dummy_data),一切正常。

现在问题已经解决了,但也许有人知道这里出了什么问题——为什么一个函数setUp已经被测试了?

4

1 回答 1

3

查找和运行测试

默认情况下,鼻子遵循一些简单的测试发现规则。

  • 如果它看起来像一个测试,那就是一个测试。目录、模块、类和函数的名称与testMatch 正则表达式进行比较,匹配的被认为是测试。任何作为 unittest.TestCase 子类的类也会被收集,只要它位于看起来像测试的模块内部。

(来自鼻子 1.3.0 文档

在鼻子的代码中,正则表达式定义为r'(?:^|[\b_\.%s-])[Tt]est' % os.sep,如果您检查nose/selector.py, 方法,Selector.matches(self, name)您将看到代码使用re.search,它在字符串中的任何位置查找匹配项,而不仅仅是在开头,也是re.match如此。

一个小测试:

>>> import re
>>> import os
>>> testMatch = r'(?:^|[\b_\.%s-])[Tt]est' % os.sep
>>> re.match(testMatch, 'populate_test_data')
>>> re.search(testMatch, 'populate_test_data')
<_sre.SRE_Match object at 0x7f3512569238>

因此populate_test_data,按照鼻子的标准,确实“看起来像一个测试”。

于 2013-05-10T20:22:22.140 回答