技術共有

自動化 (第 2 レベル)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Javaインターフェースの自動化に使用されるテクノロジースタック

テクノロジースタックの概要:
①Javaの基礎(カプセル化、リフレクション、ジェネリックス、jdbc)
②設定ファイル解析(プロパティ)
③httpclient(httpリクエストを送信)
④Fastjsonとjsonpathの処理データ
⑤自動テストフレームワークのテストのポイント
⑥魅力テストレポート

最初のカテゴリ: http リクエスト関連 (fastjson、jsonpath、httpclient)

準備する

Maven プロジェクトを作成する

①まずMavenプロジェクトを作成します。 newPROJECT–Maven–groupid----finish

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

②Mavenの設定を再度確認する

ファイル - 設定 - Maven
ここに画像の説明を挿入します

Fastjson と jsonpath は両方ともデータの処理に使用されます。
テスト自動化フレームワークの焦点。
アリュールテストレポート

1. fastjson (アプリケーション シナリオ: json 文字列と入力パラメーターの文字列配列の解析)

fastjson は json 文字列と json 配列を処理します
json 文字列入力パラメータを解析し、後続のリクエストに備える

①依存

<!-https://mvnrepository.com/artifact/com.alibaba/fastjson -->
アリババ
ファスティソン
1.2.75

②依存関係を追加すると依存関係が自動生成されます

ここに画像の説明を挿入します
ダウンロード後、自動生成された依存関係パッケージを確認できます。

1.1. 例 (JSON 文字列入力パラメーター、JSON 文字列配列入力パラメーターを解析)

1.1.1. json 文字列入力パラメータを解析する

たとえば、ログインにはユーザー名とパスワードが必要です。
{“ユーザー名”:“qzcsbj”, “パスワード”:“123456”}

オートメーション フレームワーク データ ソース、入力パラメーターはすべて json 文字列、fastjson を使用する必要があります

ステップ 1: パッケージ名、クラス名を作成し、main メソッドを作成する

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

ステップ 2: 文字列変数を定義します。これは解析する必要がある JSON 文字列です。
ステップ 3: json 文字列を処理するには、まず jsonObject オブジェクトに解析してから、それを Map に置きます。
1)まずHashMapを作成します、キーと値は両方とも文字列です

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

2) 文字列を解析します。ここでは JSONObjetct.parseObject が使用され、戻り値は JSONObject 型になります。

Class.Method、このメソッドは静的です

3) キーを取得するには、jsonObjetc.keySet メソッドを直接使用します。つまり、Set コレクションを取得します。

コレクション内の各キーは文字列です

4) 再度トラバースし、トラバースしたキーを通じて値を取得し、キーと値をマップに入力します。

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

現在定義されている json 文字列が解析され、マップに配置されました。
ここに画像の説明を挿入します

5) マップに配置されたコンテンツを検証し、マップ内のキーを取得します

JSON文字列の内容をマップに入れる手順
ブログ (blog.csdnimg.cn/direct/ae6feeba2eae442f961df977a6c8eac1.jpeg)

1.1.2. json 文字列配列入力パラメータを解析する

自動化フレームワークには初期化フレームワークが含まれており、一部のフレームワークでは内部のデータに対する操作が必要になります。データベースを操作するにはSQLを書く必要があります
これは json 配列です。配列内の各要素はキー値データを含む json 文字列です。最初の要素は SQL 番号、つまり実際に実行された SQL です。

[{“sqlNo”:“1”,“sq!”:“select * from users where username='qzcsbj';”},.“sqlNo”:“2”,“sql”:“select * from users where username='test00501';”}]

ステップ 1: パッケージ名、クラス名を作成し、main メソッドを作成する
ステップ 2: 文字列変数を定義します。これは解析する必要がある JSON 文字列配列です。
方法 1 (推奨されません): 文字列 JSONObjetct.parseArray(String text) を解析します。戻り値は JSONArray です。
1) 文字列を解析します。ここでは JSONObjetct.parseArray が使用されます。

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

2) 直接トラバーサル。各要素は Object 型で、2 つの JSON 文字も出力されます。

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

3) json 文字列の SQL 値を出力します。ここには get メソッドや set メソッドはありません。json 文字列のみを取得できますが、特定のキーの内容は取得できません。

ここに画像の説明を挿入します
この方法はお勧めできません

メソッド 2: JSONObjetct.parseArray(String text, Class clazz)、戻り値は List &lt; T &gt;、戻り値の型は List、戻り値の要素は HashMap

