Merge pull request #787 from httprunner/leo_dev

## 2.4.2 (2019-12-13)

**Changed**

- refactor: replace with open file handler, avoid reading files into memory
- refactor: rename plugin to extension, httprunner/plugins -> httprunner/ext
- docs: update installation doc for developers
This commit is contained in:
debugtalk
2019-12-13 12:12:01 +08:00
committed by GitHub
16 changed files with 59 additions and 49 deletions

View File

@@ -1,5 +1,13 @@
# Release History # Release History
## 2.4.2 (2019-12-13)
**Changed**
- refactor: replace with open file handler, avoid reading files into memory
- refactor: rename plugin to extension, httprunner/plugins -> httprunner/ext
- docs: update installation doc for developers
## 2.4.1 (2019-12-12) ## 2.4.1 (2019-12-12)
**Added** **Added**

View File

@@ -2,7 +2,7 @@
HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS、Linux、Windows 系统平台上。 HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS、Linux、Windows 系统平台上。
**Python 版本**HttpRunner 支持 Python 3.4 及以上的所有版本,并使用 Travis-CI 进行了[持续集成测试][travis-ci],测试覆盖的版本包括 2.7/3.4/3.5/3.6/3.7。虽然 HttpRunner 暂时保留了对 Python 2.7 的兼容支持,但强烈建议使用 Python 3.4 及以上版本。 **Python 版本**HttpRunner 支持 Python 3.5 及以上的所有版本,并使用 Travis-CI 进行了[持续集成测试][travis-ci],测试覆盖的版本包括 2.7/3.5/3.6/3.7/3.8。虽然 HttpRunner 暂时保留了对 Python 2.7 的兼容支持,但强烈建议使用 Python 3.6 及以上版本。
**操作系统**:推荐使用 macOS/Linux。 **操作系统**:推荐使用 macOS/Linux。
@@ -45,10 +45,10 @@ httprunner、hrun、ate 三个命令完全等价,功能特性完全相同,
```text ```text
$ hrun -V $ hrun -V
2.0.2 2.4.1
$ har2case -V $ har2case -V
0.2.0 0.3.1
``` ```
## 开发者模式 ## 开发者模式
@@ -57,10 +57,10 @@ $ har2case -V
如果你不仅仅是使用 HttpRunner还需要对 HttpRunner 进行开发调试debug那么就需要进行如下操作。 如果你不仅仅是使用 HttpRunner还需要对 HttpRunner 进行开发调试debug那么就需要进行如下操作。
HttpRunner 使用 [pipenv][pipenv] 对依赖包进行管理,若你还没有安装 pipenv,需要先执行如下命令进行按照: HttpRunner 使用 [poetry][poetry] 对依赖包进行管理,若你还没有安装 poetry,需要先执行如下命令进行按照:
```bash ```bash
$ pip install pipenv $ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
``` ```
获取 HttpRunner 源码: 获取 HttpRunner 源码:
@@ -72,49 +72,50 @@ $ git clone https://github.com/HttpRunner/HttpRunner.git
进入仓库目录,安装所有依赖: 进入仓库目录,安装所有依赖:
```bash ```bash
$ pipenv install --dev $ poetry install
``` ```
运行单元测试,若测试全部通过,则说明环境正常。 运行单元测试,若测试全部通过,则说明环境正常。
```bash ```bash
$ pipenv run python -m unittest discover $ poetry run python -m unittest discover
``` ```
查看 HttpRunner 的依赖情况: 查看 HttpRunner 的依赖情况:
```text ```text
$ pipenv graph $ poetry show
certifi 2019.9.11 Python package for providing Mozilla's CA Bundle.
HttpRunner==2.0.0 chardet 3.0.4 Universal encoding detector for Python 2 and 3
- colorama [required: Any, installed: 0.4.0] click 7.0 Composable command line interface toolkit
- colorlog [required: Any, installed: 3.1.4] colorama 0.4.1 Cross-platform colored terminal text.
- har2case [required: Any, installed: 0.2.0] colorlog 4.0.2 Log formatting with colors!
- PyYAML [required: Any, installed: 3.13] coverage 4.5.4 Code coverage measurement for Python
- Jinja2 [required: Any, installed: 2.10] coveralls 1.8.2 Show coverage stats online via coveralls.io
- MarkupSafe [required: >=0.23, installed: 1.0] docopt 0.6.2 Pythonic argument parser, that will make you smile
- PyYAML [required: Any, installed: 3.13] filetype 1.0.5 Infer file type and MIME type of any file/buffer. No external dependencies.
- requests [required: Any, installed: 2.20.0] flask 0.12.4 A microframework based on Werkzeug, Jinja2 and good intentions
- certifi [required: >=2017.4.17, installed: 2018.10.15] har2case 0.3.1 Convert HAR(HTTP Archive) to YAML/JSON testcases for HttpRunner.
- chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4] idna 2.8 Internationalized Domain Names in Applications (IDNA)
- idna [required: >=2.5,<2.8, installed: 2.7] itsdangerous 1.1.0 Various helpers to pass data to untrusted environments and back.
- urllib3 [required: >=1.21.1,<1.25, installed: 1.24] jinja2 2.10.3 A very fast and expressive template engine.
- requests-toolbelt [required: Any, installed: 0.8.0] jsonpath 0.82 An XPath for JSON
- requests [required: >=2.0.1,<3.0.0, installed: 2.20.0] markupsafe 1.1.1 Safely add untrusted strings to HTML/XML markup.
- certifi [required: >=2017.4.17, installed: 2018.10.15] pyyaml 5.1.2 YAML parser and emitter for Python
- chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4] requests 2.22.0 Python HTTP for Humans.
- idna [required: >=2.5,<2.8, installed: 2.7] requests-toolbelt 0.9.1 A utility belt for advanced users of python-requests
- urllib3 [required: >=1.21.1,<1.25, installed: 1.24] urllib3 1.25.6 HTTP library with thread-safe connection pooling, file post, and more.
werkzeug 0.16.0 The comprehensive WSGI web application library.
``` ```
调试运行方式: 调试运行方式:
```bash ```bash
# 调试运行 hrun # 调试运行 hrun
$ pipenv run python main-debug.py hrun -h $ poetry run python -m httprunner -h
# 调试运行 locusts # 调试运行 locusts
$ pipenv run python main-debug.py locusts -h $ pipenv run python -m httprunner.plugins.locusts -h
``` ```
## Docker ## Docker
@@ -124,4 +125,4 @@ TODO
[travis-ci]: https://travis-ci.org/HttpRunner/HttpRunner [travis-ci]: https://travis-ci.org/HttpRunner/HttpRunner
[Locust]: http://locust.io/ [Locust]: http://locust.io/
[har2case]: https://github.com/HttpRunner/har2case [har2case]: https://github.com/HttpRunner/har2case
[pipenv]: https://docs.pipenv.org/ [poetry]: https://github.com/sdispater/poetry

