当前位置: 首页 > article >正文

OkHttp接口自动化之断言

文章目录

  • 断言
  • 应用
    • 获取json
    • 实现断言
  • Core
  • Jackson常用方法

断言

在编程和逻辑领域中,“断言”(assertion)是一种非常有用的工具。

一、编程中的断言

  1. 定义与语法

    • 断言是一种在程序中放置的检查点,用于声明某个条件在程序执行的特定点上应该为真。例如,在Python中,断言的语法是assert关键字后面跟着一个条件表达式。如果条件表达式的值为True,程序继续正常执行;如果为False,程序会抛出一个AssertionError异常。
    • 示例:
      x = 5
      assert x > 0
      
    • 在这个例子中,因为x = 5x>0这个条件为True,所以程序继续正常运行。如果x的值是负数或者0,就会触发AssertionError
  2. 用途

    • 调试辅助:在开发过程中,断言可以帮助程序员快速定位错误。例如,在一个复杂的函数中,你可以使用断言来检查函数的输入参数是否符合预期。假设你有一个函数用于计算一个数的平方根,你可以断言输入的数是非负数。
      def square_root(num):
          assert num >= 0
          return num**0.5
      
    • 程序不变量检查:断言还可以用于检查程序运行过程中的不变量。不变量是指在程序的某个特定阶段始终保持为真的条件。比如在一个排序算法中,你可以在每次交换元素后断言数组仍然是部分有序的。
  3. 注意事项

    • 断言不应该用于处理程序正常运行时可能出现的错误情况。因为在一些编程语言(如Python)中,当使用-O(优化)选项运行程序时,断言会被自动忽略。所以,对于必须处理的错误,应该使用合适的异常处理机制。

二、逻辑和数学中的断言

  1. 定义

    • 在逻辑和数学领域,断言是一个陈述性的句子,它要么是真的,要么是假的。例如,“三角形的内角和是180度”是一个数学断言,这个断言在欧几里得几何中是正确的。
  2. 证明与反驳

    • 对于数学断言,通常需要通过严格的推理和证明来确定其真假。比如对于上述三角形内角和的断言,可以通过多种几何证明方法来验证,如作平行线利用同位角、内错角等关系来推导。
    • 一个断言也可能被反驳。例如,“所有的数都是有理数”这个断言,当发现无理数(如 2 \sqrt{2} 2 )的存在时,就被反驳了。
  3. 在理论体系中的作用

    • 断言是构建数学和逻辑理论体系的基础单元。一系列相互关联的断言可以构成定理、公理等。例如,欧几里得几何的五条公理就是最基本的断言,基于这些公理可以推导出众多的几何定理。

应用

获取json

在做接口自动化测试过程中,我怎么知道对应的结果是成功还是失败?
期望结果(用户想要的数据) == 实际结果(响应得到的数据)

一般返回的数据格式是json,那么怎么去获取对应的数据呢?

java中第三方库:Jackson/gson 可以获取json

操作步骤:

  • 引入对应的包
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.5</version>
        </dependency>
  • 获取json
   public static void main(String[] args) throws JsonProcessingException {

        // 看成是响应数据
        String jsonString = "{\"name\":\"zhangsan\",\"age\":18,\"sex\":\"男\"}";
        // 初始化objectMapper
        ObjectMapper objectMapper = new ObjectMapper();
        // 解析json数据
        JsonNode jsonNode = objectMapper.readTree(jsonString);
        // 获取对应的json值
        String name = jsonNode.get("name").asText();
        // 获取对应的名字
        System.out.println(name);
        int age = jsonNode.get("age").asInt();
        // 获取对应的年龄
        System.out.println(age);
        String sex = jsonNode.get("sex").asText();
        // 获取对应的性别
        System.out.println(sex);
        JsonNode jsonNode1 = jsonNode.get("sex");
        System.out.println(jsonNode1);
        
  }

对应json嵌套内不为基本数据类型,通过JsonNode获取,然后遍历
在这里插入图片描述

实现断言

在原有的基础上断言

 if(response.isSuccessful()) {
            System.out.println("请求成功");
            System.out.println(result);

            // result 响应数据  (实际结果)  -- 一个字符串格式的json字符串
            // 初始化objectMapper
            ObjectMapper objectMapper = new ObjectMapper();
            // 解析json数据
            JsonNode jsonNode = objectMapper.readTree(result);
            // 得到userId,断言
            int userId = jsonNode.get("userId").asInt();
            System.out.println(userId);
            if(userId == 1) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }
            // 得到username,断言
            String name = jsonNode.get("username").asText();
            System.out.println(name);
            if(name.equals("zhangsan")) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }

        }

