python实现接口自动化

打印 上一主题 下一主题

主题 949|帖子 949|积分 2847


  • 代码实现自动化相干理论
  • 代码编写脚本和工具实现脚本区别是啥?
   

  • 代码:

    • 优点:代码灵活方便
    • 缺点:学习成本高

  • 工具:

    • 优点:易上手
    • 缺点:灵活度低,有局限性。

  • 总结:

    • 功能脚本:工具
    • 自动化脚本:代码

  

  • 代码接口自动化怎么做的?
   第一步:python+request+unittest;
具体描述?
第二步:封装、调用、数据驱动、日记、报告;
详细举例:
第三步:api\scripts\data\log\report\until…
  

  • 脚本实现
  • 利用代码编写自动化脚本的流程
   1、抽取功能用例转为自动化用例
2、搭建环境(测试工具、)
3、搭建目录结构
4、编写脚本
5、实行脚本
6、设置持续集成
  

  •   抽取功能转为自动化用例

  •   搭建环境(测试工具)
   1、python、Pycharm、requests、pymysql、parametrize
2、jenkins、jdk
提示:由于编写的自动化脚本,而自动化脚本编写之前功能已测试完毕,所以不需要在单独搭建项目环境。
  

  • 搭建目录结构

  • 代码编写
  • config.py
  1. import os
  2. # 服务器地址
  3. HPST = "http://user-p2p-test.itheima.net"
  4. # 项目目录路径
  5. dir_path = os.path.dirname(__file__)
复制代码


  • api(api_register_login.py)
  1. from config import HOST
  2. class ApiRegisterLogin:
  3.     # 初始化
  4.     def __init__(self, session):
  5.         # 获取session对象
  6.         self.session = session  # 实例化session,类下面的其他接口就能使用自己的session
  7.         # 图片验证码url
  8.         self.__url_img_code = HOST + "/common/public/verifycode1/{}"   # {}是随机变量,用{}占用
  9.         # 短信验证码url
  10.         self.__url_phone_code = HOST + "/member/public/sendSms"
  11.         # 注册url
  12.         self.__url_register = HOST + "/member/public/reg"
  13.         # 登录url
  14.         self.__url_login = HOST + "/member/public/login"
  15.         # 登录状态url
  16.         self.__url_login_status = HOST + "/member/public/islogin"
  17.     # 获取图片验证码接口 封装
  18.     def api_img_code(self):
  19.         pass
  20.     # 获取短信验证码接口 封装
  21.     def api_phone_code(self):
  22.         pass
  23.     # 注册接口 封装
  24.     def api_register(self):
  25.         pass
  26.     # 登录接口 封装
  27.     def api_login(self):
  28.         pass
  29.     # 查询登录状态接口 封装
  30.     def api_login_status(self):
  31.         pass
复制代码
  加上__,只能在当千模块里调用,其他py文件调用不了

  

  • 接口封装 实现
  1. # 获取图片验证码接口 封装
  2.     def api_img_code(self, random):
  3.         # 调用get方法,返回响应对象
  4.         res = self.session.get(url=self.__url_img_code.format(random))
  5.         return res
  6.     # 获取短信验证码接口 封装
  7.     def api_phone_code(self, phone, imgVerifyCode):
  8.         # 1、定义请求参数
  9.         data = {
  10.             "phone": phone,
  11.             "imgVerifyCode": imgVerifyCode,
  12.             "type": "reg"
  13.         }
  14.         # 2、调用请求方法
  15.         res = self.session.post(url=self.__url_phone_code, data=data)
  16.         return res
  17.     # 注册接口 封装
  18.     def api_register(self, phone, password, verifycode, phone_code):
  19.         # 1、定义请求参数
  20.         data = {
  21.             "phone": phone,
  22.             "password": password,
  23.             "verifycode": verifycode,
  24.             "phone_code": phone_code,
  25.             "dy_server": "on",
  26.             "invite_phone": ""
  27.         }
  28.         # 2、调用请求方法
  29.         res = self.session.post(url=self.__url_register, data=data)
  30.         return res
  31.     # 登录接口 封装
  32.     def api_login(self, keywords, password):
  33.         # 1、定义请求参数
  34.         data = {
  35.             "keywords": keywords,
  36.             "password": password
  37.         }
  38.         # 2、调用请求方法
  39.         res = self.session.post(url=self.__url_login, data=data)
  40.         return res
  41.     # 查询登录状态接口 封装
  42.     def api_login_status(self):
  43.         res = self.session.post(self.__url_login_status)
