OkHttp接口自动化之断言

文章目录

断言

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

一、编程中的断言

  1. 定义与语法

    • 断言是一种在程序中放置的检查点,用于声明某个条件在程序执行的特定点上应该为真。例如,在Python中,断言的语法是assert关键字后面跟着一个条件表达式。如果条件表达式的值为True,程序继续正常执行;如果为False,程序会抛出一个AssertionError异常。

    • 示例:

      python 复制代码
      x = 5
      assert x > 0
    • 在这个例子中,因为x = 5x>0这个条件为True,所以程序继续正常运行。如果x的值是负数或者0,就会触发AssertionError

  2. 用途

    • 调试辅助 :在开发过程中,断言可以帮助程序员快速定位错误。例如,在一个复杂的函数中,你可以使用断言来检查函数的输入参数是否符合预期。假设你有一个函数用于计算一个数的平方根,你可以断言输入的数是非负数。

      python 复制代码
      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

操作步骤:

  • 引入对应的包
xml 复制代码
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.5</version>
        </dependency>
  • 获取json
java 复制代码
   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获取,然后遍历

实现断言

在原有的基础上断言

java 复制代码
 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字符串。

      • 示例

        java 复制代码
        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文件时非常有用。

      • 示例

        java 复制代码
        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对象。

      • 示例

        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对象的场景下很有用。

      • 示例

        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字符串时,该属性不会被包含在内。

      • 示例

        java 复制代码
        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中的名称。

      • 示例

        java 复制代码
        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字符串具有缩进格式,更易阅读。

      • 示例

        java 复制代码
        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特性。

      • 示例

        java 复制代码
        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

相关推荐
imc.1134 分钟前
linux基础IO
linux·运维·服务器
躺不平的理查德35 分钟前
让Ubuntu 的第二块网卡 ens37 永久固定为 192.168.30.111
运维·服务器
bitbrowser1 小时前
Facebook 验证反复回到原页面,应该从哪里排查
运维·服务器·facebook
Land03291 小时前
AI网页元素变化无法自动修复?自带元素自愈的自动化解决方案
运维·人工智能·ai·自动化·rpa
fengyehongWorld2 小时前
Jenkins 安装与简单配置
运维·jenkins
云智慧AIOps社区2 小时前
2026 国产化 ITSM 替代指南:横向测评 ServiceNow、轻帆云、Jira等五款主流IT服务管理平台
运维·人工智能·运维开发·it服务管理·itsm平台
Urbano2 小时前
针织卫衣全流程生产工序科普:自动化替代、产能优化与设备选型实战方案
运维·自动化
ai_coder_ai2 小时前
在自动化脚本中如何实现播音?
人工智能·自动化·语音识别
AC赳赳老秦3 小时前
招投标公开数据自动化采集实战:基于 OpenClaw 的定时抓取与业务关键词精准推送
运维·服务器·数据库·自动化·测试用例·deepseek·openclaw
小的博客3 小时前
windows下安装Docker Desptop
运维·docker·容器