Core

sum: 断言就是通过实际响应数据和期望的数据去对比!

Jackson常用方法

  1. ObjectMapper类的方法
    • writeValueAsString(Object value)
      • 功能:将Java对象转换为JSON格式的字符串。这是最常用的序列化方法之一。它会自动根据对象的属性和值来生成JSON字符串。
      • 示例
        import com.fasterxml.jackson.databind.ObjectMapper;
        public class Main {
            public static void main(String[] args) throws Exception {
                MyObject myObject = new MyObject("John", 30);
                ObjectMapper objectMapper = new ObjectMapper();
                String json = objectMapper.writeValueAsString(myObject);
                System.out.println(json);
            }
        }
        class MyObject {
            private String name;
            private int age;
            public MyObject(String name, int age) {
                this.name = name;
                this.age = age;
            }
            // 省略getter和setter方法
        }
        
        在这个例子中,writeValueAsString方法将MyObject类的实例转换为JSON字符串,输出可能是{"name":"John","age":30}
    • writeValue(File resultFile, Object value)
      • 功能:将Java对象序列化为JSON格式,并将结果写入指定的文件。这个方法在需要将数据持久化存储为JSON文件时非常有用。
      • 示例
        import com.fasterxml.jackson.databind.ObjectMapper;
        import java.io.File;
        public class Main {
            public static void main(String[] args) throws Exception {
                MyObject myObject = new MyObject("John", 30);
                ObjectMapper objectMapper = new ObjectMapper();
                File file = new File("output.json");
                objectMapper.writeValue(file, myObject);
            }
        }
        class MyObject {
            private String name;
            private int age;
            public MyObject(String name, int age) {
                this.name = name;
                this.age = age;
            }
            // 省略getter和setter方法
        }
        
        这个示例会将MyObject对象转换为JSON格式,并将其写入名为output.json的文件中。
    • readValue(String content, Class valueType)
      • 功能:从JSON格式的字符串中反序列化出Java对象。它根据提供的JSON字符串和目标Java类的类型,将JSON数据转换为对应的Java对象。
      • 示例
        import com.fasterxml.jackson.databind.ObjectMapper;
        public class Main {
            public static void main(String[] args) throws Exception {
                String json = "{\"name\":\"John\",\"age\":30}";
                ObjectMapper objectMapper = new ObjectMapper();
                MyObject myObject = objectMapper.readValue(json, MyObject.class);
                System.out.println(myObject.getName());
            }
        }
        class MyObject {
            private String name;
            private int age;
            public MyObject(String name, int age) {
                this.name = name;
                this.age = age;
            }
            public String getName() {
                return name;
            }
            public int getAge() {
                return age;
            }
        }
        
        这里,readValue方法将JSON字符串转换为MyObject类的实例,然后可以通过对象的方法访问其属性。
    • readValue(File src, Class valueType)
      • 功能:从指定的JSON文件中读取数据,并反序列化出Java对象。这在需要从已经存在的JSON文件中读取数据并转换为Java对象的场景下很有用。
      • 示例
        import com.fasterxml.jackson.databind.ObjectMapper;
        import java.io.File;
        public class Main {
            public static void main(String[] args) throws Exception {
                File file = new File("input.json");
                ObjectMapper objectMapper = new ObjectMapper();
                MyObject myObject = objectMapper.readValue(file, MyObject.class);
                System.out.println(myObject.getAge());
            }
        }
        class MyObject {
            private String name;
            private int age;
            public MyObject(String name, int age) {
                this.name = name;
                this.age = age;
            }
            public int getAge() {
                return age;
            }
        }
        
        这个例子从input.json文件中读取JSON数据,将其转换为MyObject类的实例,并输出对象的年龄属性。
  2. 使用注解来控制序列化和反序列化过程
    • @JsonIgnore
      • 功能:用于在序列化(将Java对象转换为JSON)时忽略某个属性。当一个类的属性添加了这个注解后,在生成JSON字符串时,该属性不会被包含在内。
      • 示例
        import com.fasterxml.jackson.annotation.JsonIgnore;
        public class MyObject {
            private String name;
            @JsonIgnore
            private String password;
            public MyObject(String name, String password) {
                this.name = name;
                this.password = password;
            }
            public String getName() {
                return name;
            }
        }
        
        在这个MyObject类中,password属性添加了@JsonIgnore注解。当使用ObjectMapperMyObject对象转换为JSON时,password属性不会出现在JSON字符串中。
    • @JsonProperty
      • 功能:可以改变属性在JSON中的名称。有时候,Java类中的属性名可能不符合JSON数据的命名规范或者业务需求,这个注解就可以用来指定在JSON中的名称。
      • 示例
        import com.fasterxml.jackson.annotation.JsonProperty;
        public class MyObject {
            @JsonProperty("user_name")
            private String name;
            public MyObject(String name) {
                this.name = name;
            }
            public String getName() {
                return name;
            }
        }
        
        在这里,name属性使用@JsonProperty注解指定在JSON中的名称为user_name。当将MyObject对象转换为JSON时,属性名会显示为user_name
  3. 配置ObjectMapper的方法
    • enable(SerializationFeature feature)
      • 功能:用于启用特定的序列化特性。例如,SerializationFeature.INDENT_OUTPUT特性可以使生成的JSON字符串具有缩进格式,更易阅读。
      • 示例
        import com.fasterxml.jackson.databind.ObjectMapper;
        import com.fasterxml.jackson.databind.SerializationFeature;
        public class Main {
            public static void main(String[] args) throws Exception {
                MyObject myObject = new MyObject("John", 30);
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
                String json = objectMapper.writeValueAsString(myObject);
                System.out.println(json);
            }
        }
        class MyObject {
            private String name;
            private int age;
            public MyObject(String name, int age) {
                this.name = name;
                this.age = age;
            }
            // 省略getter和setter方法
        }
        
        这个例子启用了缩进输出的特性,使得生成的JSON字符串会有缩进,看起来更加清晰。
    • disable(DeserializationFeature feature)
      • 功能:用于禁用特定的反序列化特性。例如,在反序列化时,如果想禁止自动将JSON中的空字符串转换为null,可以禁用DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT特性。
      • 示例
        import com.fasterxml.jackson.databind.DeserializationFeature;
        import com.fasterxml.jackson.databind.ObjectMapper;
        public class Main {
            public static void main(String[] args) throws Exception {
                String json = "{\"name\":\"\",\"age\":0}";
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.disable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
                MyObject myObject = objectMapper.readValue(json, MyObject.class);
                System.out.println(myObject.getName());
            }
        }
        class MyObject {
            private String name;
            private int age;
            public MyObject(String name, int age) {
                this.name = name;
                this.age = age;
            }
            public String getName() {
                return name;
            }
        }
        
        这里禁用了相关特性后,空字符串的name属性在反序列化后不会被转换为null

