• 感谢推荐,ApiTestEngine 也打算集成它来生成报告了

  • 那个是单元测试里面初始化用户的,就是将所有已有的用户清除掉;因为只是用于单元测试,所以比较简单粗暴

  • 预期结果响应是写到 validators 中,例子中有。
    都会写的,毕竟是想做一个完整的开源项目,文档必须要全。

  • 那只是因为我把实现细节写出来了,你要是不管原理只是使用,也不会觉得麻烦了

  • 没有想吐槽的么😲

  • 嗯,也许这就是软件工程跟计算机科学的差异所在吧😂

  • 对于 swagger,之前有简单了解过,但没有实际使用过。想问一下,如果是没有接口文档的系统,或者接口文档采用其它形式描述的系统,要转为使用 swagger 的话成本高么?其实从 QA 的角度,的确也应该去推动做这些事情,但就还是得考虑实际的投入产出比。

  • 1,web 化的确会大大提升易用性,要最终将测试平台推广到更多的项目,web 也是必要的;但是单纯对于一款接口测试框架来说,这更多的应该算是锦上添花的功能,所以前期可以考虑将数据结构规范化,快速地在项目中应用起来,在后期再扩展为 Web 平台;
    2、接口文档标准化,很多时候真的是可遇而不可求,特别是在中途接手一个质量不是很高的项目的时候,接口文档滞后或甚至是没有。实现自动生成测试用例这块儿,不知道你们有没有成功实践经验,可否分享下?
    3、赞同,也是这么做的。
    4、mock api 这个,感觉更应该是专门的 Mock 平台的职责,要放到一个接口测试平台感觉比较牵强。
    5、性能测试对于接口测试平台来说也是锦上添花的功能;不过经过设计(我是复用了 Locust),也可以实现接口测试用例和性能测试的复用,一份用例实现多个用途,也是不错的。

    现在市面上的确是已经有了很多接口测试平台,但是不同公司不同项目的情况差异巨大,所以的确很难说哪款测试工具或平台是最好的。终究还是回到那句话,适合的才是最好的😂

  • 嗯,能实现这样的话更好,但是在实际项目中实施起来比较难,除非是项目立项之初就有比较强的推动力

  • 我明白你的意思,是要同一个测试用例,对应多个不同的测试数据对吧?
    这块儿暂时还没有特殊处理,暂时还是以一个测试用例对应一种测试数据组合的形式。
    后面的想法有考虑通过函数调用来获取测试数据,例如在特定范围内获取随机值,或者从数据库表中获取特定字段。

  • 当前是这样的,测试数据与测试用例是一起的

  • 好了,已经添加了

  • 我看了下,貌似没有权限

  • 用例编写方式,推荐的是YAML/JSON的格式。写好后放置到任意文件夹中,然后通过如下方式执行即可。

    $ python main.py --testcase-path TESTCASE_FOLDER
    

    具体的使用方法部分我还在写。

  • 数据提取方式这部分,我借鉴的是 pyresttest 框架的方式,你可以看下代码的单元测试中用到的例子。

    def test_extract_response_json(self):
        resp = requests.post(
            url="http://127.0.0.1:5000/customize-response",
            json={
                'headers': {
                    'Content-Type': "application/json"
                },
                'body': {
                    'success': False,
                    "person": {
                        "name": {
                            "first_name": "Leo",
                            "last_name": "Lee",
                        },
                        "age": 29,
                        "cities": ["Guangzhou", "Shenzhen"]
                    }
                }
            }
        )
    
        extract_binds = {
            "resp_status_code": "status_code",
            "resp_headers_content_type": "headers.content-type",
            "resp_content_body_success": "body.success",
            "resp_content_content_success": "content.success",
            "resp_content_text_success": "text.success",
            "resp_content_person_first_name": "content.person.name.first_name",
            "resp_content_cities_1": "content.person.cities.1"
        }
        resp_obj = response.ResponseObject(resp)
        extract_binds_dict = resp_obj.extract_response(extract_binds)
    
        self.assertEqual(
            extract_binds_dict["resp_status_code"],
            200
        )
        self.assertEqual(
            extract_binds_dict["resp_headers_content_type"],
            "application/json"
        )
        self.assertEqual(
            extract_binds_dict["resp_content_content_success"],
            False
        )
        self.assertEqual(
            extract_binds_dict["resp_content_text_success"],
            False
        )
        self.assertEqual(
            extract_binds_dict["resp_content_person_first_name"],
            "Leo"
        )
        self.assertEqual(
            extract_binds_dict["resp_content_cities_1"],
            "Shenzhen"
        )
    
  • 1、依赖没有完成的接口这种情况,这是是单独的 Mock Server 去处理的,不算是测试框架这块儿的职责;
    2、当前推荐的是YAML/JSON文本格式的用例配置;对于喜欢 GUI 的,也可以采用 Excel 来写,实现一个 CSV 转换器即可。

  • 你说的依赖接口指的是这种情况么?B 接口的参数需要 A 接口返回的值。
    针对这种情况,我的实现方式是,在用例配置的时候可以选择将接口返回结果的特性字段提取出来,绑定到一个变量中,然后后续接口请求就可以直接引用了。

  • 卡斯大叔起得好早啊,膜拜

  • 这些只是用来测试框架的数据而已。分别对应着不同的特性,例如单个测试用例,测试用例集。另外,由于代码比文档超前很多,很多特性还没来得及介绍。

  • 是的,直接复用的,现在最新的代码已经有了这个特性了,只是还没写文档

  • 而且再仔细看这个压测脚本实现方式,会发现模板性很强,所以这完全可以自动生成。也就是说,只需要维护一套YAML/JSON格式的用例,就可以同时实现接口自动化和性能压测了。

  • roboframework 能实现压测么?先剧透下,APITestEngine 可以很好的实现哦,而且是直接基于同一份用例。
    例如:

    #coding: utf-8
    import zmq
    import os
    from locust import HttpLocust, TaskSet, task
    from ate import utils, runner
    
    class WebPageTasks(TaskSet):
        def on_start(self):
            self.test_runner = runner.Runner(self.client)
            self.testset = self.locust.testset
    
        @task(weight=10)
        def test_login(self):
            results = self.test_runner.run_testset(self.testset)
            assert results[0] == (True, [])
    
    class WebPageUser(HttpLocust):
        host = 'http://www.skypixel.com'
        task_set = WebPageTasks
        min_wait = 1000
        max_wait = 5000
    
        testcase_file_path = os.path.join(
            os.getcwd(), 'testcases/skypixel/open_app.yml')
        testsets = utils.load_testcases_by_path(testcase_file_path)
        testset = testsets[0]
    
  • 已经写得差不多了,只是还要疏通下逻辑

  • 在项目根目录下,先运行下

    $ python -m unittest discover
    

    如果运行有问题,说明你的环境有问题。代码在各个版本下都是正常的。

  • 什么是最长情? at 2017年07月03日

    手动点赞