代码实现自动化相关理论
面试题问你如何做代码接口自动化
代码编写自动化脚本的流程
2.1抽取功能转化为自动化用例
2.2搭建环境(测试工具)
1、python、pycharm、requeste、pymysql、parametrize
2、jenkins、jdk
提示由于写的自动化脚本、而自动化脚本编写之前功能已测试完毕,所以不需要在单独搭建项目环境
2.3搭建目录结构
2.4代码编写
# 1、获取图片验证码接口 封装 def api_img_code(self, random): # 调用get方法 返回响应对象 return self.__session.get(url=self.__url_img_code.format(random)) # 2、获取短信验证码接口 封装 def api_phone_code(self, phone, imgVerifyCode): # 1、定义请求参数 data = { "phone": phone, "imgVerifyCode": imgVerifyCode, "type": "reg" } # 2、调用请求方法 return self.session.post(url=self.__url_phone_code, data=data) # 3、注册接口 封装 def api_register(self, phone, password, verifycode, phone_code, ): data = { "phone": phone, "password": password, "verifycode": verifycode, "phone_code": phone_code, "dy_server": "no", "invite_phone": "" } # 2、调用请求方法 return self.session.post(url=self.__url_register, data=data) # 4、登录接口 封装 def api_login(self, keywords, passwrod): # 1、定义请求参数 data = { "keywords": keywords, "passwrod": passwrod } # 2、调用请求方法 return self.session.post(url=self.__url_login, data=data) # 5、查询登录状态接口 封装 def api_login_status(self): return self.session.post(url=self.__url_login_status)
script(test01_register_login.py)
import unittest import requests from api.api_reqister_login import ApiRegisterLogin class TestReginsterLogin(unittest.TestCase): # 初始化 def setUp(self) -> None: #获取session对象 self.session = requests.session() #获取ApiRegisterLogin实例 self.reg = ApiRegisterLogin(self.session) # 结束 def tearDown(self) -> None: #关闭session对象 self.session.close() #1、获取图片验证码接口 测试 def test01_img_code(self): pass #2、获取短信验证码接口 测试 def test02_phone_code(self): pass #3、注册接口 测试 def test03_register(self): pass #4、登录接口 测试 def test04_login(self): pass #5、查询登录状态接口 测试 def test04_login_status(self): pass
2.5断言
说明:判断程序执行实际结果是否符合预期结果
示例:
try: #调用登录接口 self.reg.api_login(keywords="13600001111",passwrod="test123") #调用查询登录状态接口 r = self.reg.api_login_status() #看结果 self.assertIn(expect_text, r.text) except Exception as e: # 1、日志 print(e) # 2、抛异常 raise
提示:捕获异常的目的是为了将错误的信息记录下来,捕获信息完成后,必须抛出异常。
2.6参数化
步骤
1、编写数据储存文件 json
2、编写读取工具方法 read_json()
3、使用参数化组件进行引用 parametrize
1、编写参数化文件
心得:
1、根据模块来新建json文件(1个模块1个json文件)
2、最外侧使用{},模块下几个接口,编写几个key,值为列表
3、列表值中,有几组数据,就写几个{}
4、每组数据{}中,组成格式为:说明+参数+预期结果
示例:
{ "img_code": [ { "desc": "获取图片验证码成功(随机小数)", "random": "0.123", "expect_code": 200 }, { "desc": "获取图片验证码成功(随机整数)", "random": "123", "expect_code": 200 }, { "desc": "获取图片验证码成功(随机数为空)", "random": "", "expect_code": 404 }, { "desc": "获取图片验证码成功(随机数为字符串)", "random": "123hello", "expect_code": 400 } ], "phone_code": [ { "desc": "获取短信验证码成功", "phone": "13600001111", "imgVerifyCode": 8888, "expect_text": "发送成功" }, { "desc": "获取短信验证码成功", "phone": "13600001111", "imgVerifyCode": 8889, "expect_text": "验证码错误" } ], "register": [ { "desc": "注册成功(必填参数)", "phone": 13600001111, "password": "test123", "verifycode": 8888, "phone_code": 666666, "dy_server": "no", "expect_text": "注册成功" }, { "desc": "注册失败(图片验证码错误)", "phone": 13600001112, "password": "test123", "verifycode": 8889, "phone_code": 666666, "dy_server": "no", "expect_text": "验证码错误" }, { "desc": "注册失败(短信验证码错误)", "phone": 13600001112, "password": "test123", "verifycode": 8888, "phone_code": 666667, "dy_server": "no", "expect_text": "验证码错误" }, { "desc": "注册失敗(手机号已存在)", "phone": 13600001111, "password": "test123", "verifycode": 8888, "phone_code": 666666, "dy_server": "no", "expect_text": "注册成功" } ], "login": [{ "desc": "登录成功", "keywords": 13600001111, "password": "test123", "expect_text": "登录成功" }, { "desc": "登录失败(密码为空)", "keywords": 13600001111, "password": "", "expect_text": "不能为空" }, { "desc": "登录失败(解锁)", "keywords": 13600001111, "password": "test123", "expect_text": "登录成功" }], "login_status": [ { "desc": "查询登录状态(已登录)", "status": "已登录", "expect_text": "OK" }, { "desc": "查询登录状态(已登录)", "status": "未登录", "expect_text": "未登" } ] }
2、编写读取数据工具
def read_json(filename,key): #拼接读取文件的完整路径 os.sep动态获取/ file_path = DIR_PATH + os.sep + "data" + os.sep +filename arr=[] with open(file_path,"r",encoding="utf-8")as f: for data in json.load(f).get(key): arr.append(tuple(data.values())[1:]) return arr
3、参数化引用
难点1:错误次数锁定
#如果 password == "error123":
i = 1
while i <= 3
#调用登录
r = self.xxxxlogin()
#改变计数器
i+=1
#断言锁定
#暂停60秒
#调用登录(注意:登录时必须给正确密码)
else:
# 调用登录(参数数据)
# 断言
难点2:查询登录状态,不同结果
#如果status == "已登录":
#调用登录
#调用查询登录状态接口
#断言
目标
代码实现
1、抽取功能用例转化为自动化用例
2、搭建环境(测试工具)
3、搭建目录结构
4、编写脚本
5、持续集成
难点