接口测试框架1.0.0版本
技术:python+pytest+requests
要点:
1.专门封装ApiHttpbinGet、ApiHttpbinPost类,里面封装了get & post 的所有requests请求的请求方式和断言
2.test case里使用级联调用方法
3.对于不定性的参数使用**kwargs
4.最大的2个缺点:
1)校验太单一
2)代码冗余,比如run、validate,不论是post还是get方式都有,而且可以看requests里的requests()方法的源码,其中可以把method当作一个参数传进去
版本1.0.0:
import json import requests class ApiHttpbinGet: url = "https://httpbin.org/get" method = "GET" headers = {"accept": "application/json"} params = {} def set_params(self, **kwargs): ''' 用来处理有params的get请求,而且为了保持在test case里调用的级联格式一致性,这里专门写一个注入params的方法,返回self对象 :param kwargs: get请求体, **kwargs传入的必须是【xxx=xxx】的格式 :return: 实例自身,用于级联操作 ''' self.params = kwargs.items() return self def run(self): """ 发送get方式的requests请求 :return: 实例自身,用于级联操作 """ self.response = requests.get(self.url, headers=self.headers, params=self.params) return self def validate(self, key, excepted_value): """ 用于断言 :return: 实例自身,用于级联操作 """ # print(self.response.__attrs__) # ['_content', 'status_code', 'headers', 'url', 'history', 'encoding','reason', 'cookies', 'elapsed', 'request'] actual_value = getattr(self.response, key) assert actual_value == excepted_value return self class ApiHttpbinPost: url = "https://httpbin.org/post" method = "POST" headers = {"accept": "application/json"} data = None json = None def set_request_data(self, **kwargs): """ 用来处理post请求的请求体,而且为了保持在test case里调用的级联格式一致性,这里专门写一个注入请求体的方法,返回self对象 :param kwargs: post请求的请求体, **kwargs传入的必须是【json={xxx:yyy}】或者【data="xxxx"】的格式 :return: 实例自身,用于级联操作 """ for k, v in kwargs.items(): if 'data' == k: self.data = v elif 'json' == k: self.json = v return self def run(self): """ 发送post方式的requests请求 :return: 实例自身,用于级联操作 """ self.response = requests.post(self.url, headers=self.headers, data=self.data, json=self.json) return self def validate(self, key, excepted_value): """ 用于断言 :return: 实例自身,用于级联操作 """ # print(self.response.__attrs__) # ['_content', 'status_code', 'headers', 'url', 'history', 'encoding', 'reason', 'cookies', 'elapsed', 'request'] actual_value = getattr(self.response, key) assert actual_value == excepted_value return self class TestCore: def test_get(self): r = requests.get("https://httpbin.org/get", headers={"accept": "application/json"}) assert r.status_code == 200 def test_get_new(self): ApiHttpbinGet().run().validate('status_code', 200) def test_get_params_new(self): ApiHttpbinGet().set_params(abc=123, xyz=345).run().validate('url', 'https://httpbin.org/get?abc=123&xyz=345') def test_post_json(self): r = requests.post("https://httpbin.org/post", headers={"accept": "application/json"}, json={"a": "1"}) assert r.status_code == 200 assert r.json()["data"] == '{"a": "1"}' def test_post_json_new(self): request_body = {"a": "1"} ApiHttpbinPost().set_request_data(json=request_body).run().validate('status_code', 200) def test_post_data(self): data = {"a": "1"} r = requests.post("https://httpbin.org/post", headers={"accept": "application/json"}, data=json.dumps(data)) assert r.status_code == 200 assert r.json()["data"] == '{"a": "1"}' def test_post_data_new(self): data = {"a": "1"} ApiHttpbinPost().set_request_data(data=json.dumps(data)).run().validate('status_code', 200)
版本1.0.1:
抽象出基类BasicApi,基类中实现类获取params、获取data、发送请求、返回结果校验的基础功能
各类请求的类都集成这个基类
import json import requests class BasicApi: url = None method = None headers = {"accept": "application/json"} params = {} data = None json = None def set_params(self, **kwargs): ''' 用来处理有params的请求 :param kwargs: 请求参数, **kwargs传入的必须是【xxx=xxx】的格式 :return: 实例自身,用于级联操作 ''' self.params = kwargs.items() return self def set_data(self, **kwargs): """ 用来处理post请求的请求体,而且为了保持在test case里调用的级联格式一致性,这里专门写一个注入请求体的方法,返回self对象 :param kwargs: post请求的请求体, **kwargs传入的必须是【json={xxx:yyy}】或者【data="xxxx"】的格式 :return: 实例自身,用于级联操作 """ for k, v in kwargs.items(): if 'data' == k: self.data = v elif 'json' == k: self.json = v return self def run(self): """ 发送requests请求 :return: 实例自身,用于级联操作 """ self.response = requests.request(self.method, self.url, headers=self.headers, params=self.params, data=self.data, json=self.json) return self def validate(self, key, excepted_value): """ 用于断言 :return: 实例自身,用于级联操作 """ actual_value = getattr(self.response, key) assert actual_value == excepted_value return self class ApiHttpbinGet(BasicApi): url = "https://httpbin.org/get" method = "GET" class ApiHttpbinPost(BasicApi): url = "https://httpbin.org/post" method = "POST" class TestCore: def test_get(self): ApiHttpbinGet().run().validate('status_code', 200) def test_get_params(self): ApiHttpbinGet().set_params(abc=123, xyz=345).run().validate('url', 'https://httpbin.org/get?abc=123&xyz=345') def test_post_json(self): request_body = {"a": "1"} ApiHttpbinPost().set_data(json=request_body).run().validate('status_code', 200) def test_post_data(self): data = {"a": "1"} ApiHttpbinPost().set_data(data=json.dumps(data)).run().validate('status_code', 200)