テストデータ生成のためにRandomStringutilsを避ける理由



どの問題を解決したいですか?
我々は、任意のレベルでテストで使用される最悪の実践のいずれかを解決しようとします:固定/ハードコード化されたデータ.
私は私のテストを実行する前に、任意のマニュアルの前動作を避けるためにしたいと私は、静的なファイルの使用(CSV、TXT、XLS、JSON)同様に避けるためにしようとします.
ここでは、Java開発者からの一般的な使用法が見られますRamdomStringUItils そして、それは自動データ生成のための最良の選択ではないかもしれません.
ところで、テストデータファクトリーアプローチを使ったテストで自動データ生成を勧めます.Test Data Factory: Why and How to Use .
ここで説明されている例はテストデータファクトリの使用なしで簡単です、そして、なぜあなたはRandomStringUtils 最良のアプローチではないかもしれません.


顧客オブジェクトにデータを自動的に生成します.
属性
種類
制約
ID
int
NULLでない
名称
文字列
2でない文字と50文字の間のサイズ
職業
文字列
NULLでなく、2文字から30文字までのサイズ
会計係
文字列
NULLではなく、18文字としてのサイズ
アドレス
文字列
2でない文字と50文字の間のサイズ
音素
文字列
11文字と14文字の間にNULLでない
誕生日
日付
NULLでない
テストの数を減らすために、キーポイントは制約を与えられた有効なデータを生成することです.プロの環境では、エッジケースのテストも実装します.
任意のテストレベル(単位、統合、サービス、UI)で使用されるオブジェクトとして、この顧客データを考える.

