用curl测试RESTful API的系统方法?


14

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

它开始看起来非常凌乱,并且变得难以维护。为什么要乱成一团?

典型的用例是:

  • 检查URL是否返回http响应代码,例如200
  • 在这种情况下,检查内容类型是否与您需要的某些MIME相匹配
  • 检查返回的内容是否匹配某种模式,或通过抽象验证过程

到目前为止,我发现并在不重新发明轮子的情况下认为是可行的选择是:

  • 可以使用PyCurl-希望它可以完全实现所有cURL选项esp。代理以及其他我可能需要的开关
  • 使用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
什么是API代码?有很多集成测试系统,通常选择一个与测试代码使用相同的语言,以便同一位开发人员可以同时更新两者。
Tensibai '17

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

1
那么您的团队更喜欢哪种语言?从bash + curl到capistrano post
posting

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

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

Answers:


7

您可以看一下诸如Postman之类的工具,该工具专注于使用JavaScript测试REST API-它具有一些不错的功能,但是您却失去了使用Python的能力。

相反,我建议您查看pytest的与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,您可以使用Plain编写所有测试assert,并可以选择在输出中包含有用的消息。例如,您的测试之一可以写成:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.