为什么 py.test 在 Pyunit 和 nosetest 失败时通过单元测试(如预期的那样)?
Why does py.test pass a unittest when Pyunit and nosetest fail it (as expected)?
在编写 python 单元测试方面,我是一个全新的初学者,我知道在编写代码之前编写测试要好得多,也更容易,但我想我应该先为一个github 项目并修复了一些小问题并试一试。
我正在解决的一个问题是,如果没有为方法提供参数,它实际上会删除服务器上的参数。我应该提到这个项目是 REST API 的客户端。这很容易修复,但我认为为它编写一个测试会很好。
损坏方法的代码包含在 class:
def edit_device(self, device, nickname=None, model=None, manufacturer=None):
data = {"nickname": nickname}
iden = device.device_iden
r = self._session.post("{}/{}".format(self.DEVICES_URL, iden), data=json.dumps(data))
然后我打算使用 Mock
模拟 REST API 的响应,使用他们的文档作为指南(它包括示例响应)。
我遇到的问题是我将测试编写为:
@mock.patch('pushbullet.pushbullet.requests.Session.get', side_effect=mocked_requests_get)
@mock.patch('pushbullet.pushbullet.requests.Session.post', side_effect=mocked_requests_post)
class TestPushbullet(object):
def test_edit_device_without_nickname(self, mock_get, mock_post):
pb = pushbullet.Pushbullet("API_KEY")
device = pb.devices[0]
new_device = pb.edit_device(device)
assert new_device.nickname == device.nickname
这似乎工作正常,方法 mocked_requests_get
和 mocked_requests_post
被调用。如果我 运行 在 eclipse PyDev 中使用 pyUnit 对 pytest 运行 进行此测试 - 如我所料,它失败了。如果我 运行 使用 nose 的测试它也失败了,再次完美。如果我 运行 在命令行上使用 py.test 进行测试,它会通过。
如果我使用 pytest.set_trace()
作为 mocked_requests_post
中的第一行,我可以打印 args
并且它表明昵称实际上不是 None 并且仍然设置服务器上的内容(即 device.nickname 所以断言通过)
我想不通为什么 py.test 没有从 self._session.post
中获取 json 中的零钱。如果我更改 URL 格式的 IDEN,它确实会接受该更改,但不会更改数据主体。
我做错了什么吗?我不明白为什么 py.test 会通过而 nose 会在相同的代码上失败。
编辑:在命令行我 运行ning py.test path/to/single_test_file.py
并且测试文件只有我在上面粘贴的单一测试方法。
终于解决了,我一定是在决定编写测试之前将客户端包安装到 python 中。看起来命令行 py.test
是从真正的源代码(通过 pip 安装)读取客户端包,而 IDE 是从我在 eclipse 中的开发包读取它。
解决方法是删除包:pip uninstall <package>
重新安装开发包:pip install -e .
(在根开发目录下)
在编写 python 单元测试方面,我是一个全新的初学者,我知道在编写代码之前编写测试要好得多,也更容易,但我想我应该先为一个github 项目并修复了一些小问题并试一试。
我正在解决的一个问题是,如果没有为方法提供参数,它实际上会删除服务器上的参数。我应该提到这个项目是 REST API 的客户端。这很容易修复,但我认为为它编写一个测试会很好。
损坏方法的代码包含在 class:
def edit_device(self, device, nickname=None, model=None, manufacturer=None):
data = {"nickname": nickname}
iden = device.device_iden
r = self._session.post("{}/{}".format(self.DEVICES_URL, iden), data=json.dumps(data))
然后我打算使用 Mock
模拟 REST API 的响应,使用他们的文档作为指南(它包括示例响应)。
我遇到的问题是我将测试编写为:
@mock.patch('pushbullet.pushbullet.requests.Session.get', side_effect=mocked_requests_get)
@mock.patch('pushbullet.pushbullet.requests.Session.post', side_effect=mocked_requests_post)
class TestPushbullet(object):
def test_edit_device_without_nickname(self, mock_get, mock_post):
pb = pushbullet.Pushbullet("API_KEY")
device = pb.devices[0]
new_device = pb.edit_device(device)
assert new_device.nickname == device.nickname
这似乎工作正常,方法 mocked_requests_get
和 mocked_requests_post
被调用。如果我 运行 在 eclipse PyDev 中使用 pyUnit 对 pytest 运行 进行此测试 - 如我所料,它失败了。如果我 运行 使用 nose 的测试它也失败了,再次完美。如果我 运行 在命令行上使用 py.test 进行测试,它会通过。
如果我使用 pytest.set_trace()
作为 mocked_requests_post
中的第一行,我可以打印 args
并且它表明昵称实际上不是 None 并且仍然设置服务器上的内容(即 device.nickname 所以断言通过)
我想不通为什么 py.test 没有从 self._session.post
中获取 json 中的零钱。如果我更改 URL 格式的 IDEN,它确实会接受该更改,但不会更改数据主体。
我做错了什么吗?我不明白为什么 py.test 会通过而 nose 会在相同的代码上失败。
编辑:在命令行我 运行ning py.test path/to/single_test_file.py
并且测试文件只有我在上面粘贴的单一测试方法。
终于解决了,我一定是在决定编写测试之前将客户端包安装到 python 中。看起来命令行 py.test
是从真正的源代码(通过 pip 安装)读取客户端包,而 IDE 是从我在 eclipse 中的开发包读取它。
解决方法是删除包:pip uninstall <package>
重新安装开发包:pip install -e .
(在根开发目录下)