http://www.kler.cn/a/468157.html

相关文章:

  • 数据挖掘教学指南:从基础到应用
  • 10-C语言项目池
  • Linux之信号量
  • MySQL的三大日志
  • 前端(API)学习笔记(CLASS 4):进阶
  • 【CSS】第二天 画盒子、文字控制属性
  • 基于Spring Boot的智能笔记的开发与应用
  • 自动化文件监控与分类压缩:实现高效文件管理
  • 第十一章 图论
  • SSH相关
  • Jmeter进阶篇(32)Jmeter 在 MySQL 数据库压测中的应用
  • Electron不支持 jquery ,angularjs解决办法
  • 游戏引擎学习第73天
  • 在AWS Lambda上部署Python应用:从入门到实战
  • 51单片机——共阴数码管实验
  • 将 Docker 数据迁移到新磁盘:详细操作指南
  • Jenkins 环境安装与配置
  • Linux硬盘分区 --- 挂载分区mount、卸载分区umount、永久挂载
  • 每日一学——自动化工具(Jenkins)
  • 【机器学习实战】kaggle playground最新竞赛,预测贴纸数量--python源码+解析
  • Qt C++ 软件调试内存分析工具Heob(推荐三颗星)
  • 用matlab调用realterm一次性发送16进制数
  • python-leetcode-跳跃游戏
  • python学opencv|读取图像(二十四)使用cv2.putText()绘制文字进阶-倾斜文字
  • Spring MVC 介绍与实践
  • 2025年AI和AR谁才是智能眼镜的未来