View File

@@ -1,4 +1,4 @@
__version__ = "2.4.1" __version__ = "2.4.2"
__description__ = "One-stop solution for HTTP(S) testing." __description__ = "One-stop solution for HTTP(S) testing."
__all__ = ["__version__", "__description__"] __all__ = ["__version__", "__description__"]

View File

@@ -1,2 +1,2 @@
# NOTICE: # NOTICE:
# This file should not be deleted, or ImportError will be raised in Python 2.7 when importing plugin # This file should not be deleted, or ImportError will be raised in Python 2.7 when importing extension

View File

@@ -0,0 +1,4 @@
from httprunner.ext.locusts.cli import main
if __name__ == "__main__":
main()

View File

@@ -5,7 +5,7 @@ from locust import HttpLocust, TaskSet, task
from locust.events import request_failure from locust.events import request_failure
from httprunner.exceptions import MyBaseError, MyBaseFailure from httprunner.exceptions import MyBaseError, MyBaseFailure
from httprunner.plugins.locusts.utils import prepare_locust_tests from httprunner.ext.locusts.utils import prepare_locust_tests
from httprunner.runner import Runner from httprunner.runner import Runner
logging.getLogger().setLevel(logging.CRITICAL) logging.getLogger().setLevel(logging.CRITICAL)

View File

@@ -1,6 +1,6 @@
""" upload test plugin. """ upload test extension.
If you want to use this plugin, you should install the following dependencies first. If you want to use this extension, you should install the following dependencies first.
- requests_toolbelt - requests_toolbelt
- filetype - filetype
@@ -50,7 +50,7 @@ try:
from requests_toolbelt import MultipartEncoder from requests_toolbelt import MultipartEncoder
except ImportError: except ImportError:
msg = """ msg = """
uploader plugin dependencies uninstalled, install first and try again. uploader extension dependencies uninstalled, install first and try again.
install with pip: install with pip:
$ pip install requests_toolbelt filetype $ pip install requests_toolbelt filetype
""" """
@@ -128,9 +128,10 @@ def multipart_encoder(**kwargs):
if is_exists_file: if is_exists_file:
# value is file path to upload # value is file path to upload
filename = os.path.basename(_file_path) filename = os.path.basename(_file_path)
with open(_file_path, 'rb') as f: mime_type = get_filetype(_file_path)
mime_type = get_filetype(_file_path) # TODO: fix ResourceWarning for unclosed file
fields_dict[key] = (filename, f.read(), mime_type) file_handler = open(_file_path, 'rb')
fields_dict[key] = (filename, file_handler, mime_type)
else: else:
fields_dict[key] = value fields_dict[key] = value

View File

@@ -429,8 +429,8 @@ def get_mapping_function(function_name, functions_mapping):
return utils.get_os_environ return utils.get_os_environ
elif function_name in ["multipart_encoder", "multipart_content_type"]: elif function_name in ["multipart_encoder", "multipart_content_type"]:
# plugin for upload test # extension for upload test
from httprunner.plugins import uploader from httprunner.ext import uploader
return getattr(uploader, function_name) return getattr(uploader, function_name)
try: try:
@@ -1158,7 +1158,7 @@ def __prepare_testcase_tests(tests, config, project_mapping, session_variables_s
test_dict["request"]["verify"] = config_verify test_dict["request"]["verify"] = config_verify
if "upload" in test_dict["request"]: if "upload" in test_dict["request"]:
from httprunner.plugins.uploader import prepare_upload_test from httprunner.ext.uploader import prepare_upload_test
prepare_upload_test(test_dict) prepare_upload_test(test_dict)
# current teststep variables # current teststep variables

View File

@@ -1,4 +0,0 @@
from httprunner.plugins.locusts.cli import main
if __name__ == "__main__":
main()

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "httprunner" name = "httprunner"
version = "2.4.1" version = "2.4.2"
description = "One-stop solution for HTTP(S) testing." description = "One-stop solution for HTTP(S) testing."
license = "Apache-2.0" license = "Apache-2.0"
readme = "README.md" readme = "README.md"

View File

@@ -1,7 +1,7 @@
import os import os
import unittest import unittest
from httprunner.plugins.locusts.utils import prepare_locust_tests from httprunner.ext.locusts.utils import prepare_locust_tests
class TestLocust(unittest.TestCase): class TestLocust(unittest.TestCase):