どのように自動化するのですか 統合テスト ?これらのテストの一部にはJUnitを使用しています。これは解決策の1つですか、それとも完全に間違っていますか?何を指示してるんですか?
JUnitは動作します。単体テストのみに限定する制限はありません。 JUnit、Maven、およびCruiseControlを使用してCIを実行します。
統合テストに固有のツールがあるかもしれませんが、それらの有用性は統合するシステムコンポーネントの種類に依存すると思います。 JUnitは、UIタイプ以外のテストでは問題なく機能します。
多くの統合テストを行うためにJUnitを使用しました。もちろん、統合テストはさまざまなことを意味します。システムレベルの統合テストを増やすには、スクリプトでテストプロセスを外部から実行することをお勧めします。
これは、httpとデータベースを使用するアプリケーションでうまく機能するアプローチです。スタック全体を確認したいと思います。
Hypersonic or H2
を使用します(これはORMに最適です)@BeforeSuite
または同等のものでデータベースを初期化します(ここでもORMを使用すると最も簡単です)@Before
各テスト、データベースをクリアし、必要なデータで初期化JWebUnit
を使用しますこれにより、データベースやアプリケーションサーバーをセットアップせずに実行でき、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());
}
詳細を知りたい方のために、Java.netで JettyとJWebUnitを使用した組み込み統合テストに関する記事 を作成しました。
Mavenを使用してプロジェクトをビルドするとき、 TestNG は @BeforeSuite
および @AfterSuite
操作。統合テストのいずれかが失敗した場合、Mavenは「統合後テスト」を実行しないため、これは便利です。 Antの問題ではないので、私はjUnitを好みではなく使用しています。
どちらの場合も、TestNGとjUnitの両方のようにテストをセグメント化すると、統合テストにも役立ちます。
ここでの作業では、統合テストソリューションには3つの主要な部分があります。
最終的な結果として、ここにいるほとんどの人は統合テストについて心配する必要はありません。一方、単体テストは誰にとっても優先事項です。 JUnitを使用すると、テストを簡単に作成できますが、goodテストには常に思考と開発の時間が必要です。
はい、junitを統合テストに使用できますが、必要な統合テストのタイプによって異なります。
サーブレットのテスト:
Springアプリケーションのテスト:
しかし、純粋なJunitには限界があります。ユーザーインターフェイスのテストは典型的なケースです。ウェブアプリケーションにはSelenium、ウェブサービスにはsoapui、またはその他の適切なツールを使用できます。
しかし、使用するものが何であれ、それを継続的なビルド(クルーズコントロール、チームシティなど)に統合できるはずです。
提案は、アプリケーションと目的によって異なります。
私はJUnitで統合テストを作成しましたが、HtmlUnit(JUnit拡張)、Selenium、Watir、Fit/Fitness、さらにはWinRunnerやSilkなどの商用ツールを使用している人もいます。
したがって、ドメインとテストの目的についてもう少し詳しく教えてください。
2012年の更新:JUnitは使用できますが(CIサポートのメリットもあります)、JWebUnitとSeleniumは統合テストのマインドシェアを消費しているようです。
絶対に! JUnitとANTタスクを組み合わせて実行し、継続的な統合テストには Hudson を使用します。魅力のように機能します。
Jitrと呼ばれるJUnitの非常に優れた拡張機能があります。
JitrはJUnit統合テストランナーであり、テストと同じJVM内の軽量Webコンテナーに対してWebアプリケーション統合テストを簡単に実行できます。
詳細は彼らのサイトを見てください: http://www.jitr.org/
自動化と統合のテストはうまく機能しないと思います。非常に基本的な問題は、すべてのテストの前に環境設定です。より統合型のテストには、より大きなセットアップが必要です。
統合レイヤーでのテストの自動化に関する私の考え: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/