テストデータ生成のために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
:RandomStringUtils.randomNumeric()
生成するメソッドint
価値、そして、それを作るために、我々はString
をintにするInteger.valueOf()
RandomStringUtils.randomAlphanumeric()
英数字データを生成する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
クラスはnumber()
乱数を生成するためにname()
メソッドを使用してフルネームを生成するcompany()
職業を生成するために使用されているfinance()
メソッドは、オランダの国のために有効なIBANを生成するのに用いられますaddress()
メソッドは、完全なストリートアドレスを生成するために使用されますhoneNumber()
メソッドは、携帯電話番号を生成するために使用されます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 異なる条件で必要なデータをすべて生成するクラスです.それは良い現実世界の例です.
Reference
この問題について(テストデータ生成のためにRandomStringutilsを避ける理由), 我々は、より多くの情報をここで見つけました https://dev.to/eliasnogueira/reasons-to-avoid-randomstringutils-for-test-data-generation-opeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol