1

http://lists.idyll.org/pipermail/testing-in-python/2013-March/005467.html

我昨天发了这个。我并不是要仓促复制。但我想尽快解决这个问题。同时我会测试各个测试模块。此外,通常而言,stackoverflow 的用户数比邮件列表多。

这是回购: https ://bitbucket.org/yeukhon/bitbucket-python-api/src/18ddb36b9c7c7297398a6e97b889ddfc9b5e5ae8/tests/small?at=default

我有一个基本单元测试类base.py。对于test_bitbucket.py,我从基本单元测试类继承。我想添加新的测试用例和类test_bitbucket.py在这样做时,我发现了性能问题。

nosetests在测试/小范围内运行,我得到了这些混合结果

Ran 18 tests in 14.523s        - autospec=True and test_account_creation
exists

Ran 18 tests in 0.621s         - autospec=False and test_account_creation exists


Ran 17 tests in 1.081s         - autospec=True and test_account_creation is
commented out

Ran 17 tests in 0.090s         - autospec=False, and test_account_creation
commented out

我知道 requests 是一个很大的库,但是性能的影响是疯狂的,分别从 1.1s 到 14.5s 有和没有新的测试类。

有趣的是,如果我们test_bitbucket.py单独运行。

(bbpy)yeukhon at yeukhon-P5E-VM-DO:~/hg/bitbucket-python-api/tests/small$
nosetests test_bitbucket.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.090s

OK

开启/不开启 autospec 几乎相同。

任何想法?我对nosetests内部的了解不够。

4

1 回答 1

1

这是一种猜测,因为我不知道您的请求代码做了什么......

模拟autospec参数用于创建与模拟对象具有相同签名的模拟为了设置它,create_autospec() 函数必须对被替换的对象进行一些严肃的递归内省。我猜这个过程对于您的请求库来说很慢。

首先要考虑的是为什么要进行自动检测?您是否担心对模拟对象的调用没有正确的签名?这是一个合理的防范措施,但我认为这不值得被罚 15 秒!

仅对部分请求进行自动指定是否可行?例如:

cls.req_pt = patch(cls.mod_name + '.requests')
cls.requests = cls.req_pt.start()

cls.rim_pt = patch(cls.mod_name + '.requests.really_important_method', autospec=True)
cls.rim = cls.req_pt.start()

要尝试的另一件事是instance=True在补丁构造函数中设置:

cls.req_pt = patch(cls.mod_name + '.requests', autospec=True, instance=True)
cls.requests = cls.req_pt.start()

从我对 mock.py 的阅读来看,这似乎应该限制对 create_autospec() 的递归调用。当然,它改变模拟的行为,所以我会仔细测试它以确保它符合您的期望。

于 2013-03-07T19:46:59.207 回答