22 Mayıs 2023 Pazartesi

surefire plugin - forkCount Tag

Giriş
Örnek
Dışarıdan forkCount vermek için şöyle yaparız
mvn ... -DforkCount=1C -DreuseForks=true
forkCount Nedir ?
forkCount Tag için açıklama şöyle. Yani testleri çalıştırmak için en fazla kaç tane VM açılacağını belirtir. Varsayılan değer 1
Option to specify the number of VMs to fork in parallel in order to execute the tests. When terminated with "C", the number part is multiplied with the number of CPU cores. Floating point value are only accepted together with "C". If set to "0", no VM is forked and all tests are executed within the main process.

Example values: "1.5C", "4"
reuseForks Nedir?
reuseForks için açıklama şöyle. Yani eğer false ise test sınıfı bitince VM kapatılır. true ise VM yeni bir test sınıfını çalıştırırır
The parameter reuseForks is used to define whether to terminate the spawned process after one test class and to create a new process for the next test in line (reuseForks=false), or whether to reuse the processes to execute the next tests (reuseForks=true).

The default setting is forkCount=1/reuseForks=true, which means that maven-surefire-plugin creates one new JVM process to execute all tests in one Maven module.

forkCount=1/reuseForks=false executes each test class in its own JVM process, one after another. It creates the highest level of separation for the test execution, but it would probably also give you the longest execution time of all the available options. Consider it as a last resort.

Peki Neden Lazım
1. forkCount testlerin kaç tane JVM içinde koşmasını istediğimizi belirtmek için lazım. 
2. reuseForks testlerin yalıtımı için lazım. Yani testlerde singleton gibi state tutan bir nesne varsa ve testlerimiz birbirlerini etkilemesin istiyorsak, her test için yeni bir VM açılabilir.

Örnek
Elimizde şöyle bir kod olsun
public class TestClass1 { @Test public void testMethod1() { MySingleton instance = MySingleton.getInstance(); System.out.println("TestClass1 - Test Method 1 " + instance.incrementCounter()); } @Test public void testMethod2() { MySingleton instance = MySingleton.getInstance(); System.out.println("TestClass1 - Test Method 2 " + instance.incrementCounter()); } } public class TestClass2 { @Test public void testMethod3() { MySingleton instance = MySingleton.getInstance(); System.out.println("TestClass2 - Test Method 3 " + instance.incrementCounter()); } @Test public void testMethod4() { MySingleton instance = MySingleton.getInstance(); System.err.println("TestClass2 - Test Method 4 " + instance.incrementCounter()); } }
Bu kod bir singleton nesneyi değiştiriyor
public class MySingleton { private int counter; private static MySingleton instance = new MySingleton(); private MySingleton() { } public static MySingleton getInstance() { return instance; } public int incrementCounter() { counter++; return counter; } }
forkCount=1 ve reuseForks= false şeklinde kullanırsak çıktı şöyle. Yani her test sınıfı için yeni VM açılır ve her test kendi singleton nesnesini kullanıyor
TestClass1 - Test Method 1 1 TestClass1 - Test Method 2 2 TestClass2 - Test Method 3 1 TestClass2 - Test Method 4 2
forkCount=1 ve reuseForks= true şeklinde kullanırsak çıktı şöyle. Yani aynı VM tüm testler için kullanılır ve her test aynı singleton nesnesini kullanıyor
TestClass1 - Test Method 1 1 TestClass1 - Test Method 2 2 TestClass2 - Test Method 3 3 TestClass2 - Test Method 4 4
forkCount=2 ve reuseForks= true şeklinde kullanırsak çıktı şöyle. Bu sefer her testi farkı bir VM çalıştırıyor her test kendi singleton nesnesini kullanıyor. Ayrıca dikkat edilirse çıktıda önce Test1 sonra Test2 yok. Yani testlerin çalışması sırayla değil. Her ikisi de aynı anda başlıyor.
TestClass1 - Test Method 1 1 TestClass2 - Test Method 3 1 TestClass1 - Test Method 2 2 TestClass2 - Test Method 4 2




Hiç yorum yok:

Yorum Gönder

Local Snapshot Kullanmak

Örnek Şöyle yaparız <repository> <id>snapshot-repository</id> <name>Maven2 Snapshot Repository</name> &l...