我正在编写使用Tornado库的代码的py.test测试。如何在涉及协程和 IOLoop 的测试中使用Hypothesis ?通过使用pytest-tornado ,我已经能够在没有 Hypothesis 的情况下编写基于产量的测试,但是当我尝试将它与 结合时,我收到以下错误:@pytest.mark.gen_test
@given
FailedHealthCheck:在下运行的测试
@given
应该返回None
,而是test_both
返回<generator object test_both at 0x7fc4464525f0>
。有关这方面的更多信息,请参阅http://hypothesis.readthedocs.org/en/latest/healthchecks.html。如果您只想禁用此运行状况检查,请添加到此测试
HealthCheck.return_value
的设置中。suppress_health_check
考虑到假设文档说,我非常有信心这是一个真正的问题,而不仅仅是禁用健康检查的问题
基于产量的测试根本行不通。
这是演示我的情况的代码:
class MyHandler(RequestHandler):
@gen.coroutine
def get(self, x):
yield gen.moment
self.write(str(int(x) + 1))
self.finish()
@pytest.fixture
def app():
return Application([(r'/([0-9]+)', MyHandler)])
@given(x=strategies.integers(min_value=0))
def test_hypothesis(x):
assert int(str(x)) == x
@pytest.mark.gen_test
def test_tornado(app, http_client, base_url):
x = 123
response = yield http_client.fetch('%s/%i' % (base_url, x))
assert int(response.body) == x + 1
@pytest.mark.gen_test
@given(x=strategies.integers(min_value=0))
def test_both(x, app, http_client, base_url):
response = yield http_client.fetch('%s/%i' % (base_url, x))
assert int(response.body) == x + 1
test_hypothesis
并且test_tornado
工作正常,但我得到了错误,test_both
因为我yield
一起使用和假设。
改变装饰器的顺序并没有改变任何东西,可能是因为gen_test
装饰器只是一个属性标记。
我可以使用 Hypothesis 编写基于 Tornado 的代码的测试吗?如何?