文章目录
- 断言
- 应用
- 获取json
- 实现断言
- Core
- Jackson常用方法
断言
在编程和逻辑领域中,“断言”(assertion)是一种非常有用的工具。
一、编程中的断言
-
定义与语法
- 断言是一种在程序中放置的检查点,用于声明某个条件在程序执行的特定点上应该为真。例如,在Python中,断言的语法是
assert
关键字后面跟着一个条件表达式。如果条件表达式的值为True
,程序继续正常执行;如果为False
,程序会抛出一个AssertionError
异常。 - 示例:
x = 5 assert x > 0
- 在这个例子中,因为
x = 5
,x>0
这个条件为True
,所以程序继续正常运行。如果x
的值是负数或者0,就会触发AssertionError
。
- 断言是一种在程序中放置的检查点,用于声明某个条件在程序执行的特定点上应该为真。例如,在Python中,断言的语法是
-
用途
- 调试辅助:在开发过程中,断言可以帮助程序员快速定位错误。例如,在一个复杂的函数中,你可以使用断言来检查函数的输入参数是否符合预期。假设你有一个函数用于计算一个数的平方根,你可以断言输入的数是非负数。
def square_root(num):assert num >= 0return num**0.5
- 程序不变量检查:断言还可以用于检查程序运行过程中的不变量。不变量是指在程序的某个特定阶段始终保持为真的条件。比如在一个排序算法中,你可以在每次交换元素后断言数组仍然是部分有序的。
- 调试辅助:在开发过程中,断言可以帮助程序员快速定位错误。例如,在一个复杂的函数中,你可以使用断言来检查函数的输入参数是否符合预期。假设你有一个函数用于计算一个数的平方根,你可以断言输入的数是非负数。
-
注意事项
- 断言不应该用于处理程序正常运行时可能出现的错误情况。因为在一些编程语言(如Python)中,当使用
-O
(优化)选项运行程序时,断言会被自动忽略。所以,对于必须处理的错误,应该使用合适的异常处理机制。
- 断言不应该用于处理程序正常运行时可能出现的错误情况。因为在一些编程语言(如Python)中,当使用
二、逻辑和数学中的断言
-
定义
- 在逻辑和数学领域,断言是一个陈述性的句子,它要么是真的,要么是假的。例如,“三角形的内角和是180度”是一个数学断言,这个断言在欧几里得几何中是正确的。
-
证明与反驳
- 对于数学断言,通常需要通过严格的推理和证明来确定其真假。比如对于上述三角形内角和的断言,可以通过多种几何证明方法来验证,如作平行线利用同位角、内错角等关系来推导。
- 一个断言也可能被反驳。例如,“所有的数都是有理数”这个断言,当发现无理数(如 2 \sqrt{2} 2)的存在时,就被反驳了。
-
在理论体系中的作用
- 断言是构建数学和逻辑理论体系的基础单元。一系列相互关联的断言可以构成定理、公理等。例如,欧几里得几何的五条公理就是最基本的断言,基于这些公理可以推导出众多的几何定理。
应用
获取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\":\"男\"}";// 初始化objectMapperObjectMapper 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字符串// 初始化objectMapperObjectMapper 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常用方法
- 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
类的实例,并输出对象的年龄属性。
- writeValueAsString(Object value)
- 使用注解来控制序列化和反序列化过程
- @JsonIgnore
- 功能:用于在序列化(将Java对象转换为JSON)时忽略某个属性。当一个类的属性添加了这个注解后,在生成JSON字符串时,该属性不会被包含在内。
- 示例:
在这个import com.fasterxml.jackson.annotation.JsonIgnore; public class MyObject {private String name;@JsonIgnoreprivate String password;public MyObject(String name, String password) {this.name = name;this.password = password;}public String getName() {return name;} }
MyObject
类中,password
属性添加了@JsonIgnore
注解。当使用ObjectMapper
将MyObject
对象转换为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
。
- @JsonIgnore
- 配置ObjectMapper的方法
- enable(SerializationFeature feature)
- 功能:用于启用特定的序列化特性。例如,
SerializationFeature.INDENT_OUTPUT
特性可以使生成的JSON字符串具有缩进格式,更易阅读。 - 示例:
这个例子启用了缩进输出的特性,使得生成的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方法 }
- 功能:用于启用特定的序列化特性。例如,
- 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
。
- 功能:用于禁用特定的反序列化特性。例如,在反序列化时,如果想禁止自动将JSON中的空字符串转换为
- enable(SerializationFeature feature)