通过请求检查远程呼叫
项目描述
通过请求模块检查远程调用的工具。
找出您的代码正在调用的外部 API。
- 可选:
查找通话地点。
捕获响应和响应状态代码。
按域过滤
作为并行测试的服务器运行
- 2.x 注释:
现在模拟请求的 HTTPAdapter 类的send()方法。
现在监视请求而不是MonitorRequests
安装
pip install monitor-requests
用法
import unittest
import monitor_requests
from example import example_method
class ExampleTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.monitor = monitor_requests.Monitor()
@classmethod
def tearDownClass(cls):
print('External calls for example:')
# Optionally pass tracebacks=False to skip outputing tracebacks
# Report will call .stop() by default.
cls.monitor.report(tracebacks=False)
def test_example_method(self):
result = example_method()
self.assertEqual(result.status_code, 200)
if __name__ == 'main':
unittest.main()
要过滤捕获的域:
# Only capture facebook and google requests:
monitor = monitor_requests.Monitor(
domains=['facebook\.com', 'google\.com']
)
要在 django 测试运行程序中进行设置:(如果以串行方式运行测试,这仅在套件级别有效。根据您的设置,您可能需要使用 –parallel=1 运行)。或者,还有关于如何使用Server Moder将数据异步推送到包含的tornado数据服务器的说明。
def run_suite(self, suite, **kwargs):
monitor = monitor_requests.Monitor()
test_result = super(ReelioTestRunner, self).run_suite(suite, **kwargs)
monitor.report()
return test_result
要在 py.test 会话夹具内进行设置:
@pytest.fixture(scope='session')
def session_fixture():
monitor = monitor_requests.Monitor()
yield
monitor.report()
要写入文件:
@classmethod
def tearDownClass(cls):
with open('output.txt', 'w') as f:
cls.monitor.report(output=f)
对输出进行更精细的调整控制:
使用debug=True显示 url、响应和回溯。
使用urls=True来显示 url。
使用tracebacks=True或respones=True显示回溯或响应(也会显示 url,因为回溯和响应都由 url 组织)。
*服务器模式*
如果你想为整个并行运行的测试套件激活 monitor_requests,你可以运行包含的tornado服务器来持久化请求数据:
monitor_requests_server --port=9003
def run_suite(self, suite, **kwargs):
# Make sure to turn off mocking at the suit or session level.
monitor = monitor_requests.Monitor(server_port=9003, mocking=False)
test_result = super(ReelioTestRunner, self).run_suite(suite, **kwargs)
monitor.report()
return test_result
您将需要在您的 TestCase 类中进行额外的调用:
class ExampleTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
# Same port, and same domain filtering if applicable.
cls.monitor = monitor_requests.Monitor(server_port=9003)
@classmethod
def tearDownClass(cls):
# Make sure to stop the mocking in the tear down.
cls.monitor.stop()
请注意,这里没有 tearDownClass 也没有调用 stop() 或 report()。这只发生在会话级别。
示例输出
使用debug=True:
__________URLS__________
__________URL________
URL: http://facebook.com?param=test
Methods: GET
Requests: 1
______Tracebacks_____
File "example.py", line 22, in <module>
run()
File "example.py", line 18, in run
get_function_fb()
File "example.py", line 12, in get_function_fb
return requests.get('http://facebook.com?param=test')
_______Responses______
<StatusCode>200</StatusCode>
<Content><!DOCTYPE html>
<html lang="en" id="facebook" class="no_js">Etc/Etc</html></Content>
__________URL________
URL: http://google.com
Methods: GET
Requests: 1
______Tracebacks_____
File "example.py", line 22, in <module>
run()
File "example.py", line 17, in run
get_function()
File "example.py", line 7, in get_function
return requests.get('http://google.com')
_______Responses______
<StatusCode>200</StatusCode>
<Content><!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en">Etc/Etc</html></Content>
___________Analysis__________
Total Requests: 2
Time (Seconds): 1.16714
URL Count: 2
Domain Count: 2
Domains: facebook.com, google.com
使用debug=False:
___________Analysis__________
Total Requests: 2
Time (Seconds): 1.08454
URL Count: 2
Domain Count: 2
Domains: facebook.com, google.com