2 つのパラメータを渡します。最初のパラメータは解析する文字列、2 番目のパラメータはバイトコード ファイルです。
解決策は、最初のパラメータ文字列を解析してマップに変換することです。

1) 各要素をハッシュマップ オブジェクトにカプセル化します。ここでは、文字列配列を解析するために JSONObjetct.parseArray(String text, Class clazz) が使用されます。
2) sqlNo を取得します。sql は HashMap 型です。get メソッドを使用できます。

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

3) ここで取得されるキー値または型はありません。ここで必要なのは String であり、ここでは強制的に変換することができ、親クラスの参照は子クラスのオブジェクトを指します。
4) つまり、sqlのjson文字列の各キーに対応する値を取得します。

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

5) この方法では不十分です。json 文字列内のキーをここに表示する必要があり、たくさんあると面倒になります。
 String sqlNo = (String)sql.get("sqlNo");
  • 1
方法 3: 方法 2 の⑤の欠点を解決するために使用され、通常はカプセル化を使用します。

各 json 文字列の内容をオブジェクト l にカプセル化し、エンティティ クラスに get メソッドと set メソッドを追加して、直接 object.get し、SQL の内容を取得します。この種のコード プロンプトも作成するのに便利です。自動化もこのカプセル化を参照します。つまり SQL をオブジェクトにカプセル化することです。
プロパティをプライベート (sqlNo、sql) としてカプセル化し、get メソッドと set メソッド、パラメータ化された構築メソッド、およびパラメータなしの構築メソッドを追加する必要があり、リフレクションによってパラメータなしの構築メソッドが調整されます。パラメーターなしのコンストラクターを書かずにパラメーターなしのコンストラクターのみを書いた場合、文字列の結果を出力するには、toString() メソッドを追加する必要があります。追加しないと、オブジェクトのアドレスが出力されます。上記のエンティティクラスが記述されました。

再度最適化します
要素がオブジェクトにカプセル化されている場合は、自分で作成したクラスに変更されます。class
それがsql.classです

1) SQL Javabean を定義します。SQL クラスには属性 sqlNo、sql があり、次に get、set メソッド、構築メソッド、および toString() メソッドを追加します。

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

2) 各 json 文字列を SQL オブジェクト (Test02)、JSONObjetct.parseArray(String text, Class clazz) にカプセル化します。戻り値は List &lt; T &gt;、戻り値の型は List、戻り値の要素は SQL オブジェクトです。

上記の 2 番目の方法は、各要素を hashMap オブジェクトにカプセル化するもので、ここでは各要素を SQL オブジェクトにカプセル化します。
ここに画像の説明を挿入します

3) トラバース

get メソッドを使用してオブジェクトから属性を直接取得します。

ここに画像の説明を挿入します
この方法はより便利であり、多くのキーを取得する必要がありません。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>mavenProject</groupId>
    <artifactId>mavenProject</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>


        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

    </dependencies>

</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

SQLクラス

package com.zhou.demo;

public class Sql {
    private String sql;
    private String sqlNo;

    public Sql() {
    }

    public Sql(String sql) {
        this.sql = sql;
    }