复制代码


  • script(test01_register_login.py)

  1. import unittest
  2. import requests
  3. from api.api_register_login import ApiRegisterLogin
  4. class TestRegisterLogin(unittest.TestCase):
  5.     # 初始化
  6.     def setUp(self):
  7.         # 获取session对象
  8.         self.session = requests.session()
  9.         # 获取ApiRegisterLogin实例
  10.         self.reg = ApiRegisterLogin(self.session)
  11.     # 结束
  12.     def tearDown(self):
  13.         # 关闭session对象
  14.         self.session.close()
  15.     # 获取图片验证码接口 测试
  16.     def test01_img_code(self):
  17.         pass
  18.     # 获取短信验证码接口 测试
  19.     def test02_phone_code(self):
  20.         pass
  21.     # 注册接口测试
  22.     def test03_register(self):
  23.         pass
  24.     # 登录接口 测试
  25.     def test04_login(self):
  26.         pass
  27.     # 查询登录状态 测试
  28.     def test05_login_status(self):
  29.         pass
复制代码


  • 注册登录接口调试测试
  1. import unittest
  2. import requests
  3. from api.api_register_login import ApiRegisterLogin
  4. class TestRegisterLogin(unittest.TestCase):
  5.     # 初始化
  6.     def setUp(self):
  7.         # 获取session对象
  8.         self.session = requests.session()
  9.         # 获取ApiRegisterLogin实例
  10.         self.reg = ApiRegisterLogin(self.session)
  11.     # 结束
  12.     def tearDown(self):
  13.         # 关闭session对象
  14.         self.session.close()
  15.     # 获取图片验证码接口 测试
  16.     def test01_img_code(self):
  17.         # 1、调用图片验证码接口
  18.         r = self.reg.api_img_code(123)
  19.         # 2、查看响应状态码
  20.         print(r.status_code)
  21.     # 获取短信验证码接口 测试
  22.     def test02_phone_code(self, phone=13600001111, imgVerifyCode=8888):
  23.         # 1、调用获取图片验证码接口----目的:让session记住cookie
  24.         self.reg.api_img_code(123)
  25.         # 2、调用短信验证码接口
  26.         r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)
  27.         # 3、查看响应结果
  28.         print(r.json())
  29.     # 注册接口测试
  30.     def test03_register(self, phone=13600001111, imgVerifyCode=8888, password="test123", phone_code=666666):
  31.         # 1、图片验证码接口
  32.         self.reg.api_img_code(123)
  33.         # 2、短信验证码接口
  34.         self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)
  35.         # 3、注册接口
  36.         r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)
  37.         # 4、查看结果
  38.         print(r.json())
  39.     # 登录接口 测试
  40.     def test04_login(self, keywords=13600001111, password="test123"):
  41.         # 1、登录接口
  42.         r = self.reg.api_login(keywords=keywords, password=password)
  43.         # 2、查询结果
  44.         print(r.json())
  45.     # 查询登录状态 测试
  46.     def test05_login_status(self, keywords=13600001111, password="test123"):
  47.         # 1、调用登录接口
  48.         self.reg.api_login(keywords=keywords, password=password)
  49.         # 2、调用查询登录结果接口
  50.         r = self.reg.api_login_status()
  51.         print(r.json())
