KotlinのタイトルはAndroid開発との関連性が高いと主張していますが、実験してみませんか?その助けを借りて、サービスの1つであるAPIのテストの自動化をわずかに簡略化し、プログラミングやJava言語のニュアンスに慣れていないテスターの作業を容易にする方法を見つけました。
何してるの?仲介業者にアンケートを送信し、その計算と決定を行うためのサービスを開発しています。これは銀行のソリューションであるという事実にもかかわらず、開発は小さなスクラムチームによって実行され、プロジェクトの負荷と状況に応じて、1〜2人のスペシャリストがテストに関与します。
カットの下で、私たちが喜んで生産に移した私たちの実験の結果をお知らせします。
顔なし
当社のサービスは、パートナーのインターフェースと統合するために開発され、独自のUIはありません。したがって、この場合、APIを直接テストすることのみが利用可能なオプションです。APIテストには、インターフェースがあっても多くの利点があります。
- サービス開発の段階ですでにテストを開始できます。
- エラーのローカライズを簡素化します。
- 通常、テスト時間を短縮します。
私たちのサービスには、計算のためにクライアントのアンケートのデータを転送し、自動車ローンのソリューションを取得するための一連のAPIが含まれています。次のチェックは、主要な高レベルのテストタスクとして区別できます。
- フィールドとパラメータのフォーマット。
- ステータスコードとエラーメッセージの正確性。
- 必須フィールドとサービスロジック。
重要な瞬間
チームは非常に短い時間でサービスのMVPを準備し、自動テストはもともと製品開発者によって書かれました。プロジェクトに自動テストを含める方が速くて便利だったので、最初はコードに密接に関連し、Javaスタック、REST保証、およびTestNGテストフレームワークに基づいていました。
プロジェクトの発展に伴い、自動化プロセスへのテスターの関与が増大しました。現時点では、自動テストのサポートと更新のタスクは完全にテスト部門にあります。この点で、自動化へのアプローチを調整することが必要になりました。テストをできるだけ単純化し、メインコードから独立させるためです。そして、したがって、発生する困難を解決するには:
- コードとの通信は、テストを設計変更に対してより脆弱にし、パフォーマンスを維持するために多くの労力を必要とします。
- 複雑な関係は、情報を見つけてエラーを調査する時間を増やします。
- テスト部門の新入社員をJavaコードの操作に参加させることは困難であり、テスターのトレーニングとプロジェクトに参加するためにかなりの時間を必要とします。
したがって、テストへのアプローチを変更することを決定し、新しいツールの次の要件を策定しました。
- Javaとの完全な互換性。これにより、古いテストを引き続き使用しながら、チェックを段階的に書き換えることができます。
- シンプルで直感的なコード。
- 自由で安定した言語。
- 別のプロジェクトでの自動テストの選択。
Kotlinはそれとどのような関係がありますか
Kotlin言語は、可能な限り私たちのニーズを満たします。
KotlinでのJavaとの完全な互換性に加えて、次の機能に関心がありました。
- 言語が簡潔であるため、コードが明確で読みやすくなります。
- 構文糖;
- 直感的なコードと専門家のプロジェクトへの簡単な入力。
- 自動テストをJavaからKotlinに段階的かつ簡単に、必要に応じて部分的に転送する機能。
もちろん、特にJavaと比較して、欠点もあります。まず、比較的小さなコミュニティです。Javaの質問に対するヘルプと回答を見つけるのは、Kotlinを使用するよりもはるかに簡単です。第2に、一般的に、Javaはより普遍的な言語であり、より多くの機能と多数の開発とライブラリを備えています。
しかし、率直に言って、テストの目的では、Javaだけが提供できるような広範な機能は必要ありません。したがって、Kotlinのシンプルさと簡潔さを優先しました。
言葉から行為へ
新しい言語に部分的に移行した結果、専門家の人件費が大幅に増加し、コードが大幅に簡素化され、その量が減少しました。これは、証券会社のプロファイルを処理するためのサービスのテストの特定の例で明確に見られます。
Kotlinでは、1行のコードでリクエストオブジェクトを初期化できます。たとえば、ApplicationDTOクラス(ソリューションにアンケートを送信するため)およびErrorDTO(サービスからのエラー)は次のように
なります。Kotlinを使用すると、初期化中にフィールド値を設定できます。これにより、テストの作成時に多くの時間を節約できます。オブジェクトを作成するとき、フィールドには既に有効なデータが入力されており、現在のチェックを参照する値のみを変更します。
JsonIgnorePropertiesアノテーションを使用すると、テストに必要でなく、チェックする必要がない場合、クラス内のすべてのフィールドを指定できません。説明で指定されていないフィールドが受信された場合、テストはエラーで失敗しません。
変数のタイプにある疑問符は、ある時点でそれがnullになる可能性があることを示します。ただし、変数を使用する場合は、これを考慮して処理する必要があります。最後に、Javaテストとは異なり、NullPointerExceptionはここで適切に回避できます。
不正なログインのエラーチェックの簡単な例で説明します。
class ApplicationTests {
val DEFAULT_LOGIN = "consLogin"
val ERROR_CODE = "3"
val BASE_URI = "https://base_url.com"
@Test
fun incorrectLogin() {
val incorrectLogin = DEFAULT_LOGIN + "INCORRECT";
val res = given()
.spec(spec)
.body(ApplicationDTO)
.`when`()
.post(endpointApplication(incorrectLogin)
.then()
.statusCode(400)
.extract().`as`(ErrorDTO::class.java)
assertThat(res.error_message).containsIgnoringCase(" ")
assertThat(res.error_code).isEqualToIgnoringCase(ERROR_CODE)
}
companion object{
private var spec: RequestSpecification? = null
@JvmStatic
@BeforeClass
fun initSpec() {
spec = RequestSpecBuilder()
.setContentType(ContentType.JSON)
.setBaseUri(BASE_URI)
.addFilter(ResponseLoggingFilter())
.addFilter(RequestLoggingFilter())
.build()
}
}
}
BeforeClassでクエリの仕様を作成し、このクラスのすべてのテストで再利用します。ジャクソンはjsonオブジェクトをシリアライズおよびデシリアライズして、物事を簡素化します。これにより、文字列のようにオブジェクトを操作する必要がなくなります。これにより、エラーの数が大幅に削減されます。
Kotlinを使用すると、コードの量が大幅に削減されます。つまり、「ライター」と「リーダー」の両方の生活が楽になります。 ApplicationDTOクラスにはすでにコンストラクターと他のいくつかのメソッド(hashCode()、copy()など)が含まれています。コードを "オーバーロード"する必要はなく、初心者の自動テスト開発者はそれらに気を取られません。変更があった場合に更新する必要がないため、テストの編集時間を短縮できます。
Kotlinが名前付き引数をサポートすることも非常に便利です。コードは非常に読みやすく、jsonオブジェクトクラスのセッターを自分で作成する必要はありません。
新しいものを無料で試す
Kotlinと私たちが使用するすべてのライブラリの開放性と自由性に注目したいと思います。これにより、作業が大幅に簡略化され、新しいアプローチを実験して導入する可能性が広がります。同意します。新しいことを無料で試すのは常に簡単です。失敗した場合は、以前の方法に戻ってください。
将来的には、新しいアプローチを開発して他のプロジェクトに拡大し、残りのAPIとユーザーインターフェーステストをKotlinに翻訳する予定です。
PS: Kotlinは主にAndroid開発に関連しているという事実にもかかわらず、その使用範囲は、ご存知のように、これに限定されません。コードの記述に費やす時間を削減し、その単純さと簡潔さは、多くの問題を解決するための人件費の削減に役立ちます。 Kotlinで新しいケースが発生した場合は、間違いなくそれらについてお知らせします。こちら。