GithubHelp home page GithubHelp logo

httprunner / httprunner Goto Github PK

View Code? Open in Web Editor NEW
4.0K 150.0 1.3K 36.26 MB

HttpRunner 是一个开源的 API/UI 测试工具,简单易用,功能强大,具有丰富的插件化机制和高度的可扩展能力。

Home Page: https://httprunner.com/httprunner/

License: Apache License 2.0

Python 17.37% Makefile 0.06% Go 81.12% HTML 0.80% Shell 0.61% Dockerfile 0.05%
locust httptest load-testing pytest requests boomer performance-testing benchmarking api-testing jmeter

httprunner's Introduction

HttpRunner

Github Actions codecov Go Reference downloads pypi version pyversions TesterHome

HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型。简单易用,功能强大,具有丰富的插件化机制和高度的可扩展能力。

HttpRunner 用户调研问卷 持续收集中,我们将基于用户反馈动态调整产品特性和需求优先级。

flow chart

版本发布日志 | English

设计理念

相比于其它 API 测试工具,HttpRunner 最大的不同在于设计理念。

  • 约定大于配置:测试用例是标准结构化的,格式统一,方便协作和维护
  • 标准开放:基于开放的标准,支持与 HAR/Postman/Swagger/Curl/JMeter 等工具对接,轻松实现用例生成和转换
  • 一次投入多维复用:一套脚本可同时支持接口自动化测试、性能测试、数字体验监测等多种 API 测试需求
  • 融入最佳工程实践:不仅仅是一款测试工具,在功能中融入最佳工程实践,实现面向网络协议的一站式测试解决方案

核心特性

  • 网络协议:完整支持 HTTP(S)/HTTP2/WebSocket,可扩展支持 TCP/UDP/RPC 等更多协议
  • 多格式可选:测试用例支持 YAML/JSON/go test/pytest 格式,并且支持格式互相转换
  • 双执行引擎:同时支持 golang/python 两个执行引擎,兼具 go 的高性能和 pytest 的丰富生态
  • 录制 & 生成:可使用 HAR/Postman/Swagger/curl 等生成测试用例;基于链式调用的方法提示也可快速编写测试用例
  • 复杂场景:基于 variables/extract/validate/hooks 机制可以方便地创建任意复杂的测试场景
  • 插件化机制:内置丰富的函数库,同时可以基于主流编程语言(go/python/java)编写自定义函数轻松实现更多能力
  • 性能测试:无需额外工作即可实现压力测试;单机可轻松支撑 1w+ VUM,结合分布式负载能力可实现海量发压
  • 网络性能采集:在场景化接口测试的基础上,可额外采集网络链路性能指标(DNS 解析、TCP 连接、SSL 握手、网络传输等)
  • 一键部署:采用二进制命令行工具分发,无需环境依赖,一条命令即可在 macOS/Linux/Windows 快速完成安装部署

用户声音

基于 252 份调研问卷的统计结果,HttpRunner 用户的整体满意度评分 4.3/5,最喜欢的特性包括:

  • 简单易用:测试用例支持 YAML/JSON 标准化格式,可通过录制的方式快速生成用例,上手简单,使用方便
  • 功能强大:支持灵活的自定义函数和 hook 机制,参数变量、数据驱动、结果断言等机制一应俱全,轻松适应各种复杂场景
  • 设计理念:测试用例组织支持分层设计,格式统一,易于实现测试用例的维护和复用

更多内容详见 HttpRunner 首轮用户调研报告(2022.02)

一键部署

HttpRunner 二进制命令行工具已上传至阿里云 OSS,在系统终端中执行如下命令可完成安装部署。

$ bash -c "$(curl -ksSL https://httprunner.com/script/install.sh)"

安装成功后,你将获得一个 hrp 命令行工具,执行 hrp -h 即可查看到参数帮助说明。

$ hrp -h

██╗  ██╗████████╗████████╗██████╗ ██████╗ ██╗   ██╗███╗   ██╗███╗   ██╗███████╗██████╗
██║  ██║╚══██╔══╝╚══██╔══╝██╔══██╗██╔══██╗██║   ██║████╗  ██║████╗  ██║██╔════╝██╔══██╗
███████║   ██║      ██║   ██████╔╝██████╔╝██║   ██║██╔██╗ ██║██╔██╗ ██║█████╗  ██████╔╝
██╔══██║   ██║      ██║   ██╔═══╝ ██╔══██╗██║   ██║██║╚██╗██║██║╚██╗██║██╔══╝  ██╔══██╗
██║  ██║   ██║      ██║   ██║     ██║  ██║╚██████╔╝██║ ╚████║██║ ╚████║███████╗██║  ██║
╚═╝  ╚═╝   ╚═╝      ╚═╝   ╚═╝     ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═══╝╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝

HttpRunner is an open source API testing tool that supports HTTP(S)/HTTP2/WebSocket/RPC
network protocols, covering API testing, performance testing and digital experience
monitoring (DEM) test types. Enjoy! ✨ 🚀 ✨

License: Apache-2.0
Website: https://httprunner.com
Github: https://github.com/httprunner/httprunner
Copyright 2017 debugtalk

Usage:
  hrp [command]

Available Commands:
  adb          simple utils for android device management
  boom         run load test with boomer
  build        build plugin for testing
  completion   Generate the autocompletion script for the specified shell
  convert      convert multiple source format to HttpRunner JSON/YAML/gotest/pytest cases
  help         Help about any command
  ios          simple utils for ios device management
  pytest       run API test with pytest
  run          run API test with go engine
  startproject create a scaffold project
  wiki         visit https://httprunner.com

Flags:
  -h, --help               help for hrp
      --log-json           set log to json format
  -l, --log-level string   set log level (default "INFO")
      --venv string        specify python3 venv path
  -v, --version            version for hrp

Use "hrp [command] --help" for more information about a command.

用户案例

赞助商

霍格沃兹测试开发学社

霍格沃兹测试开发学社是中国软件测试开发高端教育品牌,产品由国内顶尖软件测试开发技术专家携手打造,为企业与个人提供专业的技能培训与咨询、测试工具与测试平台、测试外包与测试众包服务。领域涵盖 App/Web 自动化测试、接口自动化测试、性能测试、安全测试、持续交付/DevOps、测试左移、测试右移、精准测试、测试平台开发、测试管理等方向。-> 联系我们

Subscribe

关注 HttpRunner 的微信公众号,第一时间获得最新资讯。

HttpRunner

httprunner's People

Contributors

abeelan avatar anderchang avatar arthursmoke avatar bb-idea avatar bbx-winner avatar billduan avatar chenhuahuan avatar debugtalk avatar dependabot[bot] avatar diaojunxian avatar firefoxwang avatar hluguoj avatar lihuacai168 avatar lingxiaozu avatar mcwt avatar orzcncn avatar pluckhuang avatar readyou avatar rockfeng0 avatar sirfengyu avatar taojian-byte avatar test-instructor avatar wandyying avatar xucong053 avatar yangfannet avatar yu929 avatar ywanbing avatar zdyxry avatar zhouyixun avatar zlinghuvip123 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

httprunner's Issues

当接口没有返回值的时候,框架会抛出异常。

有这样一个使用场景
1.接口为请求数据的接口
2.接口没有返回任何数据,也就是消息体为空

这种情况下,框架会抛出一个异常

======================================================================
ERROR [0.032409s]: Get zqDataContrast Data
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/finup/gitlab/ApiTestEngine/ate/task.py", line 17, in runTest
    self.assertTrue(self.test_runner.run_test(self.testcase))
  File "/Users/finup/gitlab/ApiTestEngine/ate/runner.py", line 103, in run_test
    resp_obj.validate(validators, self.context.get_testcase_variables_mapping())
  File "/Users/finup/gitlab/ApiTestEngine/ate/response.py", line 115, in validate
    validator_dict["actual_value"] = self.extract_field(check_item)
  File "/Users/finup/gitlab/ApiTestEngine/ate/response.py", line 48, in extract_field
    return utils.query_json(json_content, sub_query)
  File "/Users/finup/gitlab/ApiTestEngine/ate/utils.py", line 151, in query_json
    print(json_content[key])
TypeError: string indices must be integers

我仔细看了一下源码,应该是这段

try:
    for key in stripped_query.split(delimiter):
        if isinstance(json_content, list):
            key = int(key)
        json_content = json_content[key]