复制代码


  • 断言
   阐明:判定程序实行实际结果是否符合预期结果
  

  • 示例:
   

  

  • 提示:

    • 捕捉异常的目的是为了将错误信息记录下来,
    • 捕捉信息完成后,必须抛出异常

  1. import unittest
  2. import requests
  3. from api.api_register_login import ApiRegisterLogin
  4. class TestRegisterLogin(unittest.TestCase):
  5.     # 初始化
  6.     def setUp(self):
  7.         # 获取session对象
  8.         self.session = requests.session()
  9.         # 获取ApiRegisterLogin实例
  10.         self.reg = ApiRegisterLogin(self.session)
  11.     # 结束
  12.     def tearDown(self):
  13.         # 关闭session对象
  14.         self.session.close()
  15.     # 获取图片验证码接口 测试
  16.     def test01_img_code(self):
  17.         try:
  18.             # 1、调用图片验证码接口
  19.             r = self.reg.api_img_code(123)
  20.             # 2、查看响应状态码
  21.             self.assertEqual(200, r.status_code)
  22.         except Exception as e:
  23.             # 日志
  24.             print(e)
  25.             # 抛出异常
  26.             raise
  27.     # 获取短信验证码接口 测试
  28.     def test02_phone_code(self, phone=13600001111, imgVerifyCode=8888, expect_text="发送成功"):
  29.         try:
  30.             # 1、调用获取图片验证码接口----目的:让session记住cookie
  31.             self.reg.api_img_code(123)
  32.             # 2、调用短信验证码接口
  33.             r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)
  34.             # 3、查看响应结果
  35.             self.assertIn(expect_text, r.text)
  36.         except Exception as e:
  37.             # 日志
  38.             print(e)
  39.             # 抛出异常
  40.             raise
  41.     # 注册接口测试
  42.     def test03_register(self, phone=13600001111, imgVerifyCode=8888, password="test123", phone_code=666666, expect_text="注册成功"):
  43.         try:
  44.             # 1、图片验证码接口
  45.             self.reg.api_img_code(123)
  46.             # 2、短信验证码接口
  47.             self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)
  48.             # 3、注册接口
  49.             r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)
  50.             # 4、查看结果
  51.             self.assertIn(expect_text, r.text)
  52.         except Exception as e:
  53.             # 日志
  54.             print(e)
  55.             # 抛出异常
  56.             raise
  57.     # 登录接口 测试
  58.     def test04_login(self, keywords=13600001111, password="test123", expect_text="登录成功"):
  59.         try:
  60.             # 1、登录接口
  61.             r = self.reg.api_login(keywords=keywords, password=password)
  62.             # 2、查询结果
  63.             self.assertIn(expect_text, r.text)
  64.         except Exception as e:
  65.             # 日志
  66.             print(e)
  67.             # 抛异常
  68.             raise
  69.     # 查询登录状态 测试
  70.     def test05_login_status(self, keywords=13600001111, password="test123", expect_text="OK"):
  71.         try:
  72.             # 1、调用登录接口
  73.             self.reg.api_login(keywords=keywords, password=password)
  74.             # 2、调用查询登录结果接口
  75.             r = self.reg.api_login_status()
  76.             self.assertIn(expect_text, r.text)
  77.         except Exception as e:
  78.             # 日志
  79.             print(e)
  80.             # 抛出异常
  81.             raise
复制代码


  • 参数化
  •   步骤
   1.编写数据存储文件json
2.编写读取工具方法 read_json()
3.利用参数化组件进行引用 parametrize
  

  • 1 .编写参数化文件(register_login.json)
   心得:
