Bir GUI'yi nasıl test edebilirim?


154

Kodumdaki hesaplamalar iyi test edilmiş, ancak çok fazla GUI kodu olduğundan, genel kod kapsamım istediğimden daha düşük. Birim sınama GUI koduyla ilgili yönergeler var mı? Hatta mantıklı mı?

Örneğin, uygulamamda grafikler var. Grafiklerin testini nasıl otomatikleştireceğimizi anlayamadım. Grafiğin doğru olup olmadığını kontrol etmek insan gözü AFAIK gerektirir.

(Java Swing kullanıyorum)


1
Martin Fowler ( martinfowler.com/eaaDev/uiArchs.html ) tarafından farklı GUI mimarileri hakkında harika bir makale var . Birim testi açısından GUI mimarisi dengesini açıklar.
Roman Hwang

1
Günümüzde, bu soru daha iyi programmers.stackexchange.com adresinde sorulur (ve muhtemelen Çok Geniş olma nedeniyle Yığın Taşması'nda konu dışıdır), ancak eski sorular taşınamaz. Burada bir kenara ait olup olmadığı sorunu ilginç ve zor bir sorun olmaya devam ediyor.
Mark Amery

1
Bazı GUI kod parçası ve JUnit ile örnek olması harika olurdu.
Witold Kaczurba

1
Sadece rahatla ve rahatsız etme diyebilirim. Birim testlere harcanan çaba her zaman net üretken değildir.
codeulike

Eski soru hala, Jubula'yı kullanarak GUI'deki akışı test edebilirsiniz
Abi

Yanıtlar:


68

MVP ve MVC gibi tasarımlar genellikle gerçek GUI'den mümkün olduğunca çok mantık çıkarmaya çalışır. Bu konuda çok popüler bir makale Michael Feathers'ın "The Humble Dialog Box" dır . Şahsen mantığı kullanıcı arayüzünden çıkarmaya çalışırken karışık deneyimler yaşadım - bazen çok iyi çalıştı ve bazen de değerinden daha fazla sorun oldu. Biraz benim uzmanlık alanım dışında olsa.


??? "bazen çok iyi çalıştı ve bazen de değerinden daha fazla sorun oldu" Çok garip çünkü çoğu yeni dil MVC odaklı olma eğilimindedir ... gui (Model-Görsel) mantığı olan ...
Patrick Desjardins

14
Yine de, sunum mantığı GUI'de olacaktır. Bazen, bu önemsiz olmaktan uzak olabilir
Andrea



@ c24w aynayı çektiğiniz için teşekkür ederim, siz gerçek MVP'siniz :)
John Baker

38

Elbette cevap MVC kullanmak ve mantığı GUI'den olabildiğince uzaklaştırmaktır.

Bununla birlikte, bir iş arkadaşından uzun zaman önce, SGI'nin OpenGL'yi yeni donanıma taşıdığı zaman, ekrana bir dizi ilkel çizecek ve daha sonra çerçeve arabelleğinin MD5 toplamını hesaplayacak bir grup ünite testine sahip olduklarını duydum. Bu değer, daha sonra, API'nin piksel başına doğru olup olmadığını hızla belirlemek için bilinen iyi karma değerleriyle karşılaştırılabilir.


3
Bu yaklaşımı seviyorum. Kurmak ve korumak hantal ama bana ihtiyacım olan regresyon testi yeteneklerini verecekti.
Steve McLeod

7
danatel noktayı kaçırdın. OpenGL, piksel hassas grafik oluşturma API'sıdır. Qt gibi GUI uygulama çerçeveleri, sistem kromuna büyük ölçüde bağımlı olacaktır, bu nedenle çerçeve arabelleğini karmalamak iyi bir yaklaşım değildir.
Bob Somers

1
MD5 mi? Şifrelemenin bununla ne ilgisi var? Güvenlik nasıl dahil edilir? Karma, tamam, piksel mükemmel grafikler için harika bir fikir ama kriptografik karma? Kriptografik olmayan ve çarpışma olasılığı ihmal edilebilir olan daha hızlı karmaları kullanabilirsiniz. Bunun sadece bir karma değil kriptografik bir karma olduğundan emin misiniz? (buna ek olarak, günümüzde ve paralel hesaplama çağında, paralelleştirilemeyen karma şifreleme algoritması [kriptografik olmayan amaçlar için kullanılır] şüphe ile ele alınmalıdır)
SyntaxT3rr0r

24
@ SyntaxT3rr0r: Güvenlikle ilgili olmayan bu tür bir uygulamada hangi sağlama işlevini önerirsiniz ve MD5'e kıyasla ne kadar performans artışı beklenebilir?
Lèse majesté

1
Cevap "asla GUI tasarlamayın ve dolayısıyla test etmeyin" anlamına gelir. Güzel.
Dims

10

Deneyebilirsin UISpec4J Salıncak tabanlı Java uygulamaları için açık kaynak kodlu fonksiyonel ve / veya birim test kütüphanesi ...


2
Java Swing GUI'lerinde gereksinim doğrulama testi yapmak için bir ay kadar UISpec4J kullanmaya başladım. Şimdiye kadar çok hoşuma gitti.
Bassam

github.com/UISpec4J/UISpec4J bağlantınızın resmi web sitesi olduğunu belirtiyor, ancak bu resmi bana benzemiyor. Tek gördüğüm vlogging hakkında bir blog
lucidbrot

7

Web tabanlı bir kullanıcı arayüzünü test etmeyi otomatikleştirecek Selenium RC var . Eylemleri kaydedecek ve tekrarlayacaktır. Yine de kullanıcı arayüzünüzle olan etkileşimleri gözden geçirmeniz gerekecek, bu yüzden kapsama alanı ile yardımcı olmayacak, ancak otomatik yapılar için kullanılabilir.


7

Salatalık ve Swinger'ı Swing GUI uygulamaları için sade ingilizce işlevsel kabul testleri yazmak için kullanmayı deneyebilirsiniz . Swinger, uygulamayı sürmek için Netbeans'in Jemmy kütüphanesini kaputun altında kullanıyor.

Salatalık aşağıdaki gibi testler yazmanıza izin verir:

 Scenario: Dialog manipulation
    Given the frame "SwingSet" is visible
    When I click the menu "File/About"
    Then I should see the dialog "About Swing!"
    When I click the button "OK"
    Then I should not see the dialog "About Swing!"

Çalışırken görmek için bu Swinger video demosuna bir göz atın .


6

İşte bazı ipuçları:

GUI'den mümkün olan en fazla kodu kaldırmaya çalışın (denetleyici ve model nesnesi var), böylece GUI olmadan bunları test edebileceksiniz.

Grafik için, grafiği oluşturan koda verdiğiniz değeri test etmelisiniz.


6

Test bir sanat şeklidir. Mantığın GUI'yi olabildiğince kaldırması gerektiğine katılıyorum. Daha sonra birim testimizi oraya odaklayabiliriz. Her şey gibi, testler de riski azaltmakla ilgilidir. Her zaman her şeyi test etmeniz gerekmez, ancak çoğu zaman en iyi şey, farklı alanlarda farklı testleri kırmaktır.

Diğer soru, gerçekten UI katmanında neyi test etmeye çalıştığınızdır. UI testi en pahalı testtir, çünkü oluşturulması, bakımı daha uzun sürer ve en kırılgandır. Çizgiyi çizmeye çalışmadan önce koordinatların doğru olduğunu bilmek için mantığı test ederseniz, özellikle neyi test ediyorsunuz? Bir grafiği kırmızı çizgiyle test etmek isterseniz çizilir. Önceden belirlenmiş bir koordinat ayarlayabilir ve belirli piksellerin kırmızı olup olmadığını test edebilir misiniz? Yukarıda belirtilen bitmap karşılaştırmaları işe yaradığı gibi, Selenyum ama ana odak noktam GUI'yi fazla test etmek değil, daha sonra kullanıcı arayüzünü oluşturmaya ve daha sonra kullanıcı arayüzünün hangi bölümünün kırıldığına veya şüphelenip odaklanacağına dair bir mantık test etmek olacaktır. Orada.


3

GUI'nizi test etmek için JFCUnit'i kullanabilirsiniz , ancak grafikler daha zor olabilir. GUI'mın anlık görüntülerini aldım ve otomatik olarak önceki bir sürümle karşılaştırdım. Bu gerçek bir test sunmasa da, otomatik bir derleme beklenen çıktıyı üretemezse sizi uyarır.


3

Sorunuzdan topladığım şey, GUI davranışınızı ayrıntılı olarak test etmek için otomatik bir yol arıyorsanız, verdiğiniz örnek bir eğrinin gerçekten doğru çizilip çizilmediğini test etmektir.

Birim sınama çerçeveleri otomatik sınama yapmak için bir yol sağlar, ancak bence yapmak istediğiniz sınama türleri, aralarında GUI araç kitinizin / kitaplığınızın sınıflarının, test etmek istememelisiniz.

Seçenekleriniz, kullandığınız platformlara / araç setlerine / çerçevelerine çok bağlıdır: örneğin, GUI çerçevesi olarak Qt kullanan bir uygulama, testlerini otomatikleştirmek için Squish'i kullanabilir. Testlerinizin sonuçlarını bir kez doğrularsınız ve daha sonra otomatik olarak yürütülen testler sonuçları doğrulanmış sonuçlarla karşılaştırır.



2

GUI testine yaklaşımım ve endüstri konsensüsü gelişiyor. Ama bence birkaç anahtar teknik ortaya çıkmaya başlıyor.

Duruma bağlı olarak bu tekniklerden birini veya daha fazlasını kullanıyorum (örneğin ne tür bir GUI olduğu, ne kadar hızlı inşa edilmesi gerektiği, son kullanıcının kim olacağı vb.).

  1. Manuel test. Kod üzerinde çalışırken GUI'yi her zaman çalıştırırsınız ve kodla senkronize olduğundan emin olursunuz. Kod ve çalışan uygulama arasında geçiş yaparak üzerinde çalıştığınız kısmı manuel olarak test edip yeniden test edersiniz. Önemli bir iş parçasını her tamamladığınızda, regresyon olmadığından emin olmak için tüm ekranı veya uygulamanın alanını genel bir test verirsiniz.

  2. Birim testi. Fonksiyonlar veya küçük GUI davranışı birimleri için testler yazarsınız. Örneğin, grafiklerinizin 'temel' bir renge dayalı olarak bir rengin farklı tonlarını hesaplaması gerekebilir. Bu hesaplamayı bir işleve çıkarabilir ve bunun için bir birim testi yazabilirsiniz. GUI'de (özellikle yeniden kullanılabilir mantık) böyle bir mantığı arayabilir ve daha kolay birim testine tabi tutulabilen gizli işlevlere çıkarabilirsiniz. Karmaşık davranışlar bile bu şekilde çıkarılabilir ve test edilebilir - örneğin, bir sihirbazdaki bir dizi adım bir işleve çıkarılabilir ve bir birim testi, bir girdi verildiğinde doğru adımın döndürüldüğünü doğrulayabilir.

  3. Bileşen gezgini. Tek rolü GUI'nizi oluşturan yeniden kullanılabilir bileşenlerin her birini sergilemek olan bir 'explorer' ekranı oluşturursunuz. Bu ekran, her bileşenin doğru görünüme sahip olduğunu görsel olarak doğrulamanın hızlı ve kolay bir yolunu sunar. Bileşen gezgini tüm uygulamanızı manuel olarak gerçekleştirmekten daha etkilidir, çünkü A) her bir bileşeni yalnızca bir kez doğrulamanız gerekir ve B) bileşeni görmek için uygulamanın derinliklerine gitmeniz gerekmez, sadece görüntüleyebilir ve hemen doğrulayın.

  4. Otomasyon testi. Ekran veya bileşenle etkileşime giren, fare tıklamalarını, veri girişini vb. Simüle eden, uygulamanın bu manipülasyonlar verildiğinde doğru çalıştığını iddia eden bir test yazarsınız. Bu, diğer testlerinizin atlayabileceği olası hataları yakalamak için ekstra bir yedekleme testi olarak yararlı olabilir. GUI'nin kırılmaya en çok eğilimli ve / veya son derece kritik bölümleri için otomasyon testi yapma eğilimindeyim. Bir şey kırılırsa mümkün olduğunca erken bilmek istediğim parçalar. Bu, kırılma veya önemli ana ekranlara karşı savunmasız olan oldukça karmaşık etkileşimli bileşenleri içerebilir.

  5. Fark / anlık görüntü testi. Çıktıyı ekran görüntüsü veya HTML kodu olarak yakalayan ve bir önceki çıktıyla karşılaştıran bir test yazarsınız. Bu şekilde, çıktı her değiştiğinde sizi uyarırsınız. Diff testleri, GUI'nizin görsel yönü karmaşıksa ve / veya değişebilirse, bu durumda, belirli bir değişikliğin bir bütün olarak GUI üzerindeki etkisi hakkında hızlı ve görsel geri bildirim almak isteyebilirsiniz.

Muhtemel her türlü testi kullanmak yerine, üzerinde çalıştığım şeye dayalı olarak test tekniğini seçmeyi ve seçmeyi tercih ediyorum. Bu yüzden bir durumda basit bir işlevi ayıklayacağım ve birim test edeceğim, ancak başka bir durumda bileşen gezginine bir bileşen ekleyeceğim, vb. Bu duruma bağlıdır.

Kod kapsamının çok yararlı bir metrik olduğunu bulamadım, ancak diğerleri bunun için bir kullanım bulmuş olabilir.

İlk önlem, hataların sayısı ve ciddiyeti olduğunu düşünüyorum. Birinci önceliğiniz muhtemelen düzgün çalışan bir uygulamaya sahip olmaktır. Uygulama düzgün çalışıyorsa, çok az veya hiç hata olmamalıdır. Çok veya ciddi hatalar varsa, muhtemelen test etmiyorsunuz veya testleriniz etkili değil.

Hataları azaltmanın yanı sıra, performans, kullanılabilirlik, erişilebilirlik, sürdürülebilirlik, genişletilebilirlik vb. Gibi başka önlemler de vardır. Bunlar, ne tür bir uygulama oluşturduğunuza, işletmeye, son kullanıcıya vb.

Tüm bunlar benim kişisel deneyimime ve araştırmamın yanı sıra Ham Vocke tarafından yapılan UI Testleri üzerine harika bir yazıya dayanıyor .


1

Bildiğim kadarıyla, bu oldukça karmaşık ve gerçekten dile bağlı - çok sayıda dilin GUI'yi test etme yöntemleri var, ancak GUI'yi gerçekten test etmeniz gerekiyorsa (model / gui etkileşiminin aksine), genellikle gerçek bir kullanıcının tıklama düğmelerini simüle eder. Örneğin, Eclipse'de kullanılan SWT çerçevesi SWTBot sağlar , JFCUnit'ten daha önce bahsedilmiştir, Mozilla'nın bunu XUL'de simüle etmenin kendi yolları vardır (ve bloglarında okuduğumdan, bu testler oldukça kırılgan görünmektedir).

Bazen bir ekran görüntüsü almanız ve mükemmel piksel oluşturmayı test etmeniz gerekir (Mozilla'nın doğru olarak oluşturulmuş sayfaları kontrol etmek için bunu yaptığına inanıyorum) - bu daha uzun bir kurulum gerektirir, ancak grafikler için ihtiyacınız olan şey olabilir. Bu şekilde, kodunuzu güncellediğinizde ve bir test koptuğunda, görüntünün hatanın gerçek olup olmadığını manuel olarak kontrol etmeniz veya daha güzel grafikler oluşturmak ve ekran görüntülerini güncellemeniz için grafik oluşturma kodunu iyileştirmeniz gerekir.


0

Swing kullanıyorsanız, FEST-Swing , GUI'nizi ve test iddialarınızı kullanmak için kullanışlıdır. "A düğmesini tıklarsam, B iletişim kutusu görüntülenmelidir" veya "açılır menüden 2. seçeneği seçersem, tüm onay kutularının seçimi kaldırılmalıdır" gibi şeyleri test etmeyi oldukça basitleştirir .

Bahsettiğiniz grafik senaryosunu test etmek o kadar kolay değil. GUI bileşenleri için yalnızca bunları oluşturarak ve görüntüleyerek (ve belki de FEST ile çalıştırarak) kod kapsamı elde etmek oldukça kolaydır. Bununla birlikte, anlamlı iddialarda bulunmak zor kısımdır (ve anlamlı iddialarda bulunmayan kod kapsamı, kendini kandırmaya yönelik bir uygulamadır). Grafiğin baş aşağı veya çok küçük olmadığından nasıl emin olabilirsiniz?

GUI'lerin bazı yönlerinin otomatik birim testleri ile etkili bir şekilde test edilemeyeceğini ve bunları başka şekillerde test etmeniz gerektiğini kabul etmelisiniz.


0

GUI kütüphanesini test etmek sizin işiniz değil. Böylece, aslında ekranda neyin çizildiğini kontrol etme ve widget'ların özelliklerini kontrol etme sorumluluğunu atlayıp kütüphaneye çizilenleri doğru bir şekilde temsil ettiklerine güvenebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.