Pytest 结合数据驱动-json(八)
1、json 的含义
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2、JSON 语法规则
JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。
JSON是一个序列化的对象或数组。
对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, …} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 [“java”, “javascript”, “vb”, …] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
3、JSON 与 JS 对象的关系
很多人搞不清楚 JSON 和 JS 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
4、json结构
(1)表示对象 :{“key”: value}
对象是一个无序的“‘名称/值’对”集合。一个对象以{左括号开始,}右括号结束。每个“名称”后跟一个:冒号;“‘名称/值’ 对”之间使用,逗号分隔。
{"firstName": "Brett", "lastName": "McLaughlin"}
(2)表示数组: [value1, value2 …]
和普通的 JS 数组一样,JSON 表示数组的方式也是使用方括号 []。
{ "people":[ {"firstName": "Brett", "lastName":"McLaughlin" }, { "firstName":"Jason","lastName":"Hunter"}]}
这不难理解。在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,也可以使用不同方式表示同一事物。
如前面所说,除了对象和数组,你也可以简单地使用字符串或者数字等来存储简单的数据,但这样并没有多大意义。
5、json常用方法
- json.loads() :是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)
- json.dump():是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典)
6、实战1
在目录下新建demo.json和get_json_demo.py文件,demo.json如下所示:
{ "name:": "hogwarts ", "detail": { "course": "python", "city": "北京" }, "remark": [1000, 666, 888]}
get_json_demo.py内容如何所示:
# 读取json文件内容def get_json(): with open('demo.json', 'r') as f: data = json.loads(f.read()) print(data)
7、实战2
在目录下新建测试数据demo.json、被测对象operation.py、测试用例test_add,其中params.json 文件内容如下:
{ "case1": [1, 1, 1], "case2": [2, 2, 4], "case3": [3, 3, 9]}
calc.py 文件内容如下:
# perject:test_tmp# name:calc.py# date:2022-4-29def add(x, y): result = x * y return result
test_add.py 文件内容如下:
# perject:test_tmp# name:test_add.py# date:2022-4-29import jsonimport pytestfrom calc import adddef get_json(): """ [[1, 1, 1], [2, 2, 4], [3, 3, 9]] :return: "" with open("demo.json", 'r') as file: data = json.loads(file.read()) return list(data.values())class TestWithJson: @pytest.mark.parametrize('x,y,expected', get_json()) def test_add(self, x, y, expected): value = add(int(x), int(y)) assert value == int(expected)