我是新手使用应用程序来测试后端API.我总是只使用前端应用程序进行手动测试.我想要做的是使用专为后端API测试而设计的应用程序.到目前为止,我已被定向到SoapUI,Postman和Runscope.但我很茫然,因为我更像是一名测试分析师而不是程序员,尽管我在Selenium中使用JavaScript,Python和Ruby进行自动化测试.有什么建议?思考?警告?
(我也把它发布到质量检查页面,很抱歉重复的问题)
自从过去两天以来,我面临一个相当混乱的问题.我正在开发一个文档管理系统,它使用从SOLR中提取数据的API.数据约为15Mbs,并提取超过4000个文档的记录.API有这种格式的响应 -
{
"documents": [
{
id: 123,
some_field: "abcd",
some_other_field: "abcdef"
},
{
id: 124,
some_field: "abcd1",
some_other_field: "abcdef1"
}
]
}
Run Code Online (Sandbox Code Playgroud)
在浏览器中一切正常.如果我在Chrome或Firefox浏览器中点击端点,它会给我正确的输出,我能够看到JSON输出.
但是,如果我尝试使用Java或JS代码访问相同的API端点 - 响应代码为200,但控制台(终端或Eclipse)中\u0089 \u0078 U+0080的输出显示类似的unicode字符- 所有输出都以这种方式出现,并且因为有API提取了大约4000多条记录,控制台有点填充所有这些unicode字符.
我在浏览器和代码之间看到的唯一区别是,在浏览器中我可以看到Content-Encoding : gzip,而我无法从我编写的代码中找到此标头.例如 - 在JS代码中,通过Chakram框架,我可以检查
expect(response).to.be.encoded.with.gzip
这里提到的.但是,这会返回失败说明expected undefined to match gzip
我在这里错过了什么?这是与编码/解码有关的东西还是完全不同的东西?
编辑1:NetworkChrome标签中显示的响应标题:
cache-control: max-age=0, private, must-revalidate, max-age=315360000
content-encoding: gzip
content-type: application/json; charset=utf-8
date: Tue, 22 May 2018 06:07:26 GMT
etag: "a07eb7c1eef4ab97699afc8d61fb9c5d"
expires: Fri, 19 May 2028 06:07:26 GMT
p3p: …Run Code Online (Sandbox Code Playgroud) 我有一些测试用例和测试数据,其中测试数据采用 JSON 数组形式,如下所示:
{
"valid_data": [
{
"id": "1234",
"name": "John"
},
{
"id": "2234",
"name": "Mary"
},
{
"id": "3234",
"name": "Kenny"
},
],
"invalid_data": [
{
"id": "1234",
"name": "Mary"
},
{
"id": "2234",
"name": "Kenny"
},
{
"id": "3234",
"name": "John"
},
]
}
Run Code Online (Sandbox Code Playgroud)
我现在正在测试一个 API,它将接受 JSON 作为输入,并以状态代码进行响应。如果 id 和名称在数据库中匹配,它将响应 200 OK。否则会出现 400 Bad Request。
这是我当前的测试用例:
def get_test_data(filename):
folder_path = os.path.abspath(Path(os.path.dirname(__file__)))
folder = os.path.join(folder_path, 'TestData')
jsonfile = os.path.join(folder, filename)
with open(jsonfile) as file:
data = json.load(file)
return …Run Code Online (Sandbox Code Playgroud) 我正在用Postman测试API,但遇到了一个问题:我的请求转到了某种中间件,因此我收到了完整的1000+行JSON,或者收到PENDING状态和空数组:
{
"meta": {
"status": "PENDING",
"missing_connectors_count": 0,
"xxx_type": "INTERNATIONAL"
},
"results": []
}Run Code Online (Sandbox Code Playgroud)
问题是,如何在邮递员中循环此请求,直到获得状态SUCCESS和结果array > 0?当我手动一个接一个地发送这些请求时,可以,但是当我通过Collection Runner运行它们时,“ PENDING”会弄乱所有内容。
如何使用 Flask test_client 将多个文件上传到一个 API 端点?
我正在尝试使用 Flask test_client 将多个文件上传到一个 Web 服务,该服务接受多个文件并将它们组合成一个大文件。
我的控制器看起来像这样:
@app.route("/combine/file", methods=["POST"])
@flask_login.login_required
def combine_files():
user = flask_login.current_user
combined_file_name = request.form.get("file_name")
# Store file locally
file_infos = []
for file_data in request.files.getlist('file[]'):
# Get the content of the file
file_temp_path="/tmp/{}-request.csv".format(file_id)
file_data.save(file_temp_path)
# Create a namedtuple with information about the file
FileInfo = namedtuple("FileInfo", ["id", "name", "path"])
file_infos.append(
FileInfo(
id=file_id,
name=file_data.filename,
path=file_temp_path
)
)
...
Run Code Online (Sandbox Code Playgroud)
我的测试代码如下所示:
def test_combine_file(get_project_files):
project = get_project_files["project"]
r = web_client.post(
"/combine/file",
content_type='multipart/form-data',
buffered=True,
follow_redirects=True, …Run Code Online (Sandbox Code Playgroud) python flask python-unittest multiple-file-upload web-api-testing
例如,下面是在数据库中“添加设备”的 JSON 请求数据。例如,我想将 10000 个具有不同 IMEI 号码和不同电话号码的设备添加到服务器以进行测试。那么,如何一次发送请求呢?我准备手动创建 10000 个具有不同值的设备数据。现在只能一一发送,但是如何一次性发送所有请求呢?
{ "device_name":"34793812453274392", "imei_num":"36xxxxxxxxxxxx5", "phone_num":"8666606451", "device_city":"钦奈", "device_state":"泰米尔纳德邦", }
由于我是 Jmeter 新手,需要详细信息。提前致谢。
我使用 RestSharp 编写了以下测试,预期结果是返回错误 400 以及一些 Json 格式的错误消息。
但以下测试在等待 client.PostAsync(request) 处失败并抛出“System.Net.Http.HttpRequestException:请求失败,状态代码为 BadRequest”,并且未到达断言语句。
使用 Fiddler 我验证了我的请求,并且响应按预期工作。
将不胜感激任何解决这个问题的建议。谢谢你!
[Test]
public async Task Test1Async()
{
var jsonData = json;
var client = new RestClient(endpoint);
var request = new RestRequest();
request.AddStringBody(jsonData, ContentType.Json);
var response = await client.PostAsync(request);
Assert.AreEqual(400, response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)
有效的解决方案。谢谢尼古拉斯·费尔赫斯特...
[Test]
public async Task Test1Async()
{
var jsonData = json;
var client = new RestClient(endpoint);
var request = new RestRequest();
request.AddStringBody(jsonData, ContentType.Json);
var response = await client.ExecutePostAsync(request);
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud) 我使用Cypress作为 API 和 UI 测试的自动化框架。我已经编写了多个正在运行并通过的 API 测试,但它们只是验证返回response.status的200. 我想将来自 a 的响应 jsonGET与存储的“预期”响应进行比较,以确认 JSON 响应数据是正确的。
我在我的代码块中尝试了to.deep.equal和的不同变体。但我不想验证只有一个字段返回正确的值,我想验证一堆不同的字段是否返回正确的值。我的请求返回超过 100 行嵌套的 JSON 字段/值,而我只想验证彼此嵌套的 20 个左右的字段/值。deepEquals.then(response => {}GET
cy.request({
method: 'GET',
log: true,
url: 'https://dev.api.random.com/calculators/run-calculate/524/ABC',
headers: {
'content-type': 'application/json',
'x-api-key': calcXApiKey
},
body: {}
}).then(response => {
const respGet = response.body
const tPrice = response.body.data.calculations.t_costs[0].comparison.t_price
cy.log(respGet, tPrice)
assert.deepEqual({
tPrice
}, {
t_price: '359701'
})
// assert.equal(response.status, 200) -- This works great
})
Run Code Online (Sandbox Code Playgroud)
错误= …
我已参数化我的装置来调用 API,每次调用时使用不同的输入数据来发送请求,范围为class. 因为我需要检查 API 响应与发送的数据。我需要将灯具的请求参数读取到测试中。
class Test_create_fixture():
@pytest.fixture(scope="class", params=[0, 1])
def my_fixture(self, request):
"Call incident creation api."
# POST request to API using params value in request data, get data from API
my_data = {'abc': 123, 'severity': 0} # this data is from API
self.data = {'severity': request.param}
return my_data
def test_incident_severity(self, my_fixture, request):
print("self.data", self.data) # 'Test_create_fixture' object has no attribute 'data'
assert my_fixture.get('severity', False) == request.param # AttributeError: 'FixtureRequest' object has no attribute 'param'
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个时,我无法将传递给固定装置的请求参数读取到测试中。还尝试保存在实例变量中,但没有成功。我观察到固定装置中和测试中id() …
Marionette是一种用于远程控制 Mozilla 浏览器的协议。Chromium 有用于相同目的的DevTools协议,并在此处进行了记录。
Marionette这里有一些粗略的文档,但是有可用命令和参数的正确列表吗?可以以某种方式从 Mozilla 源中提取它吗?(就像 Chromium 有PDL一样。)
[0,1,"WebDriver:Navigate",{"url":"http://awe.lv"}]}]
我所说的命令是指“WebDriver:GetTitle”、[0,2,"WebDriver:ExecuteAsyncScript",{"script":"alert('Hello!')"}]
“WebDriver:GetWindowHandle”、“WebDriver:GetWindowRect”、“WebDriver:TakeScreenshot”和“WebDriver:GetPageSource”之类的命令。特别是,我想像使用 DevTools 的方法一样观察网络流量Network.enable。
是否还有其他可用前缀(“WebDriver:”除外)?我们可以通过 Marionette使用Web API吗?