    public Sql(String sql, String sqlNo) {
        this.sql = sql;
        this.sqlNo = sqlNo;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

    public void setSqlNo(String sqlNo) {
        this.sqlNo = sqlNo;
    }

    public String getSql() {
        return sql;
    }

    public String getSqlNo() {
        return sqlNo;
    }

    @Override
    public String toString() {
        return "sql{" +
                "sql='" + sql + ''' +
                ", sqlNo='" + sqlNo + ''' +
                '}';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
package com.zhou.demo;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Set;
//需求:将json字符串转化成map,字符串:{"username":"qzcsbj", "password":"123456"}

public class Test {
    public static void main(String[] args) {
        String parameters="{"username":"qzcsbj", "password":"123456"}";
        //先解析为JSONObject,然后转换为map
        HashMap<String, String> map = new HashMap<String, String>();

        // 解析json格式字符串为JSONObject(JSONObject是Map接口的一个实现类,和HashMap平级)

        JSONObject jsonObject = JSONObject.parseObject(parameters);
        // 将JSO\\\ NObject转换为map,先获取keys,先将keyset获取,集合里的每一个key都是String,通过遍历的key获取value,再放到map中
        Set<String> keys= jsonObject.keySet();
        for (String key:keys) {
            map.put(key,jsonObject.getString(key));

        }

        //验证,获取Map中的key
        Set<String> keys2 = map.keySet();
        for (String key :keys2) {
            System.out.println(key+"="+map.get(key));
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
package com.zhou.demo;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.List;


//JSON数组,每个元素是json字符串
public class Test02 {

    public static void main(String[] args) {
        String initsql="[n" + "{"sqlNo":"1","sql":"select * from  users where  username='qzcsbj';"},n" +
                "{"sqlNo":"2","sql":"select * from  users where  username='tester00501';"}n" + "n" + "]";
  /*   //元素解析为Map
        List<HashMap> sqls = JSONObject.parseArray(initsql,HashMap.class);
        for (HashMap sql:sqls) {
            System.out.println(sql);
            String sqlNo = (String)sql.get("sqlNo");
            String sql_ = (String)sql.get("sql");
            System.out.println("sqlNo-"+sqlNo+",sql_-"+sql_);
        }*/



  //元素封装到对象
        List<Sql> sqls = JSONObject.parseArray(initsql, Sql.class);

        for (Sql sql:sqls) {
            String sqlNo = sql.getSqlNo();
            String sql_ = sql.getSql();
            System.out.println("sqlNo-"+",sql_"+sql_);

        }

    }


    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

2. jsonpath (アプリケーション シナリオ: 取得する関連する値などのアサーション フィールドの取得など、応答 json データの解析)

現在、プロジェクトはフロントエンドとバックエンドに分離されているためです。
バックエンドは通常、json 文字列を返します。
アサーションを行う場合は、通常、json を解析します。解析後は、キー フィールドに対してのみアサーションを行います。
アサーションは通常、コード + 主要なビジネス フィールドです
これはjson文字列なので、jsonpathを使用する必要があります

①依存

②依存関係を追加すると依存関係が自動生成されます

(blog.csdnimg.cn/5bdd9defd7db47b7a5934f79f9fd0ceb.png) 翻訳:
ここに画像の説明を挿入します
依存関係がダウンロードされたかどうかを確認する必要がある

2.1. 例 (応答データでアサートされる主要なビジネス フィールドを取得する)

2.1.1. 応答データでアサートされる主要なビジネス フィールドを取得する
ステップ 1: クラス名を作成し、main メソッドを作成し、文字列変数を定義する

ここでのこの変数は、ログインに成功した後に返される応答フィールドです。
(blog.csdnimg.cn/a20e89ee243c43f69a1b4e1c3a97b89b.png) 翻訳:

ステップ 2: アサーションを行うには、Configuration.defaultConfiguration.jsonProvider().parse() が使用され、戻り値は Object 型になります。

ここに画像の説明を挿入します
定義されたフィールド応答を渡します

ステップ 3: メソッド JsonPath.read(Object json, String jsonpath, predicate...filters) を使用します。戻り値の型は Object 型です

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

依存データを処理するためのインターフェイスの自動化
この行の先頭からトークンを取得します。これも $ です。
取得後、グローバル変数であればグローバル変数に保存できます。
アサーションを取得してから取得したい場合
別の主張をする

3. httpclient (コードを記述してリクエストを送信)

オートメーション フレームワークでは、コードを記述することによってリクエストが送信されます。つまり、サーバーと対話するために Java が提供するライブラリである httpclient を使用する必要があります。

①依存

②依存関係を追加すると依存関係が自動生成されます

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

3.1. 例 (リクエストの取得、リクエストの送信)

3.1.1. リクエストの取得
準備作業: Swagger インターフェイス ドキュメントのリクエスト インターフェイスが渡されているかどうかを確認し、インターフェイス ドキュメントを参照して、渡す必要がある get リクエストの findById と ID を確認します。

IDを渡す必要があります
ここに画像の説明を挿入します
ライブラリから、ID が 259 であることがわかります。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

ステップ 1: クラス名 Test04 を作成し、main メソッドを作成する
ステップ 2: インターフェースのアドレス変数 url とリクエスト・パラメーターを定義します。

ここに画像の説明を挿入します
データ ファイルでは、パラメーターはすべて json 文字列に連結されるため、id=259 も json 文字列に連結されます。

ここでは、259 を二重引用符で囲んで自動的にエスケープします。
ここに画像の説明を挿入します

ステップ 3: json 文字列を解析し、JSONObject.parseObject() メソッドを使用します。戻り値の型は JSONObject 型です。

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

ステップ 4: 静的メソッド getRequest(String url, JSONObject jsonobject) を定義する

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

ステップ 5: 次に、メイン メソッドで getRquest() を呼び出します。戻り値は String 型です。

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

ステップ 6: getRequest() メソッドのロジックを改善する

リクエストの取得: http://47.108.153.47:18089/qzcsbj/user/findById?id=259
?後でパラメータを直接結合する
考慮すべき値も複数あります: http://47.108.153.47:18089/qzcsbj/user/findById?id=259&name=jack

1) jsonobect.keySet() を通じてキーを取得し、Set コレクションを取得します

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

2) Set コレクションを走査し、キー値を取得します。

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

3) 複数の値の場合も考慮する必要があります。つまり、flag = true を定義し、最初に true を書き込み、最初の値になります。

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

4) それ以外の場合は、次のように書きます

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

5) res 空文字列を定義し、res を返す

ここに画像の説明を挿入します
上記はパラメータ URL と get リクエストを送信するためのパラメータを連結します。作成後、get リクエスト オブジェクトを作成する必要があります。

6) httpget リクエスト オブジェクトを作成し、新しい HttpGet (org.apache.http.client.methods) でこのコンストラクターを選択します。

URLを渡します
ここで httpget リクエスト オブジェクトを取得します
ここに画像の説明を挿入します

7) HttpClients.createDefault() メソッドを使用して httpclient クライアントを作成します。戻り値の型は CloseableHttpClient です。

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

