Arquillianによるテスト入門

1概要

Arquillian は、Java EE用のコンテナに依存しない統合テストフレームワークです。 Arquillianを使用すると、コンテナー、デプロイメント、フレームワークの初期化などを管理する負担が最小限になります。

テスト環境のブートストラップではなく、実際のテストを書くことに集中できます。

** 2コアコンセプト

**

2.1. 展開アーカイブ

コンテナ内で実行しているときにアプリケーションをテストする簡単な方法があります。

まず、 ShrinkWrap クラスはデプロイ可能な 。jar、 。war、 、および ** 。ear ファイルを作成するためのAPIを提供します。

それから、Arquillianは ShrinkWrap オブジェクトを返すメソッドで @ Deployment アノテーションを使ってテストデプロイを設定することを可能にします。

2.2. コンテナ

Arquillianは3種類のコンテナを区別しています。

  • リモート - JMXのようなリモートプロトコルを使用してテスト済み

  • 管理対象 - リモートコンテナだがそのライフサイクルは

Arquillian ** Embedded - localを使ってテストが行​​われるローカルコンテナ

プロトコル

また、コンテナを機能別に分類することもできます。

  • GlassfishのようなアプリケーションサーバーにデプロイされたJava EEアプリケーション

またはJBoss TomcatまたはJettyにデプロイされたサーブレットコンテナ

  • 独立型コンテナ

  • OSGIコンテナー

実行時クラスパスを調べ、自動的に利用可能なコンテナを選択します。

2.3. テスト強化

Arquillianは、例えば以下を提供することによってテストを強化します。テストを簡単に書くことができるように依存性注入。

@ Inject を使用して依存関係を注入し、 @ Resource を使用してリソースを注入し、__ @ EJBを使用してEJBセッションBeanなどを注入できます

2.4. 複数のテストランナー

アノテーションを使用して複数のデプロイメントを作成できます。

@Deployment(name="myname" order = 1)

nameがデプロイメントファイルの名前、orderパラメータがデプロイメントの実行順序であるため、アノテーションを使用して複数のデプロイメントで同時にテストを実行できます。

@Test @OperateOnDeployment("myname")

beforeテストは、 @ Deployment アノテーションで定義された順序を使用して myname デプロイメントコンテナに対して実行されます。

2.5. Arquillianの拡張機能

テストのニーズがコアランタイムでカバーされていない場合に備えて、Arquillianは複数の拡張機能を提供します。永続性、トランザクション、クライアント/サーバー、REST拡張などがあります。

MavenまたはGradleの設定ファイルに適切な依存関係を追加することで、これらの拡張機能を有効にできます。

一般的に使用される拡張子は、Drone、Graphene、Seleniumです。

3 Mavenの依存関係と設定

pom.xml ファイルに次の依存関係を追加しましょう。

<dependency>
    <groupId>org.jboss.arquillian</groupId>
    <artifactId>arquillian-bom</artifactId>
    <version>1.1.13.Final</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>
<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>4.1.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.container</groupId>
    <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
    <version>1.0.0.Final</version>
    <scope>test</scope>
</dependency>

依存関係の最新版はここにあります。

arquillian-bom 、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.glassfish.main.extras%22%20AND%20a%3A%22glassfish-embedded-all%22[org.glassfish.main .extras]、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jboss.arquillian.container%22%20AND%20a%3A%22arquillian-glassfish-embedded-3.1 %22[org.jboss.arquillian.container]。

** 4簡単なテスト+

**

** 4.1. コンポーネントを作成する

**

単純なコンポーネントから始めましょう。テストに集中できるように、ここには高度なロジックは含まれていません。

public class Component {
    public void sendMessage(PrintStream to, String msg) {
        to.println(message(msg));
    }

    public String message(String msg) {
        return "Message, " + msg;
    }
}

Arquillianを使用して、このクラスがCDI Beanとして呼び出されたときに正しく動作することをテストします。

** 4.2. 最初のArquillianテストを書く+

**

まず、フレームワーク固有のランナーを使ってテストクラスを実行するように指定する必要があります。

@RunWith(Arquillian.class)

テストをコンテナ内で実行する場合は、 @ Deployment アノテーションを使用する必要があります。

Arquillianはテストアーカイブを隔離するためにクラスパス全体を使用しません。代わりに、アーカイブを作成するためのJava APIである ShrinkWrap クラスを使用します。テスト用のアーカイブを作成するときに、テストを使用するためにクラスパスに含めるファイルを指定します。展開中、 ShrinkWrap はテストに必要なクラスのみを分離します。

