目录
前言:
一、接口封装与封装层级
二、接口关联和数据准备
三、接口封装极限改进
四、代码示例
五、总结
前言:
接口自动化是软件测试领域中的一个重要环节,它可以自动化执行接口测试用例,快速发现和定位接口问题,提高软件的质量和稳定性。为了实现接口自动化的高效执行和管理,我们需要开发一个接口自动化框架。
本文将分享一个基于Python语言实现的接口自动化框架封装项目实战,重点介绍了如何对接口进行关联封装和极限改进,从而提高接口自动化框架的可靠性和扩展性。
一、接口封装与封装层级
接口封装是指将一个或多个接口进行封装,封装成一个更高层次的接口,使得接口调用更加方便和简洁。接口封装一般分为三个层级:
1、基础封装层:将底层的接口进行封装,提供基本的请求和响应信息。
2、逻辑封装层:在基础封装的基础上,将接口的输入参数和输出结果进行组合,形成更为高层次的功能。
3、业务封装层:在逻辑封装层的基础上,将多个接口进行关联调用,形成更为完整的业务场景。
举个例子,我们现在要开发一个接口自动化框架来测试某个电商平台的商品查询接口,那么我们就需要对该接口进行封装。假设该接口需要输入一个商品名称,返回该商品的详细信息,那么我们可以使用下面的代码进行基础封装:
import requests
class GoodsApi:
def __init__(self):
self.base_url = "https://xxx.com/api/goods"
def query_good(self, name):
url = f"{self.base_url}/{name}"
response = requests.get(url)
return response.json()
在基础封装层的基础上,我们可以继续封装逻辑层和业务层。如果需要查询某个分类下的商品信息,那么逻辑封装层的代码可以是这样的:
class CategoryApi:
def __init__(self):
self.base_url = "https://xxx.com/api/category"
self.goods_api = GoodsApi()
def query_category_goods(self, category_name):
category_info = self.query_category(category_name)
goods_info = []
for goods_name in category_info.get('goods'):
good_info = self.goods_api.query_good(goods_name)
goods_info.append(good_info)
return goods_info
def query_category(self, category_name):
url = f"{self.base_url}/{category_name}"
response = requests.get(url)
return response.json()
在业务封装层中,我们可以将多个接口进行组合,形成更为完整的业务场景。例如,我们想要查询某个用户的所有订单信息,那么可以这样封装:
class UserApi:
def __init__(self):
self.base_url = "https://xxx.com/api/user"
self.category_api = CategoryApi()
def query_user_order(self, user_id):
user_info = self.query_user(user_id)
order_info = []
for category_name in user_info.get('order_category'):
order_goods = self.category_api.query_category_goods(category_name)
order_info.extend(order_goods)
return order_info
def query_user(self, user_id):
url = f"{self.base_url}/{user_id}"
response = requests.get(url)
return response.json()
在这个例子中,我们将查询用户信息、查询分类下的商品信息以及查询用户订单三个接口进行了关联封装,使得调用用户订单信息的代码可以更加简洁和易读。
二、接口关联和数据准备
在进行自动化接口测试时,我们经常需要将多个接口进行关联调用和数据传递,这就需要在接口封装的基础上,加入关联和数据准备的功能。
关联指的是需要使用前一个接口的返回数据作为后一个接口的输入参数,这种情况下,我们需要用到一个Session对象,保存前后两个请求之间的关联关系。下面是一个示例代码:
class SessionApi:
def __init__(self):
self.session = requests.Session()
self.base_url = "https://xxx.com/api"
self.goods_api = GoodsApi(self.session)
self.category_api = CategoryApi(self.session)
self.user_api = UserApi(self.session)
def login(self, user_id, password):
url = f"{self.base_url}/login"
data = {
'user_id': user_id,
'password': password
}
response = self.session.post(url, data=data)
return response.json()
def query_user_order(self, user_id):
user_info = self.user_api.query_user(user_id)
order_info = []
for category_name in user_info.get('order_category'):
order_goods = self.category_api.query_category_goods(category_name)
order_info.extend(order_goods)
return order_info
在这个例子中,我们在Session对象中保存了每个封装层级的实例对象,将前面的请求的Session对象传递给后面的请求,实现接口关联。我们还新增了一个login方法,用于模拟用户登录,获取到Session对象,保证后续接口调用的完整性和正确性。另外,我们还可以在数据准备中,对请求所需要的数据进行随机生成或从数据库中读取,以提高接口自动化测试的可靠性和稳定性。
三、接口封装极限改进
在前面的示例中,我们只给出了基础、逻辑和业务封装的三个层级,但实际的项目中,我们可能还需要对接口进行更为细粒度的封装。比如,对于接口的请求参数、响应参数、错误码和异常情况,我们都可以进行更为细致和个性化的封装。下面是一个示例代码:
class GoodsApi:
def __init__(self, session):
self.session = session
self.base_url = "https://xxx.com/api/goods"
def query_good(self, name):
url = f"{self.base_url}/{name}"
response = self.session.get(url)
return self._parse_response(response)
def _parse_response(self, response):
if response.status_code == 200:
return response.json()
else:
raise Exception(f"request failed with status code {response.status_code}")
在这个示例代码中,我们新增了一个_parse_response方法,用于解析响应结果。如果响应状态码不是200,那么会抛出异常;否则,返回json格式的响应结果。这个方法可以避免我们在每个接口调用的时候,都需要重复编写解析响应结果的代码。
除了对接口的整体封装,我们还可以进行模块化的封装。在一个大型的项目中,可能会有多个功能模块,每个功能模块内部又包含了多个接口,这时我们可以对每个功能模块进行封装,将其内部的接口进行模块化的管理和维护。这样做的好处是,提高了代码的可读性和可维护性,降低了代码的耦合度,方便日后的功能模块扩展和维护。
class GoodsModule:
def __init__(self, session):
self.goods_api = GoodsApi(session)
def query_good_info(self, good_name):
return self.goods_api.query_good(good_name)
def query_good_price(self, good_name):
good_info = self.goods_api.query_good(good_name)
return good_info.get('price')
在这个示例代码中,我们将商品模块的两个接口,分别封装成为两个函数,query_good_info和query_good_price,使得调用商品模块内部的接口更加方便和简洁。
四、代码示例
下面是一个完整的示例代码,包括样例接口和其相关的封装:
import requests
class GoodsApi:
def __init__(self, session):
self.session = session
self.base_url = "https://xxx.com/api/goods"
def query_good(self, name):
url = f"{self.base_url}/{name}"
response = self.session.get(url)
return self._parse_response(response)
def _parse_response(self, response):
if response.status_code == 200:
return response.json()
else:
raise Exception(f"request failed with status code {response.status_code}")
class CategoryApi:
def __init__(self, session):
self.session = session
self.base_url = "https://xxx.com/api/category"
self.goods_api = GoodsApi(session)
def query_category_goods(self, category_name):
category_info = self.query_category(category_name)
goods_info = []
for goods_name in category_info.get('goods'):
good_info = self.goods_api.query_good(goods_name)
goods_info.append(good_info)
return goods_info
def query_category(self, category_name):
url = f"{self.base_url}/{category_name}"
response = self.session.get(url)
return self._parse_response(response)
def _parse_response(self, response):
if response.status_code == 200:
return response.json()
else:
raise Exception(f"request failed with status code {response.status_code}")
class UserApi:
def __init__(self, session):
self.session = session
self.base_url = "https://xxx.com/api/user"
self.category_api = CategoryApi(session)
def query_user_order(self, user_id):
user_info = self.query_user(user_id)
order_info = []
for category_name in user_info.get('order_category'):
order_goods = self.category_api.query_category_goods(category_name)
order_info.extend(order_goods)
return order_info
def query_user(self, user_id):
url = f"{self.base_url}/{user_id}"
response = self.session.get(url)
return self._parse_response(response)
def _parse_response(self, response):
if response.status_code == 200:
return response.json()
else:
raise Exception(f"request failed with status code {response.status_code}")
class SessionApi:
def __init__(self):
self.session = requests.Session()
self.base_url = "https://xxx.com/api"
self.goods_api = GoodsApi(self.session)
self.category_api = CategoryApi(self.session)
self.user_api = UserApi(self.session)
def login(self, user_id, password):
url = f"{self.base_url}/login"
data = {
'user_id': user_id,
'password': password
}
response = self.session.post(url, data=data)
return response.json()
def query_user_info(self, user_id):
return self.user_api.query_user(user_id)
def query_user_order(self, user_id):
return self.user_api.query_user_order(user_id)
def query_good_info(self, good_name):
return self.goods_api.query_good(good_name)
def query_good_price(self, good_name):
good_info = self.goods_api.query_good(good_name)
return good_info.get('price')
五、总结
接口自动化测试是一个日益重要的测试环节,在实现接口自动化测试的过程中,开发一个高效、可靠、易于维护的接口自动化框架非常重要。本文介绍了基础、逻辑、业务和极限改进四个方面的接口封装方法,并在代码示例中展示了如何进行接口关联和数据准备。希望本文能对您开发接口自动化框架时有所帮助。
【自动化测试交流】:574737577http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=NMRVNWflxt3xkgJD_Cj1eSi6GHgTNQAw&authKey=G4Z6oltN4M9aCbBQfUODeoKPeKUsDSGmyxsSOXuwLjjN%2BBtm5ZJD3KeOsXJHwpC%2F&noverify=0&group_code=574737577接口自动化测试:
自动化测试福利: