Python 鼻子测试的臭虫?添加autospec=True的新案例需要15秒
我昨天贴的。我不想匆忙地重复。但我想尽快解决这个问题。我将同时测试各个测试模块。而且,一般来说,stackoverflow的用户比邮件列表的用户多 以下是回购协议: 我在Python 鼻子测试的臭虫?添加autospec=True的新案例需要15秒,python,unit-testing,nosetests,Python,Unit Testing,Nosetests,我昨天贴的。我不想匆忙地重复。但我想尽快解决这个问题。我将同时测试各个测试模块。而且,一般来说,stackoverflow的用户比邮件列表的用户多 以下是回购协议: 我在base.py中有一个基本单元测试类。对于test\u bitbucket.py,我继承 来自基本单元测试类。 我想在执行时向test\u bitbucket.py添加新的测试用例和类 所以,我发现了性能问题 我运行了nosetestsinsidetests/small,得到了这些混合结果 Ran 18 tests in 14
base.py
中有一个基本单元测试类。对于test\u bitbucket.py
,我继承
来自基本单元测试类。
我想在执行时向test\u bitbucket.py
添加新的测试用例和类
所以,我发现了性能问题
我运行了nosetests
insidetests/small,得到了这些混合结果
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
我知道请求是一个很大的库,但是性能的冲击是疯狂的,
从1.1s到14.5s,分别使用和不使用新的测试类
有趣的是,如果我们单独运行test\u 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的情况下基本相同
有什么想法吗?我对内部鼻测试了解不够。这是一种猜测,因为我不知道您的请求代码的作用 用于创建与模拟对象具有相同签名的模拟。要设置这个,必须对被替换的对象进行一些认真的递归自省。我猜这个过程对于您的请求库来说很慢 首先要考虑的是你为什么要自动选择?您是否担心对模拟对象的调用没有正确的签名?这是一个合理的防范措施,但我认为不值得罚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的阅读来看,这似乎应该限制递归调用来创建_autospec()。当然,它将改变模拟的行为,所以我会仔细测试它,以确保它符合您的预期。这是一种猜测,因为我不知道您的请求代码的功能 用于创建与模拟对象具有相同签名的模拟。要设置这个,必须对被替换的对象进行一些认真的递归自省。我猜这个过程对于您的请求库来说很慢 首先要考虑的是你为什么要自动选择?您是否担心对模拟对象的调用没有正确的签名?这是一个合理的防范措施,但我认为不值得罚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的阅读来看,这似乎应该限制递归调用来创建_autospec()。当然,它将改变模拟的行为,所以我会仔细测试它,以确保它符合您的期望。什么是“autospec=True且测试帐户创建存在”?您是在谈论是否在base.UnittestBaseClass的setUpClass中使用autospec吗?我在您链接的任何文件中都没有看到test_account_的创建。它有什么作用?@dbw谢谢你看它。我忘了放文件了。我更新了上面的lunk。基本上,我想添加一个新的测试类。该类中的新测试用例是
test\u account\u creation
。(实际上我给它起的名字略有不同)。下列的我对他们都做了鼻测试。花了15秒。哇!我注释了那个测试用例,它运行了大约1秒。可以这就是我在测试帐户创建存在或删除时的意思。我给出了补丁中autospec=True/False
时的结果(参见base.py),以及新测试用例test\u account\u creation
取消/注释时的结果。你说“autospec=True且test\u account\u creation存在”是什么意思?您是在谈论是否在base.UnittestBaseClass的setUpClass中使用autospec吗?我在您链接的任何文件中都没有看到test_account_的创建。它有什么作用?@dbw谢谢你看它。我忘了放文件了。我更新了上面的lunk。基本上,我想添加一个新的测试类。该类中的新测试用例是test\u account\u creation
。(实际上我给它起的名字略有不同)。下列的我对他们都做了鼻测试。花了15秒。哇!我注释了那个测试用例,它运行了大约1秒。可以这就是我在测试帐户创建存在或删除时的意思。我给出了补丁中autospec=True/False
时的结果(参见base.py),以及新测试用例test\u account\u creation
取消/注释时的结果。感谢您在这里和提示邮件列表中回复。那是行不通的。但我会接受你的建议,嘲笑具体的事情。我过会儿再打给你。谢谢感谢您回复这里和提示邮件列表。那是行不通的。但我会接受你的建议,嘲笑具体的事情。我过会儿再打给你。谢谢