except (KeyError, ValueError, IndexError):
    raise exception.ParseResponseError("failed to query json when extracting response!")#
return json_content
但是还没搞明白为什么会有这种异常?

context的调用是为了做什么?

我有点不明白context里面的类是做什么的,能简单介绍一下吗?还有我能直接复用你的部分代码,到我们项目中吗?

convention over configuration: import_module_functions

Nowadays in YAML/JSON testcases, we use import_module_functions to specify dependent Python modules. This may be flexible, while it may also lead to complexity for users.

Perhaps a better way is to follow the principle of convention over configuration, in which we use local per-directory plugins as we do in py.test.

Here is a refactor plan:

  • remove import_module_functions mechanism.
  • use debugtalk.py local per-directory plugins.

不支持https 吗

跑https 提示exception msg: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')

几个想法

  1. 可以定义某个yml里的Case为Seup和Teardown,这样这个yml的Case不必在report里展示,但是可以作为全局Setup,类似login/logout。这个不同于每个Case里的setup/teardown。可以参考Nunit框架

  2. 可以定义yml的extract_binds里某个参数为global的,这样,这个返回可以在此次测试的teardown之前都有效,这样就可以跨Case传递返回参数了

  3. 把默认模块名修改的参数开放出来吧,debugtalk可以方便的修改为其他名字,再开放一个report存放路径及名称的参数

恩恩,这样就比较完美了

functions can not be invoked in url.

variables_binds = {
    "uid": "1000",
    "data": {"name": "user", "password": "123456"},
}
functions_binds = {
    "get_timestamp": lambda: int(time.time() * 1000)
}

testcase_template = {
    "url": "http://127.0.0.1:5000/api/users/$uid?_t=${get_timestamp}",
    "method": "POST",
    "headers": {
        "Content-Type": "application/json",
    },
    "body": "$data"
}

parsed_testcase = testcase.parse_content_with_bindings(
    testcase_template, variables_binds, functions_binds)
parsed_testcase = {
    "url": "http://127.0.0.1:5000/api/users/1000?_t=${get_timestamp}",
    "method": "POST",
    "headers": {
        "Content-Type": "application/json"
    },
    "body": {
        "name": "user",
        "password": "123456"
    }
}

Problem description: functions in request url can not be parsed.

[Question]如何获取到requests请求到的登录info?

有这样一个使用场景
1.api会先登录拿到登录信息
2.之后的接口都基于这次的登录信息去请求数据

这个在用例里面应该怎么写?我看了文档后试着写了一下,大概是这个样子
- config:
    name: "Init Testcase."
    request:
        base_url: http://x x:8091

- test:
    name: get token
    request:
        url: /dologin.cl
        method: POST
        headers:
            User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/52.0.2743.116 Safari/537.36
            Content-Type: application/x-www-form-urlencoded
            X-Requested-With: XMLHttpRequest
            Accept: application/json
            Accept-Language: zh-CN,zh;q=0.8
            Accept-Encoding': gzip, deflate
        json:
            userName: xx
            passWord: x x
            sid: x x
    extract_binds:
        - token: content.token
    validators:
        - {"check": "status_code", "comparator": "eq", "expected": 200}

- test:
    name: Jump homepage when data is current
    request:
        url: /zc/realtime1.cl
        method: POST
        headers:
            token: $token
        json:
            edate: 2017-03-08
    validators:
        - {"check": "status_code", "comparator": "eq", "expected": 200}
        - {"check": "content.success", "comparator": "eq", "expected": true}

但是会报错,错误如下:

ERROR [0.086067s]: get token
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/finup/gitlab/ApiTestEngine/ate/task.py", line 17, in runTest
    self.assertTrue(self.test_runner.run_test(self.testcase))
  File "/Users/finup/gitlab/ApiTestEngine/ate/runner.py", line 100, in run_test
    extracted_variables_mapping_list = resp_obj.extract_response(extract_binds)
  File "/Users/finup/gitlab/ApiTestEngine/ate/response.py", line 73, in extract_response
    {key: self.extract_field(field)}
  File "/Users/finup/gitlab/ApiTestEngine/ate/response.py", line 46, in extract_field
    return utils.query_json(json_content, sub_query)
  File "/Users/finup/gitlab/ApiTestEngine/ate/utils.py", line 153, in query_json
    raise exception.ParseResponseError("failed to query json when extracting response!")
