APIに対するテストに非常に便利になり、それをCIに統合して各コミットを検証したい場合は、Springブーツに含まれていることは間違いなく最良の選択です。
テストケースをすばやく書きます
@runwith(springrunner.class)@springboottest(webenvironment = springboottest.webenvironment.random_port)@ActiveProfiles({profiles.env_it})public class demointegrationTest {@autowied private fooservice; @test public void test(){system.out.println( "Tested"); }}その中で、SpringBoottestが実行するときにいくつかの構成を定義します。上記のコードはランダムポートを使用しますが、もちろん、このような事前定義されたポートも使用できます
@springboottest(webenvironment = springboottest.webenvironment.defined_port、properties = {"server.port = 9990"})ActiveProfilesはITプロファイルの使用を強制します。ベストプラクティスから、ITプロファイルによって構成されたデータベースまたはその他のリソースコンポーネントのアドレスは、開発環境またはステージング環境から分離する必要があります。なぜなら、それが多くの状況を実行する場合、テストデータをクリアする必要があるからです。
そのようなケースは、任意の任意のサービスに自動化された状態で注入できることがわかります。これは、Springがコンテキスト全体をロードするためです。これは、データベース、キャッシュ、その他のコンポーネントなど、実際の実行環境と同じです。テスト中にすべてのリソースを必要としないと感じた場合は、プロファイル内の対応する構成を削除できます。これは完全な動作環境であり、唯一の違いは、ユースケースが完了した後に自動的にシャットダウンすることです。
REST APIをテストします
Gradleに追加するライブラリを強くお勧めします
testcompile 'io.rest-assured:rets-assured:3.0.3'
JsonPathをサポートします。これは非常に便利です。特定のドキュメントについては、ここをクリックしてください
@sql(scripts = "/testdata/users.sql")@testpublic void test001login(){string username =" [email protected] ";文字列password = "demo"; jwtauthenticationrequest request = new JwtauthenticationRequest(username、password); Response Response = fism()。contentType(contentType.json).body(request).when()。post( "/auth/login")。then().statuscode(httpstatus.ok.value()).ectract().response(); assertthat(respons.path( "token")、is(isnull.notnullvalue())); assertthat(respons.path( "expiration")、is(isnull.notnullvalue());} @SQLは、テスト前にSQL挿入テストデータを実行するために使用されます。 given().body()は、javaオブジェクトJwtauthenticationrequestに渡されることに注意してください。休憩所は自動的にジャクソンを使用してオブジェクトをJSON文字列にシリアル化するのに役立つためです。もちろん、変換されたJSONを体に入れることもできます。効果は同じです。
戻り結果は応答によってキャッチされ、その後、データをJSONPATHを使用して検証することができます。もちろん、より直感的な方法があります。これにより、Response.Asstring()を介して完全な応答を取得し、検証のためにJavaオブジェクトに脱出できます。
この時点で、最も基本的なそれが完了します。 Jenkinsにステップグラードテストを追加すると、コードが送信されるたびにテストを実現できます。
いくつかの複雑な状況
混合データ
これが最も簡単なことです。プロジェクトには多くの開発があり、各開発者は独自のITケースを書くので、データ間に影響がある場合はどうなりますか。理解しやすいです。たとえば、テストバッチが書くシナリオでは、最終的な検証方法は、記述されたデータの量が10,000行かどうかを確認することです。その後、別の開発者は他のケースを書き、たまたまこのテーブルに新しいデータを追加しましたが、10W+1行に変わったため、バッチで記述されたケースは逃げられません。
この状況を防ぐために、各テストクラスを使用してデータをクリアします。クラスベースの操作であるため、ベースクラスを作成して解決できます。
@runwith(springrunner.class)@springboottest(webenvironment = springboottest.webenvironment.random_port)@activeProfiles({profiles.env_it})public abstact class baseintegrationtest {private static jdbctemplate jdbctemplate; @autowired public void setdatasource(dataSource dataSource){jdbctemplate = new jdbctemplate(dataSource); } @value( "$ {local.server.port}")保護されたint port; @before public void setupenv(){restasured.port = port; ruptased.basepath = "/api"; ruptased.baseuri = "http:// localhost"; rustasued.config = restasured.config()。httpclient(httpclientconfig.httpclientconfig()。httpmultipartmode(httpmultipartmode.browser_compatible)); } public void teardownenv(){gish()。contentType(contentType.json).when()。post( "/auth/logout"); } @afterclass public static void cleandb()throws sqlexception {resource resource = new ClassPathResource( "/testData/cleandb.sql");接続接続= jdbctemplate.getDataSource()。getConnection(); scriptutils.executesqlscript(connection、resource); connection.close(); }}@AfterClassはJDBCTEMPLATEを使用してCleanDb.sqlを実行します。これにより、この方法ですべてのテストデータがクリアされます。
@ Value("${local.server.port}")も言及する必要があります。ポートがランダムであるため、休憩所ではリクエストがどのポートに送信されるかがわかりません。ここで、@valueを使用して現在のポート番号を取得し、その問題を解決するためにrestased.portに設定します。
共有データの処理方法
完全に実行すると、数十のクラスと数百の方法が必要になる場合があります。では、すべてのケースにいくつかのデータが必要であり、すべてのケースが実行された後にのみクリアする必要がある場合はどうでしょうか?言い換えれば、この種のデータクリーニングはクラスに基づいているのではなく、一度に実行されます。たとえば、初期ユーザーデータ、市図書館など
私たちは巧妙なトリックを演奏し、フライウェイを使用しました
@configuration@conditionalonclass({datasource.class})public class upgradeautoconfiguration {public static final string flyway = "flyway"; @bean(name = flyway)@profile({env_it})public upgradeService cleanandupgradeService(datasource dataSource){upgradeService upgradeService = new flywayupgradeService(dataSource); try {upgradeService.cleanandupgrade(); } catch(Exception ex){logger.error( "フライウェイが失敗!"、ex); }アップグレードサービスを返します。 }}プロファイルがそれである場合、フライウェイはすべてのテーブルをドロップし、アップグレードスクリプトを順番に実行し、それにより完全なデータテーブルを作成することがわかります。これはもちろん空です。プロジェクトのテストパスでは、SQLの巨大なバージョンを追加して、Flywayがsrc/test/resources/db/migration/V999.0.1__Insert_Users.sqlなど、最後に共通のテストデータを挿入できるようにし、さまざまなデータ問題を完全に解決できます。
まとめ
Spring Bootでビルトインテストサービスを使用すると、APIをすばやく確認できます。サービスを開始してから、マニュアルページをクリックしてAPIをテストする必要はありません。フロントエンドの同僚とリクエストフォーマットを直接通信し、ケースを作成して確認します。
もちろん、この方法には不利な点もあります。つまり、システムをストレステストするのは不便です。以前は、同社のAPIテストケースはJmeterによって作成されていましたが、これはパフォーマンステストを行うときにはるかに便利でした。