1、根据模块来新建json文件(1个模块1个json文件)
2、最外侧利用{},模块下几个接口,编写几个key,值为列表
3、列表值中,有几组数据,就写几个{}
4、每组数据{}中,组成格式:阐明+参数+预期结果
   

  • 几个接口几个key,这里有五个接口(图片验证码、短信验证码、注册、登录、登录状态接口)
  • 每组数据组成格式:阐明+参数+预期结果
  1. {
  2.   "img_code": [
  3.     {
  4.       "desc": "获取图片验证码成功(随机小数)",
  5.       "random": "0.123",
  6.       "expect_code": 200
  7.     },
  8.     {
  9.       "desc": "获取图片验证码成功(随机整数)",
  10.       "random": "123",
  11.       "expect_code": 200
  12.     },
  13.     {
  14.       "desc": "获取图片验证码成功(随机数为空)",
  15.       "random": "",
  16.       "expect_code": 404
  17.     },
  18.     {
  19.       "desc": "获取图片验证码成功(随机数为字符串)",
  20.       "random": "heloo123",
  21.       "expect_code": 400
  22.     }
  23.   ],
  24.   "phone_code": [
  25.     {
  26.       "desc": "获取短信验证码成功",
  27.       "phone": "13600001111",
  28.       "imgVerifyCode": "8888",
  29.       "expect_text": "发送成功"
  30.     },{
  31.       "desc": "获取短信验证码失败",
  32.       "phone": "13600001111",
  33.       "imgVerifyCode": "8889",
  34.       "expect_text": "验证码错误"
  35.     }
  36.   ],
  37.   "register": [
  38.     {
  39.       "desc": "注册成功(必填参数)",
  40.       "phone": "13600001111",
  41.       "password": "test123",
  42.       "verifycode": 8888,
  43.       "phone_code": 666666,
  44.       "dy_server": "on",
  45.       "expect_text": "注册成功"
  46.     },{
  47.       "desc": "注册失败(图片验证码错误)",
  48.       "phone": "13600001112",
  49.       "password": "test123",
  50.       "verifycode": 8889,
  51.       "phone_code": 666666,
  52.       "dy_server": "on",
  53.       "expect_text": "验证码错误"
  54.     },{
  55.       "desc": "注册失败(短信验证码错误)",
  56.       "phone": "13600001112",
  57.       "password": "test123",
  58.       "verifycode": 8888,
  59.       "phone_code": 666667,
  60.       "dy_server": "on",
  61.       "expect_text": "验证码错误"
  62.     },{
  63.       "desc": "注册失败(手机号已存在)",
  64.       "phone": "13600001111",
  65.       "password": "test123",
  66.       "verifycode": 8888,
  67.       "phone_code": 666666,
  68.       "dy_server": "on",
  69.       "expect_text": "已存在"
  70.     }
  71.   ],
  72.   "login": [
  73.     {
  74.       "desc": "登录成功",
  75.       "keywords": "13600001111",
  76.       "password": "test123",
  77.       "expect_text": "登录成功"
  78.     }, {
  79.       "desc": "登录失败(密码为空)",
  80.       "keywords": "13600001111",
  81.       "password": "",
  82.       "expect_text": "不能为空"
  83.     }, {
  84.       "desc": "登录失败(解锁)",
  85.       "keywords": "13600001111",
  86.       "password": "errror123",
  87.       "expect_text": "登录成功"
  88.     }
  89.   ],
  90.   "login_status": [
  91.     {
  92.       "desc": "查询登录状态(已登录)",
  93.       "status": "已登录",
  94.       "expect_text": "OK"
  95.     }, {
  96.       "desc": "查询登录状态(未登录)",
  97.       "status": "未登录",
  98.       "expect_text": "未登"
  99.     }
  100.   ]
  101. }
复制代码


  • 2、编写读取数据工具(util.py)


  1. from config import DIR_PATH
  2. def read_json(filename, key):
  3.     # 拼接读取文件的完整路径  os.sep动态获取/ 还是 \ ,根据电脑的操作系统
  4.     file_path = DIR_PATH + os.sep + "data" + os.sep + filename
  5.     arr = []
  6.     with open(file_path, 'r', encoding="utf-8") as f:
  7.         # print(json.load(f))
  8.         # print(json.load(f).get(key)) [{},{},{}]----->[(),(),()]
  9.         for data in json.load(f).get(key):
  10.             arr.append(tuple(data.values())[1:])
  11.         print(arr)
  12. if __name__ == '__main__':
  13.     read_json("register_login.json", "img_code")
  14.   # [('0.123', 200), ('123', 200), ('', 404), ('heloo123', 400)]
复制代码


  • 参数化引用



   

  • 难点1:错误次数锁定


  1. # 登录接口 测试
  2.     @parameterized.expand(read_json("register_login.json", "login"))
  3.     def test04_login(self, keywords, password, expect_text):
  4.         try:
  5.             i = 1
  6.             if "error" in password:
  7.                 while i <= 3:
  8.                     r = self.reg.api_login(keywords=keywords, password=password)
  9.                     i += 1
  10.                 # 断言锁定
  11.                 print("测试锁定:", r.text)
  12.                 self.assertIn("锁定", r.text)
  13.                 # 暂停60s
  14.                 sleep(60)
  15.                 # 测试登录成功
  16.                 r = self.reg.api_login(keywords="13600001111", password="test123")
  17.                 self.assertIn(expect_text, r.text)
  18.             # 1、登录接口
  19.             r = self.reg.api_login(keywords=keywords, password=password)
  20.             # 2、查询结果
  21.             self.assertIn(expect_text, r.text)
  22.         except Exception as e:
  23.             # 日志
  24.             print(e)
  25.             # 抛异常
  26.             raise
