Pengenalan Menguji dengan Arquillian

1. Gambaran keseluruhan

Arquillian adalah kerangka ujian integrasi kontena-agnostik untuk Jakarta EE. Menggunakan Arquillian meminimumkan beban menguruskan kontena, penyebaran, inisialisasi kerangka, dan sebagainya.

Kita boleh memberi tumpuan kepada menulis ujian sebenar dan bukan pada bootstrap persekitaran ujian.

2. Konsep Teras

2.1. Arkib Penyebaran

Terdapat cara mudah untuk menguji aplikasi kita semasa berjalan di dalam bekas.

Pertama, kelas ShrinkWrap menyediakan API untuk membuat fail * .jar, * .war, dan * .ear yang dapat digunakan.

Kemudian, Arquillian membolehkan kami mengkonfigurasi penyebaran ujian menggunakan anotasi @Deployment - pada kaedah yang mengembalikan objek ShrinkWrap .

2.2. Bekas

Arquillian membezakan tiga jenis bekas:

  • Diuji jauh menggunakan protokol jarak jauh seperti JMX
  • Diuruskan - bekas jauh tetapi kitaran hayatnya diuruskan oleh Arquillian
  • Terbenam - bekas tempatan di mana ujian dilakukan menggunakan protokol tempatan

Kami juga dapat mengklasifikasikan bekas mengikut kemampuannya:

  • Aplikasi EE Jakarta digunakan pada pelayan aplikasi seperti Glassfish atau JBoss
  • Bekas servlet dikerahkan di Tomcat atau Jetty
  • Bekas mandiri
  • Bekas OSGI

Ia memeriksa jalan kelas runtime dan memilih bekas yang tersedia secara automatik.

2.3. Pengayaan Ujian

Arquillian memperkayakan ujian dengan memberikan contoh suntikan kebergantungan sehingga kita dapat menulis ujian kita dengan mudah.

Kami boleh menyuntik kebergantungan menggunakan @Inject , menyuntik sumber dengan @Resource , EJB sesi kacang menggunakan @EJB, dll.

2.4. Pelari Ujian Pelbagai

Kami boleh membuat banyak penerapan menggunakan anotasi:

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

Di mana namanya adalah nama file penyebaran dan parameter urutan adalah perintah pelaksanaan penyebaran, jadi sekarang kita dapat menjalankan ujian pada penggandaan banyak pada masa yang sama menggunakan anotasi:

@Test @OperateOnDeployment("myname")

Ujian sebelumnya dijalankan pada wadah penyebaran myname menggunakan perintah yang ditentukan dalam anotasi @Deployment .

2.5. Sambungan Arquillian

Arquillian menawarkan pelbagai sambungan sekiranya keperluan ujian kami tidak dilindungi oleh jangka masa teras. Kami mempunyai ketekunan, transaksi, pelanggan / pelayan, sambungan REST, dll.

Kami dapat mengaktifkan peluasan tersebut dengan menambahkan kebergantungan yang sesuai ke fail konfigurasi Maven atau Gradle.

Sambungan yang biasa digunakan ialah Drone, Graphene, dan Selenium.

3. Ketergantungan dan Penyediaan Maven

Mari tambahkan kebergantungan berikut ke fail pom.xml kami :

 org.jboss.arquillian arquillian-bom 1.1.13.Final import pom   org.glassfish.main.extras glassfish-embedded-all 4.1.2 test   org.jboss.arquillian.container arquillian-glassfish-embedded-3.1 1.0.0.Final test 

Versi ketergantungan terkini boleh didapati di sini: arquillian-bom, org.glassfish.main.extras, org.jboss.arquillian.container.

4. Ujian Ringkas

4.1. Buat Komponen

Mari mulakan dengan komponen mudah. Kami tidak memasukkan logik lanjutan di sini untuk dapat memberi tumpuan kepada ujian:

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

Dengan menggunakan Arquillian, kami ingin menguji bahawa kelas ini berkelakuan betul ketika dipanggil sebagai kacang CDI.