CloseableHttpClient 抽象クラスは、HttpClient、Closeable インターフェイスを実装します。
ここに画像の説明を挿入します
ポリモーフィズムを使用でき、サブクラス オブジェクトは親クラス参照 (親クラスによって実装されたインターフェイス) を指します。
ここに画像の説明を挿入します

8) リクエストのexecute()メソッドを実行し、httpgetオブジェクトを渡し、例外をスローします。

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

9) HttpResponse オブジェクトを取得した後、その getEntity メソッドを呼び出して、EntityUtils.toString メソッドを取得した後の戻り値の型は String 型になります。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
結果の res は上で定義されています
今すぐ
ここに画像の説明を挿入します

10) 走る

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

3.1.2. リクエストの投稿
準備作業:Swaggerインターフェースドキュメントのリクエストインターフェースが通るか確認する

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

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

ステップ 1: クラス名 Test05 を作成し、main メソッドを作成する

http://47.108.153.47:18089/qzcsbj/ユーザー/ログイン
URL、リクエストパラメータパラメータ、リクエストヘッダー

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

ステップ 2: インターフェイスのアドレス変数 URL、リクエスト パラメータ、リクエスト ヘッダーを定義します。

これらのパラメーターは、自動化フレームワークのデータ ファイルから取得されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

ステップ 3: JSONObject.parseObject() メソッドを使用して、JSON 文字列パラとヘッダーを解析します。戻り値は JSONObject 型です。
ステップ 4: 投稿リクエストを送信するメソッドを定義し、ロジックを改善して、ヘッダー、URL、パラメーターを渡します。

解像度を定義する
応答を返す

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

1) jsonobetct.keySet() を通じてキーを取得し、Set コレクションを取得し、キーを走査してキーを取得します。

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

2) httppost オブジェクトを通じて addHeader() メソッドを呼び出し、戻り値の型が HttPost である場合は、最初に httpppost オブジェクトを作成する必要があります。

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

3) httppost オブジェクトを通じて addHeader() メソッドを呼び出します。

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

4) httpEntity は必須ですが、httpEntity はインターフェイスです。インターフェイス httpEntity を実装するには、クラス StringEntity を実装する必要があります。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
コンストラクターを見ると、String を渡して 2 番目のコンストラクターを指定できます。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
上記は送信されたポストリクエストです。リクエストヘッダーと送信されるデータはすべて定義されています。

5) HttpClients.createDefault() メソッドを使用して httpclient クライアントを作成します。戻り値の型は CloseableHttpClient です。

サブクラスオブジェクトが親クラス参照を指す
ここに画像の説明を挿入します

6) リクエストを送信し、リクエストのexecute()メソッドを実行し、httppostオブジェクトを渡して、例外をスローします。

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

7)) HttpResponse オブジェクトを取得した後、その getEntity メソッドを呼び出して Httpentity 応答オブジェクトを取得できます。 EntityUtils.toString メソッドを取得した後、戻り値の型は String 型になります。

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

8) main メソッドで定義したばかりのメソッドを呼び出します

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

9) 走る

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