- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是在 python 中使用 pytest 的初学者,并尝试为以下方法编写测试用例,该方法在传递正确的 Id 时获取用户地址,否则会出现自定义错误 BadId。
def get_user_info(id: str, host='127.0.0.1', port=3000 ) -> str:
uri = 'http://{}:{}/users/{}'.format(host,port,id)
result = Requests.get(uri).json()
address = result.get('user',{}).get('address',None)
if address:
return address
else:
raise BadId
有人可以帮我解决这个问题吗?您可以建议我学习 pytest 的最佳资源是什么吗? TIA
最佳答案
您的测试方案可能看起来像这样。
首先,我建议创建一个用于各种方法测试的 fixture 。该装置设置要在测试中使用的类的实例,而不是在测试本身中创建实例。以这种方式分隔任务有助于使您的测试更加健壮且更易于阅读。
from my_package import MyClass
import pytest
@pytest.fixture
def a_test_object():
return MyClass()
您可以将测试对象传递给您的一系列方法测试:
def test_something(a_test_object):
# do the test
但是,如果您的测试对象在设置过程中需要一些资源(例如连接、数据库、文件等),您可以模拟它以避免为测试设置资源。请参阅 this talk 以获取有关如何执行此操作的一些有用信息。
顺便说一句:如果您需要测试在您的装置中创建的用户定义对象的几种不同状态,您需要对您的装置进行参数化。这是一个有点复杂的主题,但是文档 explains fixture parametrization very clearly 。
您需要做的另一件事是确保拦截对 Requests
的任何 .get
调用。这很重要,因为它允许您的测试在没有互联网连接的情况下运行,并确保它们不会因连接不良而失败,而这不是您要测试的事情。
您可以使用pytest
的monkeypatch feature来拦截Requests.get
。所需要做的就是将 monkeypatch
作为测试方案函数的输入参数包含在内。
您可以使用另一个固定装置来完成此操作。它可能看起来像这样:
import Requests
import pytest
@pytest.fixture
def patched_requests(monkeypatch):
# store a reference to the old get method
old_get = Requests.get
def mocked_get(uri, *args, **kwargs):
'''A method replacing Requests.get
Returns either a mocked response object (with json method)
or the default response object if the uri doesn't match
one of those that have been supplied.
'''
_, id = uri.split('/users/', 1)
try:
# attempt to get the correct mocked json method
json = dict(
with_address1 = lambda: {'user': {'address': 123}},
with_address2 = lambda: {'user': {'address': 456}},
no_address = lambda: {'user': {}},
no_user = lambda: {},
)[id]
except KeyError:
# fall back to default behavior
obj = old_get(uri, *args, **kwargs)
else:
# create a mocked requests object
mock = type('MockedReq', (), {})()
# assign mocked json to requests.json
mock.json = json
# assign obj to mock
obj = mock
return obj
# finally, patch Requests.get with patched version
monkeypatch.setattr(Requests, 'get', mocked_get)
这看起来很复杂,直到你明白发生了什么:我们只是用预先确定的用户 ID 和地址制作了一些模拟的 json 对象(由字典表示)。 Requests.get
的修补版本仅返回一个 MockedReq
类型的对象,当其 id 为已请求。
请注意,Requests
只会在实际使用上述固定装置的测试中进行修补,例如:
def test_something(patched_requests):
# use patched Requests.get
任何不使用 patched_requests
作为输入参数的测试都不会使用修补版本。
另请注意,您可以在测试本身中对 Requests
进行 Monkeypatch,但我建议单独进行。如果您正在使用请求 API 的其他部分,您可能还需要对它们进行猴子补丁。将所有这些内容分开通常比将其包含在测试中更容易理解。
接下来编写各种方法测试。您需要对方法的每个方面进行不同的测试。换句话说,您通常会为方法成功的实例编写一个不同的测试,并在方法失败时编写另一个测试。
首先,我们通过几个测试用例测试方法是否成功。
@pytest.mark.parametrize('id, result', [
('with_address1', 123),
('with_address2', 456),
])
def test_get_user_info_success(patched_requests, a_test_object, id, result):
address = a_test_object.get_user_info(id)
assert address == result
接下来,我们可以使用 with pytest.raises
功能来测试是否引发 BadId
异常。请注意,由于引发了异常,因此测试函数没有 result
输入参数。
@pytest.mark.parametrize('id', [
'no_address',
'no_user',
])
def test_get_user_info_failure(patched_requests, a_test_object, id):
from my_package import BadId
with pytest.raises(BadId):
address = a_test_object.get_user_info(id)
正如我在评论中所发布的,这里还有一些其他资源可以帮助您了解有关 pytest 的更多信息:
另外请务必查看 Brian Okken's book 和 Bruno Oliveira's book 。它们对于学习 pytest 都非常有帮助。
关于python pytest 用于测试请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45910480/
我获得了一些源代码示例,我想测试一些功能。不幸的是,我在执行程序时遇到问题: 11:41:31 [linqus@ottsrvafq1 example]$ javac -g test/test.jav
我想测试ggplot生成的两个图是否相同。一种选择是在绘图对象上使用all.equal,但我宁愿进行更艰巨的测试以确保它们相同,这似乎是identical()为我提供的东西。 但是,当我测试使用相同d
我确实使用 JUnit5 执行我的 Maven 测试,其中所有测试类都有 @ExtendWith({ProcessExtension.class}) 注释。如果是这种情况,此扩展必须根据特殊逻辑使测试
在开始使用 Node.js 开发有用的东西之前,您的流程是什么?您是否在 VowJS、Expresso 上创建测试?你使用 Selenium 测试吗?什么时候? 我有兴趣获得一个很好的工作流程来开发我
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 基于示例here ,我尝试为我的
我正在考虑测试一些 Vue.js 组件,作为 Laravel 应用程序的一部分。所以,我有一个在 Blade 模板中使用并生成 GET 的组件。在 mounted 期间请求生命周期钩子(Hook)。假
考虑以下程序: #include struct Test { int a; }; int main() { Test t=Test(); std::cout<
我目前的立场是:如果我使用 web 测试(在我的例子中可能是通过 VS.NET'08 测试工具和 WatiN)以及代码覆盖率和广泛的数据来彻底测试我的 ASP.NET 应用程序,我应该不需要编写单独的
我正在使用 C#、.NET 4.7 我有 3 个字符串,即。 [test.1, test.10, test.2] 我需要对它们进行排序以获得: test.1 test.2 test.10 我可能会得到
我有一个 ID 为“rv_list”的 RecyclerView。单击任何 RecyclerView 项目时,每个项目内都有一个可见的 id 为“star”的 View 。 我想用 expresso
我正在使用 Jest 和模拟器测试 Firebase 函数,尽管这些测试可能来自竞争条件。所谓 flakey,我的意思是有时它们会通过,有时不会,即使在同一台机器上也是如此。 测试和函数是用 Type
我在测试我与 typeahead.js ( https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/typeahead.js
我正在尝试使用 Teamcity 自动运行测试,但似乎当代理编译项目时,它没有正确完成,因为当我运行运行测试之类的命令时,我收到以下错误: fatal error: 'Pushwoosh/PushNo
这是我第一次玩 cucumber ,还创建了一个测试和 API 的套件。我的问题是在测试 API 时是否需要运行它? 例如我脑子里有这个, 启动 express 服务器作为后台任务 然后当它启动时(我
我有我的主要应用程序项目,然后是我的测试的第二个项目。将所有类型的测试存储在该测试项目中是一种好的做法,还是应该将一些测试驻留在主应用程序项目中? 我应该在我的主项目中保留 POJO JUnit(测试
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我正在尝试测试一些涉及 OkHttp3 的下载代码,但不幸失败了。目标:测试 下载图像文件并验证其是否有效。平台:安卓。此代码可在生产环境中运行,但测试代码没有任何意义。 产品代码 class Fil
当我想为 iOS 运行 UI 测试时,我收到以下消息: SetUp : System.Exception : Unable to determine simulator version for X 堆
我正在使用 Firebase Remote Config 在 iOS 上设置 A/B 测试。 一切都已设置完毕,我正在 iOS 应用程序中读取服务器端默认值。 但是在多个模拟器上尝试,它们都读取了默认
[已编辑]:我已经用 promise 方式更改了我的代码。 我正在写 React with this starter 由 facebook 创建,我是测试方面的新手。 现在我有一个关于图像的组件,它有
我是一名优秀的程序员,十分优秀!