OpenJDK Test Part1

Kerim Fırat
4 min readMar 8, 2021

OpenJDK Build makale serisinde,OpenJDK üzerinde çalışma ve derleme ile ilgili baştan sona kadar tüm süreci inceledik. Dolayısıyla bu aşamada elimizde bir çıktı(output) mevcut.

Proje yüzerinde yaptığımız çalışmaları ve geliştirmeleri test etmek için,ürün/proje üzerinde uygun test süreçlerine hakim olmamız gerekir. Bu makale serisinde “OpenJDK Test” detaylarını inceleyeceğiz.

“make test” Kullanımı

İnceleyeceğimiz bu test yolu-yöntemi developer(geliştirici) merkezlidir.
Local olarak bir JDK oluşturduğunuzu ve onu test etmek istediğinizi varsayar. Genel test hedeflerini çalıştırmak basittir ve daha karmaşık test kombinasyonları mümkündür. Kullanıcı(user) tarafından tespit edilen hatalar geliştiricilere bildirilir.Ancak iyi bir developer olarak user tarafına geçecek hataları mümkün olduğunca azaltmak ve asıl hedef bu hataları tamamen bitirmek-ortadan kaldırmaktır.

Hedef olarak çalıştırılan “test” komutu,”jdk-image”’ı test edilen ürün olarak kullanır. Bunun yerine alternatif olarak “exploded-test” de mevcuttur.
Bu hedefi çalıştırdığımızda tüm testler başarılı bir şekilde çalışmayabilir. Ancak bu hedefi kullanmak,belirli iş akışları için yeniden build(rebuild) sürelerini büyük ölçüde iyileştirebilir.

Önceleri eski bir sistemi çağırarak test etmek için “make test” komutu,yeni test çerçevesi(framework) için ise “make run-test” kullanılıyordu.
Geriye dönük uyumluluk için komut dosyalarıyla “run-test” takma ad olarak tutulur. Bazı örnek komut satırları aşağıdaki gibidir:

$ make test-tier1
$ make test-jdk_lang JTREG="JOBS=8"
$ make test TEST=jdk_lang
$ make test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
$ make test TEST="hotspot:hotspot_gc" JTREG="JOBS=1;TIMEOUT_FACTOR=8;JAVA_OPTIONS=-XshowSettings -Xlog:gc+ref=debug"
$ make test TEST="jtreg:test/hotspot:hotspot_gc test/hotspot/jtreg/native_sanity/JniVersion.java"
$ make test TEST="micro:java.lang.reflect" MICRO="FORK=1;WARMUP_ITER=2"
$ make exploded-test TEST=tier2

Konfigürasyon
JTReg testlerini çalıştırabilmek için,”configure”’un JTReg test çerçevesini(framework) nerede bulacağını bilmesi gerekir.
JTReg,”configure” ile otomatik olarak algılanmazsa,aşağıdaki komutu kullanarak JTReg ortamına işaret edin/belirleyin.

--with-jtreg=<jtreg ana yolu>

Bu komutun JTReg’in bulunduğu ana dizin yoluna işaret ettiğini unutmayın. Ayrıca “configure” çalıştırmadan önce JT_HOME ortam değişkenini JTReg ana dizine işaret edecek şekilde ayarlayabilirsiniz.

Diğer bir husus “microbenchmarks(mikro kıyaslama-karşılaştırmalar)” çalıştırabilmek için, “configure”’ın JHM bağımlılıklarını nerede bulacağını bilmesi gerekir. JHM ortamına işaret etmek için aşağıdaki komutu kullanabilirsiniz:

--with-jmh=<JMH .jar dosyalarının_bulunduğu_dizin_yolu>

Önerilen bağımlılıklar aşağıdaki komutları çalıştırarak alınabilir:

sh make/devkit/createJMHBundle.sh
--with-jmh=build/jmh/jars

Test Seçimi
Tüm test işlevler “make test” komutunu çalıştırarak kullanılabilir.
Bu yöntem kullanıldığında,yürütülecek test veya testler “TEST” değişkeni kullanılarak kontrol edilir.Kaynak kodu değişikliği olmadan sonraki test çalıştırmalarını hızlandırmak için ise “test-only” kullanılabilir.

Bazı yaygın üst düzey testler için doğrudan “make” hedefleri oluşturulmuştur.Bunlar tüm JTReg test gruplarını,hotspot gtest’i ve varsa özel testleri içerir. Bunun anlamı “make test-tier1” komutu “make test TEST=”tier1"”’a eşittir. Daha karmaşık test çalışmaları için “test TEST=”x”” çözümünün kullanılması gerekir.

TEST’te verilen test özellikleri,tam nitelikli test tanımlayıcıları olarak ayrıştırılır ve hangi testlerin yapılacağını açıkça ve kesin olarak gösterir.
Örnek olarak “:tier1” aşağıda verildiği gibi genişleyecektir:

