python - Nose 测试有问题吗?使用 autospec=True 添加新案例将需要 15 秒

标签 python unit-testing nosetests

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 添加新的测试用例和类 所以,我发现了性能问题。

我在tests/small中运行了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.1 秒增加到 14.5 秒。

有趣的是,如果我们单独运行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 时几乎相同。

有什么想法吗?我对 Nose 测试内部了解不够。

最佳答案

这是一种猜测,因为我不知道您的请求代码的作用......

mock autospec argument用于创建与模拟对象具有相同签名的模拟。要进行此设置,the create_autospec() function必须对被替换的对象进行一些认真的、递归的内省(introspection)。我猜想这个过程对于您的请求库来说很慢。

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

仅请求的 autospec 部分是否可行?例如:

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()的递归调用。当然,它改变模拟的行为,因此我会仔细测试它以确保它达到您的预期。

关于python - Nose 测试有问题吗?使用 autospec=True 添加新案例将需要 15 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257964/

相关文章:

python - 如何更改pytest中的错误和故障检测?

nosetests 在多类 python 文件中针对特定类运行测试 -m 不起作用!!!!啊啊

python - 在多进程模式下运行 Nose 测试时,导入未得到正确处理

python - 如果用户在一段时间内不活动,则使用户 session 过期,并在数据库中记录其 session 开始和结束时间

Python - 我应该使用只读 @property 而不使用 init 或 setter 吗?

c# - 使用 EF Core 2.0 时的单元测试

python - 如何使用 Nose 忽略特定文件夹中的所有测试?

python - 在转换为列表时,如何防止 Python 将两位数整数拆分为两个整数

Windows 上的 Python 2.7,所有多处理示例的 "assert main_name not in sys.modules, main_name"

c# - 为什么 RhinoMocks 在我的测试中抛出 InvalidOperationException?