インターフェイス自動テストの効率を向上: JMESPath を使用してアサーションとデータ抽出を実装します。

序文

インターフェイスを自動化する場合、アサーションは不可欠です。アサーションデータをいかに素早く上手に抽出するかが鍵となり、当然ユースケースの作成効率も向上します。筆者も仕事で触ったのですJMESPathが、どうやって使うのでしょう?疑いの目で見下ろす。

JMESPathそれは何ですか?

JMESPath は、JSON データのクエリと変換を行うための簡潔で強力なクエリ言語です。複雑な JSON 構造から必要なデータを抽出する柔軟な方法を提供し、さまざまなクエリのニーズを満たすさまざまな操作と関数をサポートします。

JMESPath使い方?

jmespath JMESPath を使用して JSON データをクエリする前に、ライブラリをインストールする必要があります 。インストールコマンドは以下のとおりです。

pip install jmespath

単純なパス式

次の JSON データがあるとします。

data = {
    "name": "Alice",
    "age": 25,
    "email": "[email protected]"
}

"name"そこから属性の値を抽出したいと考えています。JMESPath を使用すると、次のコードを作成できます。

import jmespath
​
expression = "name"
result = jmespath.search(expression, data)
​
print(result)  # 输出:Alice

ここでは、パス式を定義し、関数"name"を使用してその式をデータに適用します。結果は変数に格納され、 として出力されますjmespath.search()dataresult"Alice"

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

ネストされたプロパティへのアクセス

JSON データが入れ子構造になっている場合、ドットを使用して . 複数の属性名を接続し、深い属性へのアクセスを示すことができます。次の JSON データについて考えてみましょう。

data = {
    "person": {
        "name": "Alice",
        "age": 25,
        "email": "[email protected]"
    }
}

属性を抽出するには"name"、次のパス式を使用できます。

expression = "person.name"
result = jmespath.search(expression, data)
​
print(result)  # 输出:Alice

ここでは、プロパティ名を  ドット "person" で 連結して 、深いプロパティ アクセスを表します。"name".

複雑なネストされたクエリ

次のような、学生の情報とコースの成績を含む、より複雑な JSON データがあるとします。

data = {
    "students": [
        {
            "name": "Alice",
            "courses": [
                {"name": "Math", "score": 95},
                {"name": "English", "score": 88}
            ]
        },
        {
            "name": "Bob",
            "courses": [
                {"name": "Math", "score": 75},
                {"name": "English", "score": 92}
            ]
        }
    ]
}

ここで、各生徒の数学の点数を取得したいとします。これは次の式で実現できます。

expression = "students[].courses[?name == 'Math'].score"

クエリを再度実行し、結果を出力します。

result = jmespath.search(expression, data)
print(result)

出力は、各生徒の数学のスコアを含むリストになります。

[[95], [75]]

リストインデックス

JSON のリスト プロパティの場合、角括弧を使用して [index] データを取得するインデックス位置を指定できます。次の JSON データがあるとします。

data = {
    "fruits": ["apple", "banana", "cherry"]
}

2 番目の要素、すなわち を抽出したいと考えています"banana"次のパス式を使用できます。

expression = "fruits[1]"
result = jmespath.search(expression, data)
​
print(result)  # 输出:banana

ここでは、角括弧を使用して [1] インデックス位置を指定します。これは、2 番目の要素を抽出することを意味します。

フィルター

JMESPath は、特定の条件に基づいて要件を満たすデータをフィルタリングできるフィルタ機能を提供します。フィルターでは、角括弧 [?]の後にフィルター基準を使用します。次の JSON データについて考えてみましょう。

data = {
    "users": [
        {"name": "Alice", "age": 25},
        {"name": "Bob", "age": 30},
        {"name": "Charlie", "age": 28}
    ]
}

25 歳以上のユーザー オブジェクトを抽出したいと考えています。次のパス式を使用してフィルタリングできます。

expression = "users[?age > `25`]"
result = jmespath.search(expression, data)
​
print(result)

出力は次のとおりです。

[    {"name": "Bob", "age": 30},    {"name": "Charlie", "age": 28}]

ここでは、フィルターを使用して、 [?age > 25]条件を満たすユーザー オブジェクトのみを選択します。

マージ操作

