統合テストをどのように自動化しますか? これらのテストの一部には JUnit を使用しています。これは解決策の1つですか、それとも完全に間違っていますか? 何を指示してるんですか?
10 に答える
私は多くの統合テストを行うために JUnit を使用してきました。もちろん、統合テストはさまざまなことを意味します。より多くのシステム レベルの統合テストについては、スクリプトに外部からテスト プロセスを実行させることを好みます。
これは、http とデータベースを使用するアプリケーションでうまく機能し、スタック全体を検証したいアプローチです。
Hypersonic or H2
データベースの代わりとしてインメモリ モードで使用します (これは ORM に最適です)。- または同等のデータベースを初期化します
@BeforeSuite
(繰り返しますが、ORM を使用すると最も簡単です)。 - Jetty を使用して、インプロセス Web サーバーを起動します。
@Before
各テスト、データベースをクリアし、必要なデータで初期化しますJWebUnit
Jetty に対して HTTP リクエストを実行するために使用します
これにより、データベースやアプリケーション サーバーをセットアップせずに実行でき、http からスタックを実行する統合テストが提供されます。外部リソースに依存していないため、このテストはビルド サーバーで正常に実行されます。
ここで私が使用するコードの一部:
@BeforeClass
public static void startServer() throws Exception {
System.setProperty("hibernate.hbm2ddl.auto", "create");
System.setProperty("hibernate.dialect", "...");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setJdbcUrl("jdbc:hsqldb:mem:mytest");
new org.mortbay.jetty.plus.naming.Resource(
"jdbc/primaryDs", dataSource);
Server server = new Server(0);
WebAppContext webAppContext = new WebAppContext("src/main/webapp", "/");
server.addHandler(webAppContext);
server.start();
webServerPort = server.getConnectors()[0].getLocalPort();
}
// From JWebUnit
private WebTestCase tester = new WebTestCase();
@Before
public void createTestContext() {
tester.getTestContext().setBaseUrl("http://localhost:" + webServerPort + "/");
dao.deleteAll(dao.find(Product.class));
dao.flushChanges();
}
@Test
public void createNewProduct() throws Exception {
String productName = uniqueName("product");
int price = 54222;
tester.beginAt("/products/new.html");
tester.setTextField("productName", productName);
tester.setTextField("price", Integer.toString(price));
tester.submit("Create");
Collection<Product> products = dao.find(Product.class);
assertEquals(1, products.size());
Product product = products.iterator().next();
assertEquals(productName, product.getProductName());
assertEquals(price, product.getPrice());
}
詳細を知りたい方のために、Jetty と JWebUnit を使用した埋め込み統合テストに関する記事を Java.net に書いています。
JUnitは動作します。単体テストのみに制限する制限はありません。JUnit、Maven、CruiseControl を使用して CI を実行します。
統合テスト専用のツールがあるかもしれませんが、それらの有用性は統合するシステム コンポーネントのタイプに依存すると思います。JUnit は、UI 以外のタイプのテストでは問題なく動作します。
Maven を使用してプロジェクトをビルドする場合、 TestNGには多少の運が@BeforeSuite
あり@AfterSuite
ました。いずれかの統合テストが失敗した場合、Maven は「統合後のテスト」を実行しないため、これは便利です。Ant では問題にならないので、好みに合わせて jUnit を使用します。
どちらの場合でも、TestNG と jUnit の両方が行うようにテストを分割することは、統合テストにも役立ちます。
ここでの作業では、統合テスト ソリューションには 3 つの主要な部分があります。
- CruiseControlは、当社の継続的インテグレーション手法の基盤です。
- 私たちの CruiseControl 構成は、誰もがSubversionにチェックインしてから 3 分以内にクイック テスト ビルドを開始します。ここで行われるテストは、「すべてがまだコンパイルされているか?」です。および「単体テストはすべて合格しますか?」。 JUnitは明らかに、2 番目の質問に答える上で主要なファシリテーターです。
- 1 時間ごとに、さまざまな展開プラットフォームで使用するオンライン ヘルプとインストーラーを構築する大規模なビルドが開始されます。このステップでは、「ターゲット プラットフォームごとに展開可能な製品がまだあるか?」というより大きな問題を検証します。
最終的な結果として、ここにいるほとんどの人は統合テストについて心配することはありません。それはただ起こるだけです。一方、単体テストは全員の優先事項です。JUnit を使用するとテストを簡単に作成できますが、優れたテストには常に思考と開発の時間が必要です。
はい、統合テストに junit を使用できますが、必要な統合テストの種類によって異なります。
サーブレットのテスト:
- サーブレットのコンテキストと設定をセットアップする
- モック サーブレット リクエストを使用してテストを実行します (Spring はこれをサポートしていますが、EasyMock または独自のモックを使用することもできます)。
春のアプリケーションのテスト:
- AbstractDependencyInjectionSpringContextTests を使用してコンテキストをセットアップします
- 有線 Bean をテストする
- データベースでのテスト時にトランザクション処理をサポートする AbstractDependencyInjectionSpringContextTests のサブクラスもあります。
しかし、純粋な Junit には限界があります。ユーザー インターフェイスのテストは典型的なケースです。Web アプリケーションには selenium、Web サービスには soapui、またはその他の適切なツールを使用できます。
しかし、何を使用しても、継続的なビルド (クルーズ コントロール、チーム シティなど) に統合できるはずです。
JUnit には、Jitr と呼ばれる非常に優れた拡張機能があります。
Jitr は JUnit 統合テスト ランナーであり、Web アプリケーションの統合テストを、テストと同じ JVM 内の軽量 Web コンテナーに対して簡単に実行できるようにします。
詳細については、 http ://www.jitr.org/ のサイトを参照してください。
自動化と統合テストはうまく連携できないと思います。非常に基本的な問題は、すべてのテストの前に環境をセットアップすることです。統合型のテストほど、より大きなセットアップが必要になります。
統合レイヤーでのテスト自動化に関する私の考え: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/
絶対!JUnit と ANT タスクを組み合わせて実行し、Hudsonを使用して継続的な統合テストを実行します。魅力のように機能します。
2012 年の更新: JUnit を使用できますが (CI サポートの恩恵を受けます)、JWebUnit と Selenium が統合テストのマインドシェアを食い尽くしているようです。
提案は、アプリケーションと目的によって異なります。
私は JUnit で統合テストを作成しましたが、HtmlUnit (JUnit 拡張機能)、Selenium、Watir、Fit/Fitness、さらには WinRunner や Silk などの商用ツールを使用する人も見てきました。
そのため、ドメインとテストの目的についてもう少し詳しく教えてください。おそらくより良い答えが得られるでしょう。