暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

接口测试 | Day53 基于UnitTest的JsonPath应用(二)

走向易富强之路 2021-08-17
253
 1
背景说明:
1、为了防止三天打鱼两天晒网式学习
2、每日更新1-2个小知识点或者案例
3、只看和跟着做的理解程度是不一样的
4、建议一起打卡练习
5、互相督促打卡 + v:yifuqiang2021

Day53


目标:
  • 基于UnitTest的JsonPath应用
    • yml文件的数据参数化
    • 基于Jsonpath获取数据的关键字

一、yml文件的参数化
  • 准备yaml文件
  • 安装命令
    • pip install ddt
    • pip install PyYAML
  • 代码实现

1)准备文件user.yaml
    -
    'username':'admin',
    'password':'123456'
    -
    'username':'sean',
    'password':'123456'
    -
    'username':'jay',
    'password':'123456'

    2)安装
    • pip install ddt

    • pip install PyYAML


    3)代码实现
      -- case_demo.py的代码
      import unittest
      from ddt import ddt,file_data
      from api_key import Apikey
      @ddt
      class ApiCase(unittest.TestCase):
      @classmethod
      # 执行函数方法前,先执行一次setUpClass(cls)里面的方法,进行实例化对象
      def setUpClass(cls) -> None:
      cls.ak = Apikey()
      @file_data('user.yaml')
      def test_1(self, username,password):
      url = 'http://39.98.138.157:5000/api/login'
      data = {
      'username': username,
      'password': password
      }
      res = self.ak.do_post(url=url, json=data)
      print(res.text)
      name = res.json()['info']['name']
      print(name)
      if __name__ == '__main__':
      unittest.main()
      运行结果:

      二、基于Jsonpath获取数据的关键字
      1)代码实现
        --在api_key.py中新增代码
        # 基于Jsonpath获取数据的关键字,用于提取所有需要的内推
        def get_text(self,json_data,key):
        # jsonpath获取数据的表达式:成功则返回list,失败则返回false
        value = jsonpath.jsonpath(json_data,'$..{0}'.format(key))
        if value:
        if len(value) == 1:
        return value[0]
        return value
        return value
        --在case_demo.py中新增
        # 获取响应中的结果,用于校验是否成功
        name = self.ak.get_text(res.json(),'name')
        print(name)
        # 添加断言,有name的就是成功
        self.assertTrue(name)
        运行结果:

        2)代码优化:
        • 从yaml文件中的期望响应结果来进行断言
        • json提前提取,包容非json转换的异常报错
          -- 修改user.yaml
          -
          user:
          username: admin
          password: '123456'
          msg: success
          -
          user:
          username: admin1
          password: '1234561'
          msg: 用户名或密码错误
          -
          user:
          username: admin2
          password: '1234562'
          msg: 用户名或密码错误
            --api_key.py
            # 基于JsonPath获取数据的关键字:用于提取所有需要的内容
            def get_text(self, txt, key):
            try:
            txt = json.loads(txt)
            value = jsonpath.jsonpath(txt, '$..{0}'.format(key))
            if value:
            if len(value) == 1:
            return value[0]
            return value
            except Exception as e:
            return e
            return value
            --case_demo.py
            import unittest
            from ddt import ddt,file_data
            from api_key import Apikey
            @ddt
            class ApiCase(unittest.TestCase):
            @classmethod
            # 执行函数方法前,先执行一次setUpClass(cls)里面的方法,进行实例化对象
            def setUpClass(cls) -> None:
            cls.ak = Apikey()
            @file_data('user.yaml')
            def test_1(self, user, msg):
            # ak = ApiKey()
            url = 'http://39.98.138.157:5000/api/login'
            data = {
            'username': user['username'],
            'password': user['password']
            }
            res = self.ak.do_post(url=url, json=data)
            print(res.text)

            # 获取响应中的结果,用于校验是否成功
            msg1 = self.ak.get_text(res.text, 'msg')
            print(msg1)
            self.assertEqual(msg1, msg, msg='异常')
            if __name__ == '__main__':
            unittest.main()
            运行结果:


            三、遇到的问题
            1、AttributeError: type object 'ApiCase' has no attribute 'test_1'
            • 原因:

              • 运行的时候光标的位置放在 ApiCase 方法里面了

              • 加了ddt后,运行时要先识别装饰的类,将光标放在某一个方法后面的话,测试用例只会执行当前的方法,ddt识别不到类,就会报错

            • 解决办法

              • 将光标放到ddt方法的外面,则运行通过


            四、文件说明
            • api_key.py用来封装函数
            • case_demo.py用来处理测试用例,在unittest框架下调用封装的函数

            五、总结
            • yml文件的数据参数化
              • 导包:from ddt import ddt,file_data
              • class前带@ddt
              • 函数前带  @file_data('user.yaml')
              • 函数传参(self,yaml文件里的字段1,yaml文件里的字段2)
            • 基于Jsonpath获取数据的关键字
              • 封装函数来处理json的内容
              • 通过封装函数后的结果进行断言处理

            “你的鼓励,是我继续的动力”
            文章转载自走向易富强之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论