JMESPath は、複数のクエリ結果を 1 つのリストにマージするためのマージ演算子もサポートしています []すべての学生のすべてのコース名を取得したいとします。これは、マージ演算子を使用して [] 実現できます。

data = {
    "students": [
        {
            "name": "Alice",
            "courses": [
                {"name": "Math", "score": 95},
                {"name": "English", "score": 88}
            ]
        },
        {
            "name": "Bob",
            "courses": [
                {"name": "Math", "score": 75},
                {"name": "English", "score": 92}
            ]
        }
    ]
}

すべての学生のすべてのコース名を取得します。

expression = "students[].courses[].name"
result = jmespath.search(expression, data)
print(result)

出力は次のとおりです。

['Math', 'English', 'Math', 'English']

並べてスライスする

JMESPath は、クエリ結果の並べ替えとスライスもサポートしています。学生を年齢の降順に並べ替えたいとします。これは、並べ替え関数 sort() と逆順序関数 を使用してreverse() 実現できます。

data = {
    "students": [
        {"name": "Alice", "age": 20},
        {"name": "Bob", "age": 22},
        {"name": "Charlie", "age": 21}
    ]
}

学生のリストを年齢で降順に並べ替えて取得します。

expression = "students | sort_by(@, &age) | reverse(@)"
​
result = jmespath.search(expression, data)
print(result) # [{'name': 'Bob', 'age': 22}, {'name': 'Charlie', 'age': 21}, {'name': 'Alice', 'age': 20}]

スライス

data = {
    "fruits": ["apple", "banana", "cherry"]
}

スライスを使用して最初の要素を取得する

import jmespath
​
data = {
    "fruits": ["apple", "banana", "cherry"]
}
expression = "fruits[0:1]"
result = jmespath.search(expression, data)
​
print(result) # ['apple']

パイプライン

パイプ記号 (|) を使用して、現在のノードの結果をパイプ記号の右側に渡し、投影を続行します。

data = {
    "students": [
        {"name": "Alice", "age": 20},
        {"name": "Bob", "age": 22},
        {"name": "Charlie", "age": 21}
    ]
}

すべての名前を取得します。

expression = "students[*].name"
result = jmespath.search(expression, data)
print(result) # ['Alice', 'Bob', 'Charlie']

this に基づいてこの値を取得したい場合Bobインデックスを使用してみましょう。

expression = "students[*].name[1]"
result = jmespath.search(expression, data)
print(result) # []

実行結果が空のリストになってしまったのですが、この場合どうすればよいでしょうか?パイプ式を使用し、 <expression> | <expression>

expression = "students[*].name | [1]"

組み込み関数

リストの長さを計算する

data = {
    "students": [
        {"name": "Alice", "age": 20},
        {"name": "Bob", "age": 22},
        {"name": "Charlie", "age": 21}
    ]
}
​
expression = "length(students)"  # 也可以这样写expression = "students | length(@)"
result = jmespath.search(expression, data)
print(result) # 3

lengthそれはjmespath組み込み関数です。
もちろん、他にも次のような一般的に使用される組み込み関数がいくつかあります。

  • starts_with(str, prefix): 文字列が指定されたプレフィックスで始まるかどうかを確認します。
  • ends_with(str, suffix): 文字列が指定されたサフィックスで終わるかどうかを確認します。
  • contains(str, substring): 文字列に部分文字列が含まれているかどうかを確認します。
  • length(arr): 配列の長さを返します。

やっと

jmespathこれは確かに非常に強力で、段階的に学習して実践することで、JMESPath の機能と柔軟性をよりよく習得できます。

最後に、私の記事をよく読んでくださった皆様に感謝申し上げます。ファンの増加と注目度を見ると、常に礼儀があります。それほど価値のあるものではありませんが、使用できる場合は直接受け取ることができます!

ソフトウェアテスト面接文書

私たちは高給の仕事を見つけるために勉強しなければなりません。以下の面接の質問は、アリババ、テンセント、バイトなどの一流インターネット企業の最新の面接資料であり、一部のバイトの上司が権威ある回答をしています。面接情報に基づいて、誰もが満足のいく仕事を見つけることができると思います。
 

ここに画像の説明を挿入します

 

おすすめ

転載: blog.csdn.net/myh919/article/details/133183668