我已经注意到,在集成测试期间,我实际上使用的是RESTful API(或一般的HTTP接口)的重复使用案例,我在这里和那里使用bash + cURL进行检查。

它开始看起来很凌乱并且难以维护。为什么会乱成一团?

典型的用例是:


检查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()


这是否有意义?或者是否有更高级的工具(但不太复杂,无法使用和集成)?

评论

什么是API代码?有很多集成测试系统,通常选择一个与测试代码使用相同的语言,以便同一开发人员可以同时更新两者。

这可能是异构的,我无法控制

那么您的团队更喜欢哪种语言?从bash + curl到capistranopost部署钩子,每个工具都将测试这种事情。

在Chef生态系统中,您会找到可以用http资源回答您问题的inspec,但是它基于serverspec / rspec,因此它比python世界更像是一个红宝石世界,但值得一试。

我一直在研究一些Python代码,以使用Python的请求库进行REST调用。它可以让您添加所需的任何标头并支持HTTP(s)代理支持,因此它应该能够支持curl的所有功能。欢迎您借用我的代码以满足您的需要,如果有帮助,请以它为例。

#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,当然可以将pycurlpytest结合使用,这样可以更轻松地诊断出故障原因。 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"