RandomStringUtilsクラスは何をしますか?
RandomStringUtils からのクラスですApache Commons Lang 異なる条件に基づいてランダムな文字列を生成するライブラリ
  • 長さ
  • 手紙
  • 英数字
  • アスキー
  • 数値
  • プリント
  • それはあなたが直接任意の文字列を生成することができる静的なクラスですので、それは超便利です!
    ランダムデータの異なるセットを生成できる例を次に示します.
    public class RandomStringUtilsExample {
    
        public static void main(String[] args) {
            // returns a String with 5 numbers
            // example 82114
            RandomStringUtils.randomNumeric(5);
    
            // returns an alphanumeric String with length as 30 mixing upper and lower cases
            // example gQ6RB8MiwKOg9O3qnHFo7I3jilHoIy
            RandomStringUtils.randomAlphanumeric(30);
        }
    }
    

    RandranstringUtilsクラスを使用した結果は何ですか?
    まず、使用例を実装するコード例を見てみましょうRamdonStringUtils :
  • 7行目はRandomStringUtils.randomNumeric() 生成するメソッドint 価値、そして、それを作るために、我々はString をintにするInteger.valueOf()
  • 8行目から12行目はRandomStringUtils.randomAlphanumeric() 英数字データを生成する
  • 13行目は現在の固定日ですRandomStringUtils 生成のみStrings
  • class BasicExampleTest {
    
        @Test
        @DisplayName("Data validations using RandomStringUtils")
        void randomStringUtils() {
            CustomerData customerData = CustomerData.builder().
                    id(Integer.valueOf(RandomStringUtils.randomNumeric(10))).
                    name(RandomStringUtils.randomNumeric(50)).
                    profession(RandomStringUtils.randomAlphanumeric(30)).
                    accountNumber(RandomStringUtils.randomAlphanumeric(18)).
                    address(RandomStringUtils.randomAlphanumeric(50)).
                    phoneNumber(RandomStringUtils.randomAlphanumeric(14)).
                    birthday(new Date()).
                    build();
        }
    }
    
    テスト実行の出力.customerData オブジェクトは以下の通りです:
    {
      "id": 1335130963,
      "name": "GGXS19kN6kSuzHwW6T0YjJCxUaIyKKmAaUdQH51gdUAtt1TwqY",
      "profession": "0kk8HSiFgCUVfLzbD3PyR6cn8j0LH3",
      "accountNumber": "PqvekXb9ekRAJi3ypy",
      "address": "90lqP2LHnQMWtmMP8vasO3BR5dsICIL85u5sJ0yjGKWXxCkFsj",
      "phoneNumber": "OpoJ3tOE53woy9",
      "birthday": "Sep 26, 2021, 10:01:10 PM"
    }
    
    必要なデータを生成することができました.ああ!

    JavaFakerは何をしますか?
    [ javafaker ]https://github.com/DiUS/java-faker ) オープンソースライブラリFaker 偽データを生成する.
    アバターや友人などのようなナンセンスなデータの生成があります.しかし、我々の必需品に合う特定の条件でデータを生成することができる良いセットのオブジェクトもあります.
    私はあなたにgithubレポを見て、データを生成するために別のオブジェクトを参照してくださいを招待します.

    JavaFakerを使用した結果は?
    を使用してデータを生成するコード実装CustomerData クラスは
  • 第9行ではnumber() 乱数を生成するために
  • 10行目name() メソッドを使用してフルネームを生成する
  • 第11行ではcompany() 職業を生成するために使用されている
  • ライン12でfinance() メソッドは、オランダの国のために有効なIBANを生成するのに用いられます
  • ライン13でaddress() メソッドは、完全なストリートアドレスを生成するために使用されます
  • ライン14では、PhoneNumber() メソッドは、携帯電話番号を生成するために使用されます
  • ライン15でdate() メソッドは、18歳から90歳までの誕生日データを生成するために使用されます
  • class BasicExampleTest {
    
        @Test
        @DisplayName("Data validations using faker library")
        void faker() {
            Faker faker = new Faker();
    
            CustomerData customerData = CustomerData.builder().
                    id((int) faker.number().randomNumber()).
                    name(faker.name().name()).
                    profession(faker.company().profession()).
                    accountNumber(faker.finance().iban("NL")).
                    address(faker.address().streetAddress()).
                    phoneNumber(faker.phoneNumber().cellPhone()).
                    birthday(faker.date().birthday(18, 90)).
                    build();
        }
    }
    
    テスト実行の出力.customerData オブジェクトは以下の通りです:
    
    {
      "id": 520543,
      "name": "Tena Pagac",
      "profession": "photographer",
      "accountNumber": "NL07HUUN1518167413",
      "address": "12672 Romaguera Tunnel",
      "phoneNumber": "(561) 638-5813",
      "birthday": "Mar 5, 1982, 10:29:18 AM"
    }
    
    必要なデータを生成することができました.しかし、違いに集中しましょう.

    両手法の比較
    つのアプローチの間で選択することを考えたいと思います.
  • 将来のトラブルシューティングの可読性(ログ解析)
  • 異なる基準で簡単なデータの作成
  • データの結果側を比較する主な違いを見ることができます(画像をクリックして展開します).


    将来のトラブルシューティングの可読性(解析)
    コードを書くエンジニアのための定期的な活動はトラブルシューティングです.私たちは常にログを見て、アプリケーションの現在の、そして、将来の問題を理解するためにアプリケーションをデバッグします.
    ここで、MarialStringutilsアプローチでデータが満たされたCustomerDataオブジェクトを自分で見ていることを想像してみてください.ログファイル内で使用されるデータを取得するか、または取得するオブジェクトのリストを持つデータを関連付けるのは難しいです.

    異なる基準で簡単なデータの作成
    属性のほとんどはCustomerData クラスを使用するRandomStringUtils を指定します.たとえば、簡単にName属性に51文字を設定することができますRandomStringUtils.randomAlphanumeric(51);より専門的なデータについては、電話番号と日付のように、適切なライブラリを必要とJavaFakerの両方のデータを生成することができます.
    このようにして、1つのライブラリを採用することでプロセスを容易にすることができる.

    考慮
    もちろん、JavaScriptライブラリをもっと強調しています.なぜなら、データを生成するために必要なほとんど全てのものがあるからです.しかし、Apache Commonsライブラリに配置されているrandom Stringutilsクラスや他のクラスを使用する必要性は除外しません.
    ここでの主な考慮は、あなたがホイールを再発明せずに真実の単一のソースを使用して必要なすべてのデータを生成する能力だけでなく、それはトラブルシューティングのプロセス中に表示される間接的な利点です.


    The avoid-random-string-utils プロジェクトは、RandomStringutils対JavaFakerを比較する基本的な例を示します.
    The restassured-complete-basic-example プロジェクトはfactory data 異なる条件で必要なデータをすべて生成するクラスです.それは良い現実世界の例です.