addclass() メソッドを使用して、必要なクラスをすべて指定し、空のマニフェストリソースを追加することもできます。

JavaArchive.class は__test.warというモックアップWebアーカイブを作成します。このファイルはコンテナにデプロイされ、Arquillianがテストを実行するために使用されます。

@Deployment
public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class)
      .addClass(Component.class)
      .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}

それから、テストにコンポーネントを注入します。

@Inject
private Component component;

最後に、テストを行います。

assertEquals("Message, MESSAGE",component.message(("MESSAGE")));

component.sendMessage(System.out, "MESSAGE");

5エンタープライズJavaBeans のテスト

** 5.1. エンタープライズJava Bean

**

Arquillianを使えば、Enterprise Java Beanの依存性注入をテストして、任意の単語を小文字に変換するメソッドを持つクラスを作成できます。

public class ConvertToLowerCase {
    public String convert(String word){
        return word.toLowerCase();
    }
}

このクラスを使用して、前に作成したメソッドを呼び出すためのステートレスクラスを作成します。

@Stateless
public class CapsConvertor {
    public ConvertToLowerCase getLowerCase(){
        return new ConvertToLowerCase();
    }
}

CapsConvertor クラスはサービスBeanにインジェクトされます。

@Stateless
public class CapsService {

    @Inject
    private CapsConvertor capsConvertor;

    public String getConvertedCaps(final String word){
        return capsConvertor.getLowerCase().convert(word);
    }
}

** 5.2. エンタープライズJava Beanをテストする

**

これで、Arquillianを使用してエンタープライズJava Beanをテストし、 CapsService をインジェクトすることができます。

@Inject
private CapsService capsService;

@Test
public void givenWord__WhenUppercase__ThenLowercase(){
    assertTrue("capitalize".equals(capsService.getConvertedCaps("CAPITALIZE")));
    assertEquals("capitalize", capsService.getConvertedCaps("CAPITALIZE"));
}

__ShrinkWrapを使用して、すべてのクラスが正しく配線されていることを確認します。

@Deployment
public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class)
      .addClasses(CapsService.class, CapsConvertor.class, ConvertToLowerCase.class)
      .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}

** 6. JPAをテストする

**

** 6.1. 持続性

**

永続性をテストするためにArquillianを使用することもできます。まず、エンティティを作成します。

@Entity
public class Car {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String name;

   //getters and setters
}

車の名前を入れるテーブルがあります。

次に、データに対して基本的な操作を実行するためのEJBを作成します。

@Stateless
public class CarEJB {

    @PersistenceContext(unitName = "defaultPersistenceUnit")
    private EntityManager em;

    public Car saveCar(Car car) {
        em.persist(car);
        return car;
    }

    public List<Car> findAllCars() {
    Query query
      = em.createQuery("SELECT b FROM Car b ORDER BY b.name ASC");
    List<Car> entries = query.getResultList();

    return entries == null ? new ArrayList<>() : entries;

    public void deleteCar(Car car) {
        car = em.merge(car);
        em.remove(car);
    }
}

saveCar を使用すると、車の名前をデータベースに保存でき、 findAllCars、 を使用してすべての車を保存できます。また、 deleteCar を使用してデータベースから車を削除することもできます。

** 6.2. Arquillianによるテストの持続性

**

これで、Arquillianを使っていくつかの基本的なテストを実行できます。

まず、クラスを__ShrinkWrapに追加します。

.addClasses(Car.class, CarEJB.class)
.addAsResource("META-INF/persistence.xml")

それからテストを作成します。

@Test
public void testCars() {
    assertTrue(carEJB.findAllCars().isEmpty());
    Car c1 = new Car();
    c1.setName("Impala");
    Car c2 = new Car();
    c2.setName("Lincoln");
    carEJB.saveCar(c1);
    carEJB.saveCar(c2);

    assertEquals(2, carEJB.findAllCars().size());

    carEJB.deleteCar(c1);

    assertEquals(1, carEJB.findAllCars().size());
}

このテストでは、まず4つのcarインスタンスを作成し、データベースの行数が作成したものと同じであることを確認します。

8結論

このチュートリアルでは、

  • Arquillianのコアコンセプトを紹介

  • Arquillianテストにコンポーネントを注入

  • EJBをテストした

  • テストされた永続性

  • Mavenを使ってArquillian検定を行った

コードはhttps://github.com/eugenp/tutorials/tree/master/jee-7[Githubに掲載]から入手できます。