ParseResponseError: failed to query json when extracting response!

======================================================================
ERROR [0.000823s]: Jump homepage when data is current
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/finup/gitlab/ApiTestEngine/ate/task.py", line 17, in runTest
    self.assertTrue(self.test_runner.run_test(self.testcase))
  File "/Users/finup/gitlab/ApiTestEngine/ate/runner.py", line 84, in run_test
    parsed_request = self.context.get_parsed_request()
  File "/Users/finup/gitlab/ApiTestEngine/ate/context.py", line 136, in get_parsed_request
    self.testcase_functions_config
  File "/Users/finup/gitlab/ApiTestEngine/ate/testcase.py", line 170, in parse_content_with_bindings
    value, variables_binds, functions_binds)
  File "/Users/finup/gitlab/ApiTestEngine/ate/testcase.py", line 170, in parse_content_with_bindings
    value, variables_binds, functions_binds)
  File "/Users/finup/gitlab/ApiTestEngine/ate/testcase.py", line 197, in parse_content_with_bindings
    parsed_data = parse_variables(content, variables_binds)
  File "/Users/finup/gitlab/ApiTestEngine/ate/testcase.py", line 42, in parse_variables
    "%s is not defined in bind variables!" % variable_name)
ParamsError: token is not defined in bind variables!`
不知道这种情况该如何获取用例中的结果,例如登录的session,我知道requessrs中获取登录cookie只需要使用Session方法就可以,这个就不知道了,能帮我解答一下吗?

locusts命令传入host参数无效

使用场景
1.并发总数300
2.每秒并发30

这种情况下,框架会抛出一个异常

[2017-08-29 11:13:55,555] yileyedeMacBook-Pro.local/ERROR/stderr: Traceback (most recent call last):
  File "/Users/finup/gitlab/ApiTestEngine/env/src/locustio/locust/core.py", line 267, in run
    self.execute_next_task()
  File "/Users/finup/gitlab/ApiTestEngine/env/src/locustio/locust/core.py", line 293, in execute_next_task
    self.execute_task(task["callable"], *task["args"], **task["kwargs"])
  File "/Users/finup/gitlab/ApiTestEngine/env/src/locustio/locust/core.py", line 305, in execute_task
    task(self, *args, **kwargs)
  File "/Users/finup/gitlab/ApiTestEngine/locustfile.py", line 15, in test_specified_scenario
    self.test_runner.run_testset(self.testset)
  File "/Users/finup/gitlab/ApiTestEngine/ate/runner.py", line 142, in run_testset
    result = self.run_test(testcase)
  File "/Users/finup/gitlab/ApiTestEngine/ate/runner.py", line 97, in run_test
    resp = self.http_client_session.request(url=url, method=method, **parsed_request)
  File "/Users/finup/gitlab/ApiTestEngine/env/src/locustio/locust/clients.py", line 113, in request
    response = self._send_request_safe_mode(method, url, **kwargs)
  File "/Users/finup/gitlab/ApiTestEngine/env/src/locustio/locust/clients.py", line 157, in _send_request_safe_mode
    return requests.Session.request(self, method, url, **kwargs)
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/urllib3/connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/urllib3/connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/urllib3/connection.py", line 314, in connect
    cert_reqs=resolve_cert_reqs(self.cert_reqs),
  File "/Users/finup/gitlab/ApiTestEngine/env/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 269, in create_urllib3_context
    context.options |= options
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 314 more times]
RecursionError: maximum recursion depth exceeded
单独使用locust框架没还没遇到这个问题,我还在看源码追查问题出在什么地方,稍后如果发现在comment上来

content-type

post只支持application/json吗?可以支持application/x-www-form-urlencoded的编码方式吗?

若对YAML格式不熟悉,推荐使用JSON格式编写维护测试用例

你好,
我使用python脚本调用ate部分,执行后报keyerror:
服务端返回值应该是如下:

{
  "statusString": "MUSS Request Successful",
  "id": "3ffd3ab1-6781-4fdd-808a-03fa48e7d5ec||f00c8366-fb7e-401f-9a33-8c7280f12044:f00c8366-fb7e-401f-9a33-8c7280f12044",
  "extension": [
    {
      "streamURL": "rtsp://159.99.251.223:554/5e551f88-d852-4106-9f57-d3377227d545_1_1.sdp||rtmps://159.99.251.223:790/live/5e551f88-d852-4106-9f57-d3377227d545_1_1_28b0efd8-4a6c-40f5-9dcf-f4c67146adaf",
      "name": "isomStreamResponseStatus"
    }
  ]
}

脚本报错:

Traceback (most recent call last):
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\utils.py", line 125, in query_json
    json_content = json_content[key]
KeyError: 'extension'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Projects\PythonProject\APITest.py", line 8, in <module>
    APITest.run(testcase_path)
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\runner.py", line 198, in run
    result = self._run_testset(testset, mapping)
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\runner.py", line 171, in _run_testset
    assert self._run_test(testcase)
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\runner.py", line 118, in _run_test
    extracted_variables_mapping = resp_obj.extract_response(extract_binds)
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\response.py", line 77, in extract_response
    extracted_variables_mapping[key] = self.extract_field(field)
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\response.py", line 51, in extract_field
    return utils.query_json(json_content, sub_query)
  File "C:\Users\e567802\AppData\Local\Programs\Python\Python36\lib\site-packages\ate\utils.py", line 130, in query_json
    raise exception.ParseResponseError("failed to query json when extracting response!")
ate.exception.ParseResponseError: failed to query json when extracting response!

我脚本中的调用:

from ate.runner import Runner
from ate import utils

if __name__ == '__main__' :
    #utils.SECRET_KEY='BaseTest'
    testcase_path='Test_Cases/Stream/'
    APITest=Runner()
    APITest.run(testcase_path)

请问是什么问题呢?

另外,询问下,我想改默认的debugtalk.py为BaseTest.py应该怎么设置?

谢谢。

对系统、版本啥的有要求吗? 单独运行 test_apiserver.py, multiprocessing启动服务器的时候报错

Failure
Traceback (most recent call last):
File "D:\Program Files (x86)\Python36-32\lib\unittest\suite.py", line 163, in _handleClassSetUp
setUpClass()
File "D:\autotest\python\ApiTestEngine\test\base.py", line 21, in setUpClass
cls.api_server_process.start()
File "D:\Program Files (x86)\Python36-32\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "D:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "D:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "D:\Program Files (x86)\Python36-32\lib\multiprocessing\popen_spawn_win32.py", line 65, in init
reduction.dump(process_obj, to_child)
File "D:\Program Files (x86)\Python36-32\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle _thread.lock objects

ModuleNotFoundError: No module named 'pyunitreport'

    from httprunner.cli import main_ate
  File "/usr/local/lib/python3.6/site-packages/httprunner/cli.py", line 7, in <module>
    from pyunitreport import __version__ as pyu_version
ModuleNotFoundError: No module named 'pyunitreport'

能给一个可以运行的例子吗

我down了代码,但是还没有理清大概的层级关系,不知道怎么测试代码和yml文件是什么关系,希望能给出一个可以运行的实例供使用者参考

testset

请教一下,ApiTestEngine可以用于把一个testcase的返回结果作为另一个testcase的requests吗

如何在测试用例中,编写类似 setup 和 teardown 的实现

场景描述:

编写测试用例时,有时需要一些如下操作:

  • 测试前,先对测试数据进行一些检验
  • 测试后,需要对测试过程中创建的一些内容进行销毁

问题:

当前在测试用例的模板中没有看到类似此类型的用例示例,如果需要实现,该如何编写用例?

Package requirement ‘PyUnitReport’ is not satisfied

你好,工程clone到本地后,Pycharm中双击打开任何一个.py文件,顶部都提示Package requirement ‘PyUnitReport’ is not satisfied,然后点击Install requirement,安装成功后,依然提示,请大神帮忙看下,感谢

判断的endswith有问题

测试日志:

Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\ate\task.py", line 17, in runTest
    self.assertTrue(self.test_runner.run_test(self.testcase))
  File "C:\Python36\lib\site-packages\ate\runner.py", line 103, in run_test
    resp_obj.validate(validators, self.context.get_testcase_variables_mapping())
  File "C:\Python36\lib\site-packages\ate\response.py", line 121, in validate
    check_item
  File "C:\Python36\lib\site-packages\ate\utils.py", line 220, in match_expected
    raise exception.ValidationError(err_msg)
ate.exception.ValidationError: check item name: content.data.content.0.name;
check item value: admin (str);
comparator: endswith;
expected value: n (str).

源码:

    elif comparator in ["endswith"]:
        assert str(expected).startswith(str(value))
    else:
        raise exception.ParamsError("comparator not supported!")

接口响应的结果检查

一个建议:目前的检查结果的方式只有check一种,是否可以新增通过函数对结果进行检查,通过函数返回的结果(True,False,Error等)标记结果?

复杂用例的组织和数据规则的维护

1、业务场景中有这样的情况:有多个接口在涉及逻辑验证的时候会调用顺序不同。(例如我需要A-B-C-D、A-C-B-D、A-D-B-C等等多种顺序执行接口)如何组织这些接口才能减少代码的冗余和后续维护的成本呢?
2、由于业务中接口传入的数据很多,并不想在数据的维护上下大功夫,因为input一旦变动,我的expect也需要人工去检查和维护,所有现在的想法时想要维护的不是数据的本身,而是数据的一个规则,例如有一个test的字段,只要维护他在输入规范:5-10位的数字。那么我的测试数据时可以任意生成的,在数据符合规范的时候,那么我的期待值就是true或者时继续执行下一个接口,如果不符合规范的时候就会false,断言终短。想问一下,现在httprunner是否提供了这样的解决办法?
关于第二点,因为现在是支持变量传参的,那么我的期待值是否可以动态的通过方法去获取呢?如果可以的话,那么我调用一个校验参数的方法去动态的生成我的预期结果是否可行?当然这边还有点疑虑是规范的维护会不会需要大量的代码实现,能否简单的配置生成,在这方面想问下有什么好的建议和解决办法。

测试执行结果将Fail和Error的结果进行区分

在执行的测试之后的结果中,只有成功和错误两种结果,没有失败这种结果。check的结果不一致的时候,直接就抛出异常,然后在报告中显示为Error了。是否能够将Fail和Error的结果区分开?

validate中,expected字段支持变量引用

接口response内,会返回数据库内的自增ID。ID校验的时候,希望expected为参数化的值。

validate:
    - {"check": "content.data.table_list.0.id", "expected": $id}

运行用例提示错误result.tb_locals = self.tb_locals

安装成功后,运行任何用例都是提示如下错误:
Michael@MichaeldeMacBook-Pro:~/Downloads/ApiTestEngine-0.2.2$ ate test.yml
Traceback (most recent call last):
File "/usr/local/bin/ate", line 9, in
load_entry_point('ApiTestEngine==0.2.2', 'console_scripts', 'ate')()
File "build/bdist.macosx-10.11-x86_64/egg/ate/cli.py", line 53, in main
File "/Users/Michael/Downloads/ApiTestEngine-master/src/pyunitreport/PyUnitReport/runner.py", line 42, in run
result.tb_locals = self.tb_locals
AttributeError: 'HTMLTestRunner' object has no attribute 'tb_locals'

在接口的响应结果确认中,是否也支持变量值的引用

测试 case 示例

- test:
    name: 'test'
    request:
        url: /test
        method: POST
        json:
            device: $device
            version: $version
            testid: $testid
    validators:
        - {'check':'content.checkid', 'comparator':'eq', 'expected':$checkid}

其中$checkid 是之前绑定的变量或者其他接口响应内容提取绑定的变量的引用

问题

这样的写法似乎测试用例无法执行通过,当前是否支持这样在确认结果中对变量的引用?

如果支持,想请问一下写法。。。。

如何实现上传文件或图片?

请教下,如果要以多文件上传图片,在yaml的格式是怎样的?
例如:图片路径为/home/work/favimg.jpg, file-tuple为2-tuple,(‘filename’,fileobj)

【演示脚本test_apiserver.py运行错误】TypeError: can't pickle thread.lock objects

【运行环境】:
系统:win7
编辑器:pycharm2017
软件环境:python2.7.13

【运行步骤】
在pycharm里运行test_apiserver.py脚本 执行单元测试 报进程错误
TypeError: can't pickle thread.lock objects

【错误回溯】
Failure
Traceback (most recent call last):
File "D:\Python27\Lib\unittest\suite.py", line 146, in _handleClassSetUp
setUpClass()
File "D:\python_project\ApiTestEngine\tests\base.py", line 20, in setUpClass
cls.api_server_process.start()
File "D:\Python27\Lib\multiprocessing\process.py", line 130, in start
self._popen = Popen(self)
File "D:\Python27\Lib\multiprocessing\forking.py", line 277, in init
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "D:\Python27\Lib\multiprocessing\forking.py", line 199, in dump
ForkingPickler(file, protocol).dump(obj)
File "D:\Python27\Lib\pickle.py", line 224, in dump
self.save(obj)
File "D:\Python27\Lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "D:\Python27\Lib\pickle.py", line 425, in save_reduce
save(state)
File "D:\Python27\Lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\Lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\Python27\Lib\pickle.py", line 687, in _batch_setitems
save(v)
File "D:\Python27\Lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\Lib\multiprocessing\forking.py", line 67, in dispatcher
self.save_reduce(obj=obj, *rv)
File "D:\Python27\Lib\pickle.py", line 401, in save_reduce
save(args)
File "D:\Python27\Lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\Lib\pickle.py", line 554, in save_tuple
save(element)
File "D:\Python27\Lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "D:\Python27\Lib\pickle.py", line 425, in save_reduce
save(state)
File "D:\Python27\Lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\Lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\Python27\Lib\pickle.py", line 687, in _batch_setitems
save(v)
File "D:\Python27\Lib\pickle.py", line 306, in save
rv = reduce(self.proto)
TypeError: can't pickle thread.lock objects

运行ate -V时报错 pkg_resources.DistributionNotFound

Traceback (most recent call last):
File "/Users/finup/gitlab/ApiTestEngine/env/bin/ate", line 6, in
from pkg_resources import load_entry_point
File "/Users/finup/gitlab/ApiTestEngine/env/lib/python2.7/site-packages/pkg_resources/init.py", line 3049, in
@_call_aside
File "/Users/finup/gitlab/ApiTestEngine/env/lib/python2.7/site-packages/pkg_resources/init.py", line 3033, in _call_aside
f(*args, **kwargs)
File "/Users/finup/gitlab/ApiTestEngine/env/lib/python2.7/site-packages/pkg_resources/init.py", line 3062, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/Users/finup/gitlab/ApiTestEngine/env/lib/python2.7/site-packages/pkg_resources/init.py", line 658, in _build_master
ws.require(requires)
File "/Users/finup/gitlab/ApiTestEngine/env/lib/python2.7/site-packages/pkg_resources/init.py", line 972, in require
needed = self.resolve(parse_requirements(requirements))
File "/Users/finup/gitlab/ApiTestEngine/env/lib/python2.7/site-packages/pkg_resources/init.py", line 858, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'ipaddress; python_version <= "2.7" and extra == "secure"' distribution was not found and is required by urllib3

报告模板 Web 页加载时,部分资源无法加载

报告模板查看时,会存在如下报错:

GET https://ajax.googleapis.com/ajax/libs/jquery.min.js
net::ERR_CONNECTION_TIMED_OUT

问题:

由于外网的原因,导致可能存在一些用户在使用的时候,无法完成一些报告模板内引用的加载。
导致存在报错信息时,报错内容无法在 web 页面内查看。

建议:

能否对一些 js 等的引用改为对国内用户较为友好的方式,方便加载

感谢分享!同时想请教下楼主几个问题

1,如果要做一些复杂的断言,如:提取返回的html里的某一个值和预期作断言,应该如何做?
2,如果接口返回的数据是用des+base64加密,要怎么做断言?
3,能否用数据驱动的方式编写用例

$data能取到值,但是${data}取不到值

在使用过程中,我发现了一个问题,如果在测试用例文件中,config中variable_binds,如果想传入一个公共的参数,类如data=1,然后在test用例中,通过${data}取不到值,只有$data能取到之前的赋值?请问这是我的用例不合要求吗?还是因为什么?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.