复制代码
  

  • 查询登录状态,差别结果。


  1. # 查询登录状态 测试
  2.     @parameterized.expand(read_json("register_login.json", "login_status"))
  3.     def test05_login_status(self, status, expect_text):
  4.         try:
  5.             if status == "已登录":
  6.                 # 1、调用登录接口
  7.                 self.reg.api_login(keywords="13600001111", password="test123")
  8.             # 2、调用查询登录结果接口
  9.             r = self.reg.api_login_status()
  10.             self.assertIn(expect_text, r.text)
  11.         except Exception as e:
  12.             # 日志
  13.             print(e)
  14.             # 抛出异常
  15.             raise
复制代码


  • 断言代码示例:(test01_register_login.py)
  1. import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginfrom parameterized import parameterizedfrom util import read_jsonfrom time import sleepclass TestRegisterLogin(unittest.TestCase):    # 初始化    def setUp(self):        # 获取session对象        self.session = requests.session()        # 获取ApiRegisterLogin实例        self.reg = ApiRegisterLogin(self.session)    # 竣事    def tearDown(self):        # 关闭session对象        self.session.close()    # 获取图片验证码接口 测试    @parameterized.expand(read_json("register_login.json", "img_code"))    def test01_img_code(self, random, expect_code):        try:            # 1、调用图片验证码接口            r = self.reg.api_img_code(random)            # 2、检察响应状态码            self.assertEqual(expect_code, r.status_code)        except Exception as e:            # 日记            print(e)            # 抛出异常            raise    # 获取短信验证码接口 测试    @parameterized.expand(read_json("register_login.json", "phone_code"))    def test02_phone_code(self, phone, imgVerifyCode, expect_text):        try:            # 1、调用获取图片验证码接口----目的:让session记住cookie            self.reg.api_img_code(123)            # 2、调用短信验证码接口            r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)            # 3、检察响应结果            self.assertIn(expect_text, r.text)        except Exception as e:            # 日记            print(e)            # 抛出异常            raise    # 注册接口测试    @parameterized.expand(read_json("register_login.json", "register"))    def test03_register(self, phone, password, imgVerifyCode, phone_code, expect_text):        try:            # 1、图片验证码接口            self.reg.api_img_code(123)            # 2、短信验证码接口            self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)            # 3、注册接口            r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)            # 4、检察结果            self.assertIn(expect_text, r.text)        except Exception as e:            # 日记            print(e)            # 抛出异常            raise    # 登录接口 测试
  2.     @parameterized.expand(read_json("register_login.json", "login"))
  3.     def test04_login(self, keywords, password, expect_text):
  4.         try:
  5.             i = 1
  6.             if "error" in password:
  7.                 while i <= 3:
  8.                     r = self.reg.api_login(keywords=keywords, password=password)
  9.                     i += 1
  10.                 # 断言锁定
  11.                 print("测试锁定:", r.text)
  12.                 self.assertIn("锁定", r.text)
  13.                 # 暂停60s
  14.                 sleep(60)
  15.                 # 测试登录成功
  16.                 r = self.reg.api_login(keywords="13600001111", password="test123")
  17.                 self.assertIn(expect_text, r.text)
  18.             # 1、登录接口
  19.             r = self.reg.api_login(keywords=keywords, password=password)
  20.             # 2、查询结果
  21.             self.assertIn(expect_text, r.text)
  22.         except Exception as e:
  23.             # 日志
  24.             print(e)
  25.             # 抛异常
  26.             raise
  27.     # 查询登录状态 测试
  28.     @parameterized.expand(read_json("register_login.json", "login_status"))
  29.     def test05_login_status(self, status, expect_text):
  30.         try:
  31.             if status == "已登录":
  32.                 # 1、调用登录接口
  33.                 self.reg.api_login(keywords="13600001111", password="test123")
  34.             # 2、调用查询登录结果接口
  35.             r = self.reg.api_login_status()
  36.             self.assertIn(expect_text, r.text)
  37.         except Exception as e:
  38.             # 日志
  39.             print(e)
  40.             # 抛出异常
  41.             raise
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表