它开始看起来很凌乱并且难以维护。为什么会乱成一团?
典型的用例是:
检查URL是否返回http响应代码,例如200
检查内容类型是否符合您在这种情况下所需的MIME
检查返回的内容是否与某种模式匹配,或通过抽象验证过程
到目前为止我发现的内容和考虑一个可行的选项而不用费神费力,是:
可以使用PyCurl-希望它可以完全实现所有cURL选项,尤其是。代理以及我可能需要的其他开关
,例如,使用Python内置的单元testng
,然后我可以对每个要检查的服务进行一个单元测试:
import unittest, pycurl
class TestService (unittest.TestCase):
def test_1(self):
self.assertEqual(pycurl.returncode("some_url"), 200)
def test_2(self):
self.assertTrue(pycurl.response("some_url").matches ("xxx") )
def test_3(self):
self.assertTrue (pycurl.ContentType("some_url").equal("xxx"))
if __name__ == '__main__':
unittest.main()
这是否有意义?或者是否有更高级的工具(但不太复杂,无法使用和集成)?
#1 楼
您可以看一下诸如Postman之类的工具,该工具专注于使用JavaScript测试REST API-它具有一些不错的功能,但是您却失去了使用Python的能力。相反,我建议您看一下与REST相关的插件用于pytest,这是一个Python测试框架,可简化您的测试代码,同时仍运行使用
unittest
编写的测试。 例如,编写参数化测试可避免无聊且容易出错的重复测试代码。
Pytest具有大量的插件,可简化各种任务,包括:
Tavern,专门从事REST API的测试,并且在这里似乎非常相关-一种“ Python单元测试的邮递员”。
pytest-curl-report-使用
requests
库进行测试时,将打印一个curl
命令,您可以使用该命令从shell中重现错误。 Testinfra-专注于服务器测试(例如OS软件包,文件,进程等的状态,通常在远程服务器上进行测试)-如果您还需要这种类型,则强烈建议测试Ansible代码。
对于使用Puppet或Chef的用户,Testinfra类似于Beaker(带有RSpec),ServerSpec或InSpec。
>
如果您不喜欢Tavern,当然可以将
pycurl
与pytest
结合使用,这样可以更轻松地诊断出故障原因。 pytest-curl-report网站上的此示例仅使用通用pytest功能:$ py.test test.py
============================= test session starts ==============================
platform darwin -- Python 2.7.9 -- py-1.4.27 -- pytest-2.6.4
plugins: curl-report, httpbin, cache, capturelog, cov, flakes, pep8
collected 1 items
test.py F
=================================== FAILURES ===================================
______________________________ test_requests_get _______________________________
def test_requests_get():
r = requests.get('http://httpbin.org/get')
> assert False
E assert False
test.py:7: AssertionError
Pytest允许您使用纯
assert
编写所有测试,并可以选择包括有用的消息作为输出的一部分。例如,您的测试之一可能写为:def test_2():
assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
评论
什么是API代码?有很多集成测试系统,通常选择一个与测试代码使用相同的语言,以便同一开发人员可以同时更新两者。这可能是异构的,我无法控制
那么您的团队更喜欢哪种语言?从bash + curl到capistranopost部署钩子,每个工具都将测试这种事情。
在Chef生态系统中,您会找到可以用http资源回答您问题的inspec,但是它基于serverspec / rspec,因此它比python世界更像是一个红宝石世界,但值得一试。
我一直在研究一些Python代码,以使用Python的请求库进行REST调用。它可以让您添加所需的任何标头并支持HTTP(s)代理支持,因此它应该能够支持curl的所有功能。欢迎您借用我的代码以满足您的需要,如果有帮助,请以它为例。