- class OperationExcel:
- 2 def __init__(self, file_name=None, sheet_id=None):
- 3 if file_name:
- 4 self.file_name = file_name
- 5 self.sheet_id = sheet_id
- 6 else:
- 7 self.file_name = ''
- 8 self.sheet_id = 0
- 9 self.data = self.get_data()
- 10
- 11 # 获取sheets的内容
- 12 def get_data(self):
- 13 data = xlrd.open_workbook(self.file_name)
- 14 tables = data.sheets()[self.sheet_id]
- 15 return tables
- 16
- 17 # 获取单元格的行数
- 18 def get_lines(self):
- 19 tables = self.data
- 20 return tables.nrows
- 21
- 22 # 获取某一个单元格的内容
- 23 def get_cell_value(self, row, col):
- 24 return self.data.cell_value(row, col)
复制代码 1.5、Json数据处理1.5.1、Json测试用例- {
- 2 "config":{
- 3 "name":"post接口名",
- 4 "url":"/langdetect",
- 5 "method":"POST",
- 6 "headers":{
- 7 "Content-Type":"application/json"
- 8 },
- 9 "cookies":{
- 10
- 11 }
- 12 },
- 13 "testcase":[
- 14 {
- 15 "name":"测试用例1",
- 16 "params":{
- 17 "query":"测试"
- 18 },
- 19 "validate":[
- 20 {
- 21 "check":"status_code",
- 22 "comparator":"eq",
- 23 "expect":"200"
- 24 }
- 25 ]
- 26 },
- 27 {
- 28 "name":"测试用例2",
- 29 "params":{
- 30 "query":"python"
- 31 },
- 32 "validate":[
- 33 {
- 34 "check":"msg",
- 35 "comparator":"eq",
- 36 "expect":"success"
- 37 }
- 38 ]
- 39 }
- 40 ]
- 41 }
复制代码 1.5.2、Json用例处理获取Json文件中里具体字段的值。 handle.json.py部分源码 - 1 class HandleJson:
- 2 # 读取json文件
- 3 def load_json(self, file_name):
- 4 if file_name == None:
- 5 file_path = ""
- 6 else:
- 7 file_path = file_name
- 8 try:
- 9 with open(file_path, encoding='UTF-8') as f:
- 10 data = json.load(f)
- 11 return data
- 12 except Exception:
- 13 print("未找到json文件")
- 14 return {}
- 15
- 16 # 读取json文件里具体的字段值
- 17 def getJson_value(self, key, file_name):
- 18 if file_name == None:
- 19 return ""
- 20 jsonData = self.load_json(file_name)
- 21 if key == None:
- 22 getJsonValue = ""
- 23 else:
- 24 getJsonValue = jsonData.get(key)
- 25 return getJsonValue
复制代码 2、基类封装2.1、请求基类封装接口支持Get、Post请求,调用requests请求来实现接口的调用与返回。接口参数包括,接口地址、接口请求参数、cookie参数、header参数。 - 1 class BaseRequest:
- 2
- 3 def send_get(self, url, data, header=None, cookie=None):
- 4 """
- 5 Requests发送Get请求
- 6 :param url:请求地址
- 7 :param data:Get请求参数
- 8 :param cookie:cookie参数
- 9 :param header:header参数
- 10 """
- 11 response = requests.get(url=url, params=data, cookies=cookie, headers=header)
- 12 return response
- 13
- 14 def send_post(self, url, data, header=None, cookie=None):
- 15 """
- 16 Requests发送Post请求
- 17 :param url:请求地址
- 18 :param data:Post请求参数
- 19 :param data:Post请求参数
- 20 :param cookie:cookie参数
- 21 :param header:header参数
- 22 """
- 23 response = requests.post(url=url, json=data, cookies=cookie, headers=header)
- 24 return response
- 25
- 26 # 主函数调用
- 27
- 28 def run_main(self, method, url, data, header, cookie=None):
- 29 try:
- 30 result = ''
- 31 if method.upper() == 'GET':
- 32 result = self.send_get(url, data, header, cookie)
- 33 elif method.upper() == 'POST':
- 34 result = self.send_post(url, data, header, cookie)
- 35 return result
- 36 except Exception as e:
- 37 logger.exception('请求主函数调用失败:{}'.format(e))
复制代码 3、接口测试用例编写3.1、接口测试用例引用Pytest来进行接口的单元测试,通过JSON中多个测试用例来做为参数化数据驱动。结合Allure制定相应接口的测试报告。在接口返回断言之前,我们先进行该接口的契约测试, 我们采用的是Pactverity的全量契约校验测试。当契约测试通过时,我们再进行返回参数的相关校验测试。 test_getRequestJson.py部分源码 - @allure.feature('测试GET请求模块')
- 2 class TestRequestOne():
- 3 @allure.title('测试标题')
- 4 @allure.testcase('测试地址:https://www.imooc.com')
- 5 @pytest.mark.parametrize('case_data', testCaseData['testcase'])
- 6 def test_requestOne(self, case_data):
- 7 try:
- 8 api_response = apiRequest.api_request(baseurl, testCaseData, case_data)
- 9 api_response_data = api_response.json()
- 10 # pactverity——全量契约校验
- 11 config_contract_format = Like({
- 12 "msg": "成功",
- 13 "result": 0,
- 14 "data": EachLike({
- 15 "word": Like("testng")
- 16 })
- 17 })
- 18 mPactVerify = PactVerify(config_contract_format)
- 19 try:
- 20 mPactVerify.verify(api_response_data)
- 21 logger.info(
- 22 'verify_result:{},verify_info:{}'.format(mPactVerify.verify_result, mPactVerify.verify_info))
- 23 assert mPactVerify.verify_result == True
- 24 except Exception:
- 25 err_msg = '契约校验错误'
- 26 logger.exception('测试用例契约校验失败,verify_result:{},verify_info:{}'.format(mPactVerify.verify_result,
- 27 mPactVerify.verify_info))
- 28 try:
- 29 for case_validate in case_data['validate']:
- 30 logger.info('断言期望相关参数:check:{},comparator:{},expect:{}'.format(case_validate['check'],
- 31 case_validate['comparator'],
- 32 case_validate['expect']))
- 33 comparatorsTest.comparators_Assert(api_response, case_validate['check'],
- 34 case_validate['comparator'], case_validate['expect'])
- 35 logger.info('测试用例断言成功')
- 36 except Exception as e:
- 37 logger.exception('测试用例断言失败')
- 38 except Exception as e:
- 39 logger.exception('测试用例请求失败,原因:{}'.format(e))
复制代码 3.2、主运行运用Pytest和Allure的特性,命令行运行测试用例文件夹,并生成对应的allure测试报告。 - if __name__ == "__main__":
- 2 pytest.main(['-s', '-v', 'test_case/testRequest/', '-q', '--alluredir', 'reports'])
复制代码 4、Allure2测试报告当我们运行主函数时,并生成对应的测试用例报告时,我们可以看到在该文件夹中会生成对应的json文件的测试报告。将json文件的测试报告转换成html形式的。命令如下 reports是json格式测试报告存放的目录位置,allure_reports是html测试报告文件生成的目录位置。allure命令如下。 - 1 allure generate reports -o allure_result/
复制代码项目根目录下的allure_reports文件,存放的是allure生成的测试报告。可看出文件下有一个HTML文件,可通过Python的编辑器Pycharm来打开该HTML文件(测试报告), 或可通过allure命令来打开该HTML,展示HTML测试报告。如下所示。 测试报告文件,HTML测试报告如下。 allure命令打开HTML测试报告。命令如下所示。 - 1 allure open allure_result/
复制代码如下图所示
|