web-dev-qa-db-ja.com

自動統合テストにJUNITを使用できますか?

どのように自動化するのですか 統合テスト ?これらのテストの一部にはJUnitを使用しています。これは解決策の1つですか、それとも完全に間違っていますか?何を指示してるんですか?

39
Eduardo Santa

JUnitは動作します。単体テストのみに限定する制限はありません。 JUnit、Maven、およびCruiseControlを使用してCIを実行します。

統合テストに固有のツールがあるかもしれませんが、それらの有用性は統合するシステムコンポーネントの種類に依存すると思います。 JUnitは、UIタイプ以外のテストでは問題なく機能します。

17
Robin

多くの統合テストを行うためにJUnitを使用しました。もちろん、統合テストはさまざまなことを意味します。システムレベルの統合テストを増やすには、スクリプトでテストプロセスを外部から実行することをお勧めします。

これは、httpとデータベースを使用するアプリケーションでうまく機能するアプローチです。スタック全体を確認したいと思います。

  1. データベースの代わりとして、インメモリモードでHypersonic or H2を使用します(これはORMに最適です)
  2. @BeforeSuiteまたは同等のものでデータベースを初期化します(ここでもORMを使用すると最も簡単です)
  3. Jettyを使用して、インプロセスWebサーバーを起動します。
  4. @Before各テスト、データベースをクリアし、必要なデータで初期化
  5. Jettyに対してHTTPリクエストを実行するには、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を使用した組み込み統合テストに関する記事 を作成しました。

44

Mavenを使用してプロジェクトをビルドするとき、 TestNG@BeforeSuite および @AfterSuite 操作。統合テストのいずれかが失敗した場合、Mavenは「統合後テスト」を実行しないため、これは便利です。 Antの問題ではないので、私はjUnitを好みではなく使用しています。

どちらの場合も、TestNGとjUnitの両方のようにテストをセグメント化すると、統合テストにも役立ちます。

5
sblundy

ここでの作業では、統合テストソリューションには3つの主要な部分があります。

  1. CruiseControl は、継続的な統合方法論の基礎です。
  2. 私たちのCruiseControl構成は、誰かが Subversion にチェックインしてから3分以内にクイックテストビルドを開始します。ここで行われるテストは、「すべてがまだコンパイルされているか」です。そして「ユニットテストはまだすべて合格していますか?」 JUnit は2番目の質問に答える際の主なファシリテーターです。
  3. 毎時間、さまざまな展開プラットフォームで使用するオンラインヘルプとインストーラーを構築する大規模なビルドが開始されます。このステップでは、「ターゲットプラットフォームごとに展開可能な製品がまだあるか」というより大きな質問を検証します。

最終的な結果として、ここにいるほとんどの人は統合テストについて心配する必要はありません。一方、単体テストは誰にとっても優先事項です。 JUnitを使用すると、テストを簡単に作成できますが、goodテストには常に思考と開発の時間が必要です。

2
Bob Cross

はい、junitを統合テストに使用できますが、必要な統合テストのタイプによって異なります。

サーブレットのテスト:

  • サーブレットのコンテキストと構成を設定する
  • モックサーブレットリクエストを使用してテストを実行します(Springはこれをサポートしていますが、EasyMockまたは独自のモックを使用することもできます)

Springアプリケーションのテスト:

  • abstractDependencyInjectionSpringContextTestsを使用してコンテキストをセットアップする
  • ワイヤードBeanをテストする
  • データベースでテストするときにトランザクション処理をサポートするAbstractDependencyInjectionSpringContextTestsのサブクラスもあります。

しかし、純粋なJunitには限界があります。ユーザーインターフェイスのテストは典型的なケースです。ウェブアプリケーションにはSelenium、ウェブサービスにはsoapui、またはその他の適切なツールを使用できます。

しかし、使用するものが何であれ、それを継続的なビルド(クルーズコントロール、チームシティなど)に統合できるはずです。

1
Arne Burmeister

提案は、アプリケーションと目的によって異なります。

私はJUnitで統合テストを作成しましたが、HtmlUnit(JUnit拡張)、Selenium、Watir、Fit/Fitness、さらにはWinRunnerやSilkなどの商用ツールを使用している人もいます。

したがって、ドメインとテストの目的についてもう少し詳しく教えてください。

0

2012年の更新:JUnitは使用できますが(CIサポートのメリットもあります)、JWebUnitとSeleniumは統合テストのマインドシェアを消費しているようです。

0
8bitjunkie

絶対に! JUnitとANTタスクを組み合わせて実行し、継続的な統合テストには Hudson を使用します。魅力のように機能します。

0
eishay

Jitrと呼ばれるJUnitの非常に優れた拡張機能があります。

JitrはJUnit統合テストランナーであり、テストと同じJVM内の軽量Webコンテナーに対してWebアプリケーション統合テストを簡単に実行できます。

詳細は彼らのサイトを見てください: http://www.jitr.org/

0
uthark

自動化と統合のテストはうまく機能しないと思います。非常に基本的な問題は、すべてのテストの前に環境設定です。より統合型のテストには、より大きなセットアップが必要です。

統合レイヤーでのテストの自動化に関する私の考え: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/

0
Dariusz Cieslak