4.2. Tulis Ujian Arquillian Pertama Kami

Pertama, kita perlu menentukan bahawa kelas ujian kita harus dijalankan menggunakan pelari khusus kerangka:

@RunWith(Arquillian.class) 

Sekiranya kita akan menjalankan ujian kita di dalam bekas, kita perlu menggunakan anotasi @Deployment .

Arquillian tidak menggunakan keseluruhan classpath untuk mengasingkan arkib ujian. Sebaliknya, ia menggunakan kelas ShrinkWrap , iaitu API Java untuk membuat arkib. Apabila kami membuat arkib untuk diuji, kami menentukan fail apa yang akan disertakan di jalan kelas untuk menggunakan ujian. Semasa penggunaan, ShrinkWrap mengasingkan hanya kelas yang diperlukan untuk ujian.

Dengan menggunakan kaedah addclass () kita dapat menentukan semua kelas yang diperlukan, dan juga menambahkan sumber manifes kosong.

The JavaArchive.class creates a mockup web archive called test.war, this file is deployed into the container and then is used by Arquillian to perform tests:

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

Then we inject our component in the test:

@Inject private Component component;

Finally, we perform our test:

assertEquals("Message, MESSAGE",component.message(("MESSAGE"))); component.sendMessage(System.out, "MESSAGE");

5. Testing Enterprise Java Beans

5.1. Enterprise Java Bean

With Arquillian we can test dependency injection of an Enterprise Java Bean, to do that we create a class that has a method for converting any word to lowercase:

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

Using this class, we create a stateless class for calling the method created before:

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

The CapsConvertor class gets injected into a service bean:

@Stateless public class CapsService { @Inject private CapsConvertor capsConvertor; public String getConvertedCaps(final String word){ return capsConvertor.getLowerCase().convert(word); } }

5.2. Test the Enterprise Java Bean

Now we can use Arquillian to test our enterprise Java Bean, injecting the CapsService:

@Inject private CapsService capsService; @Test public void givenWord_WhenUppercase_ThenLowercase(){ assertTrue("capitalize".equals(capsService.getConvertedCaps("CAPITALIZE"))); assertEquals("capitalize", capsService.getConvertedCaps("CAPITALIZE")); }

Using ShrinkWrap, we ensure that all classes are wired correctly:

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

6. Testing JPA

6.1. Persistence

We can also use Arquillian to test persistence. First, we are going to create our entity:

@Entity public class Car { @Id @GeneratedValue private Long id; @NotNull private String name; // getters and setters }

We have a table that holds names of cars.

Then we are going to create our EJB to perform basic operations on our data:

@Stateless public class CarEJB { @PersistenceContext(unitName = "defaultPersistenceUnit") private EntityManager em; public Car saveCar(Car car) { em.persist(car); return car; } public List findAllCars() { Query query = em.createQuery("SELECT b FROM Car b ORDER BY b.name ASC"); List entries = query.getResultList(); return entries == null ? new ArrayList() : entries; public void deleteCar(Car car) { car = em.merge(car); em.remove(car); } }

With saveCar we can save the car names into the database, we can get all cars stored with findAllCars, and also we can delete a car from the database with deleteCar.

6.2. Test Persistence With Arquillian

Now we can perform some basic tests using Arquillian.

First, we add our classes to our ShrinkWrap:

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

Then we create our test:

@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()); }

Dalam ujian ini, pertama kali kami membuat empat contoh kereta, dan kami memeriksa bahawa jumlah baris dalam pangkalan data sama dengan yang kami buat.

8. Kesimpulannya

Dalam tutorial ini, kami:

  • memperkenalkan konsep teras Arquillian
  • menyuntik komponen ke dalam ujian Arquillian
  • menguji EJB
  • kegigihan yang diuji
  • melakukan ujian Arquillian menggunakan Maven

Anda boleh mendapatkan kod dari artikel di Github.