jtreg:$(TOPDIR)/test/hotspot/jtreg:tier1 jtreg:$(TOPDIR)/test/jdk:tier1 jtreg:$(TOPDIR)/test/langtools:tier1 jtreg:$(TOPDIR)/test/nashorn:tier1 jtreg:$(TOPDIR)/test/jaxp:tier1.

Eğer ayrıştırıcıyı kısayol olarak kullanmak istiyorsanız,”TEST” değişkenine her zaman tam nitelikli test tanımlayıcılarının bir listesini gönderebilirsiniz.

JTReg
JTReg testleri,bir JTReg test grubu veya JTReg testlerini içeren bir dizi dosya veya dizin seçerek seçilebilir.JTReg test grupları bir test kökü olmadan da belirtilebilir.
Örneğin: “:tier1”(veya “tier1”,iki nokta üst üste isteğe bağlıdır)
Veya:

hotspot:tier1, test/jdk:jdk_util

veya

$(TOPDIR)/test/hotspot/jtreg:hotspot_all

Test kök yolu mutlak bir yol veya JDK üst dizinine göre bir yol veya test dizini olarak belirtilebilir. Kolaylık olması için “hotspot/jtreg” olan hotspot JTReg kökü,sadece “hotspot” olarak kısaltılabilir.
Test kökü olmadan belirtildiğinde,tüm test köklerinden tüm eşleşen gruplar eklenecektir-dahil edilecektir. Aksi halde,yalnızca belirtilen test kökündeki grup eklenecektir.

Ayrıca “test/hotspot/jtreg/native_sanity/JniVersion.java” veya “hotspot/jtreg/native_sanity” gibi JTReg testleri içeren ayrı JTReg testleri veya dizinler de belirtilebilir.Test kökü seçiminde olduğu gibi,mutlak bir yol ve ya JDK üstü dizinine veya test dizinine göre bir yol belirtebilirsiniz.
Ve “hotspot” burada “hotspot/jtreg” için bir takma ad olarak da kullanılabilir.

Test grupları veya test yolları benzersiz şekilde çözülebildiği sürece “jtreg:” önekini girmenize gerek yoktur.Bu mümkün değilse veya tam nitelikli bir test tanımlayıcısı kullanmak istiyorsanız “jtreg:” önekini ekleyin.
Örnek:

jtreg:test/hotspot/jtreg/native_sanity

Gtest
Hotspot Gtest paketi çok hızlı olduğu için varsayılan tüm testleri çalıştırmaktadır.Bu yalnızca “gtest” ile veya tam bir test tanımlayıcısı “gtest:all” olarak belirtilir.İsterseniz bireysel bir testi veya bir grup testi seçebilirsiniz.Örneğin:

gtest:LogDecorations

Veya:

gtest:LogDecorations.level_test_vm

Şüphe duyduğunuz,emin olmadığınız bir testi tekrar tekrar yapmak istiyorsanız bu özelliği kullanmak faydalı olabilir.

Gtest için,her JVM varyantı için ayrı bir test paketi vardır.
JVM varyantı,test tanımlayıcısına “/<varyant>” şeklinde eklenerek tanımlanır.
Örnek:

gtest:Log/client

Şayet varyant belirtmezseniz,gtest mevcut her JVM varyantı için bir kez çalışır.Dolayısıyla yanlızca JVM sunucunuz varsa,”gtest:all” belirteci “gtest:all/server”’a eşdeğer olacaktır.

Microbenchmarks(Mikro Ölçütler/Kıyaslamalar)
Çalıştırılacak mikro ölçütler/kıyaslamalar “micro:” test tanımlayıcısının ardından normal bir ifade kullanılarak seçilir.
Örnek:

micro:java.lang.reflect

Bu,test seçimini JMH’ye devreder. Yani paket adı,sınıf adı ve hatta kıyaslama yöntemi adları testleri seçmek için kullanılabilir.
Tanımlama ifadesi içinde “|” gibi özel karakterler kullanmak mümkündür.Ancak birden çok kez kullanmaktan kaçınmak gerekir.
Örnek:

micro:ArrayCopy\\\\\|reflect

Özel Testler
Başka herhangi bir test çerçevesi-ortamı(framework) tarafından kapsanmayan birkaç test yöntemine “special:” test tanımlayıcısı kullanılarak erişilebilir.Bunlara “failure-handler” ve “make” dahildir.

  • Hata giderici testi,test tanımlayıcısı olarak “special:failure-handler” veya yalnızca “failure-handler” kullanarak çalıştırılır.
  • Hem makefile hem de ilgili işlevesellik dahil olmak üzere derleme sistemi için testler “special:make” veya sadece “make” kullanılarak çalıştırılır.
    Bu “special:make:all”’a eşdeğerdir.

Belirli bir “make” testi,bağımsız değişken olarak tanımlanarak/sağlanarak çalıştırılabilir.
Örnek:

special:make:idea

Test makale serisi kaynak: OpenJDK sitesi.

end of

--

--

Kerim Fırat
Kerim Fırat

Written by Kerim Fırat

Senior Android Platform(AOSP,AAOS) Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author

No responses yet