> 文档中心 > Pytest 结合数据驱动-json(八)

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常用方法

  1. json.loads() :是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)
  2. 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)

Pytest 结合数据驱动-json(八)