C # ve NUnit kullanarak bir GUI uygulaması için birim testleri nasıl yapılandırılır


16

Müşterilerimizden birine basit bir uygulama sağlamak için küçük bir yan proje yapmam istendi. Normalde tüm test ihtiyaçlarımı çözdüğüm arka uç kodu üzerinde çalışıyordum ve henüz GUI için test yazmanın şüpheli zevkini yaşamadım, bu yüzden benim için nasıl ayarlamam biraz net değil EXE için test kodu ve araçlar.

İlk içgüdüm, sadece uygulama koduyla testleri dahil etmekti, ancak bu, müşteriye özel olarak göndermemem talimatı verilen bir dizi teste özgü bağımlılık sağlanmasını gerektiriyordu. Ben (el altında Ben araçları kullanmak gerekir bu yüzden, bir amaçla inşa Test aracı için hiç para dışarı sıkmak da alamıyorum StoryQ , RhinoMocks ve NUnit), basit bir GUI uygulamasının davranışını test etmek için gerçekten fazlasıyla yeterli olmalıdır. Gördüğüm kadarıyla, bu beni tasarımın gerçekten basit tutulması ya da testler uğruna bilerek aşırı mühendislik yapılması arasında iyi bir denge kurmaya çalışmamı sağlıyor. Görünüşe göre ya iş mantığıyla uygulamayı ayrı bir kütüphanede oluşturuyorum ve genellikle yaptığım gibi kütüphaneye karşı test ediyorum ya da uygulama tasarımının yapmadığı ek modülleri bozmadan çalıştırılabilir olmam için başka bir mekanizma buluyorum gerçek ihtiyaç.

Düzenleme:
Lütfen bu sorunun NUnit ve benim yürütülebilir dosya arasındaki ilişkinin nasıl yapılandırılacağını unutmayın - bir DLL'in aksine - sunum ve iş mantığının nasıl ayrılacağı hakkında değil.
/Düzenle

Benim sorum şu:

  1. Durum ve davranışı yeterli bir şekilde kontrol etmeme, eldeki araçları kullanarak ve aşırı mühendisliğe başvurmadan basit bir GUI uygulamasını yapılandırmak için belirli / önerilen bir yöntem var mı?
  2. Bir EXE test ederken (DLL yerine) NUnit'in çağrılması / yapılandırılması gerektiği hakkında temel bir şeyi kaçırdım mı?
  3. Bunların hepsini nasıl gerçekleştireceğime dair örnekler verebilir misiniz veya gösterebilir misiniz?

Bunu yapmanın birden fazla yolu olabileceğinin farkındayım, bu yüzden deneyiminize dayanarak belirli uygulama yönergeleri arıyorum.


NUnit, GUI'leri doğrudan test etmek için tasarlanmamıştır. Görünümü kullanmadan görünümünüze girenleri test edebilmeniz için sunum katmanınızı (ör. Görünüm) verilerinizden ve iş mantığınızdan (ör. Model) ayırmanız gerekir.
Bernard

1
@Bernard Bu soru, test için bir GUI katmanlama ile ilgili değildir. Tüm uygulamalarımı - hatta önemsiz uygulamaları bile - doğal olarak katmanlaştırıyorum, bu yüzden bu benim için gerçekten bir sorun değil. Soruyu uygun şekilde düzenledim ve umarım herhangi bir yanlış anlama giderir. :)
S.Robins

1
EXE'lerde birim test malzemelerinde çok karmaşık bir şey yoktur. Sadece test DLL dosyanız EXE başvurunuz var ve gitmeye hazırsınız.
whatsisname

Yanıtlar:


3

Simoraman'ın cevabına yaptığım yorumlardan birinde bunu yapmanın birkaç yolunu düşündüğümü söyledim. Seçeneklerimden biri, Jalayn'ın yinelenen bir proje oluşturma ve bir DLL oluşturma yanıtındaki öneriye benziyordu , diğer fikrim ise test etmek istediğim kodun bulunduğu projedeki dosyalara bağlanmaktı. Her iki seçenek de işe yarayabilirken, idealden daha az.

İkinci durumda, bağımlılıkları en aza indirmek için mimariyi gerçekten ayıramazsam, yönetilecek birim bağımlılıkların bir karışıklığı olurdu. Bu daha küçük projeler için iyidir, ancak daha büyük projeler kolayca gerçek bir karmaşa haline gelebilir. Bununla birlikte, bu seçeneğe karşı en büyük direnç, bunun saflığı. Tabii ki yapabilirimÇalıştırmak, ancak bunu yaparken, beynimin büyük bir hayır-hayır olan kamu arayüzleri aracılığıyla test etmek yerine, bir montajın iç kısımlarını doğrudan kaynak yoluyla test etmek için kapsüllemeyi kırmam gerekiyor. Aynı şekilde ek bir proje dosyasına sahip olmak, aynı anda iki projedeki çabaların çoğaltılması veya proje dosyası ayarlarını aynı anda iki dosyaya otomatik olarak eklemenin bir yolunu bulmak veya her inşa ettiğimde proje alanını kopyalayıp yeniden adlandırmayı hatırlamak anlamına gelir. Bu, belki de yapı sunucusunda otomatikleştirilebilir, ancak IDE'de yönetmek için bir acı olacaktır. Yine, işe yarayabilir, ancak en iyi ihtimalle bir çamur ve yanlış yaparsanız daha da kötüsü.

En iyi yol, whatsisname'nin soruma yorum yaptığı gibi yapmak ve test projesine bir referans olarak EXE'yi dahil etmek gibi görünüyor. Bir EXE etkin bir şekilde bu durumda bir DLL ile aynı şekilde tedavi olduğu ortaya çıkıyor ve teknemde yüzen her şeyi test etmek için tüm güzel katmanlı sınıflarıma erişebiliyorum .


2

Bence:

  • İşletme testi kodunuz, işletme kodu kitaplığınızı test eden ayrı bir projede olmalıdır.
  • GUI test kodunuz, GUI kitaplığınızı test eden ayrı bir projede olmalıdır. Şimdi, çalıştırılabilir yerine bir GUI kitaplığı nasıl oluşturulur, bunu daha sonra cevaplamaya çalışıyorum.
  • Bir my.namespace.biz.MyClass'ınız varsa, test sınıfınız my.namespace.biz.MyClassTest (veya MyClassTestCase) olmalıdır.
  • Yürütülebilir hedefinizde bulunan kodu test etmek isterseniz, EXE oluşturan bir kurulum ve testlerinizi başlatacağınız kütüphane (DLL) oluşturan başka bir kurulumunuz olmalıdır.

Bunlar Java veya C # olsun, takip etmeyi sevdiğim kurallar (elbette Java ile EXE sorunu yok :-))

Test ortamınızı nasıl yapılandıracağınıza gelince, bana göre en azından şu iki seçeneğiniz var:

MSBuild kullanma

.Proj dosyanızın bir kopyasını oluşturun ( myproject-as-dll.proj deyin ). Değiştir OutputType"klonlanmış dosyasında EXE" ile " Library". MSBuild komutunu kullanarak NUnit test senaryolarını içeren projenize referans olarak ayarlayabileceğiniz bir kütüphane oluşturabilirsiniz.

Benim için mümkün görünüyor, ama hiç bu kadar dürüst kullanmadım, bu yüzden emin değilim. Ayrıca, tümleştirme test sunucunuzda MSBuild olmayabilir ve Visual Studio'dan ayrılabilir mi bilmiyorum ...

NAnt kullanma

NAnt'a aşina değilseniz, proje yapılarınızı onunla nasıl yapılandıracağınızı google'da yapmanız gerekir. Belki kontrol bu , biraz eski ama yazar NAnt dosyaları yorumda bulunmuşsa ve varsa bulmak kendini açıklayıcı (. Düzenleme: daha ayrıntılı olarak onun dosyasını inceleyerek, ben son derece yeniden kullanılabilir onun yapılandırma dosyasını bulmak ). Ayrıca test senaryolarını yürüttüğü ve kod kapsamı araçlarını başlattığı için sadece derlemeden çok daha fazlasını yapar. Şimdi itiraf ediyorum NAnt, Java muadili ve babası "Ant" aksine çok kullandığımı ama aynı şey olduğunu görüyorum ve öğrenmenin bu kadar zor olduğunu düşünmüyorum.

Bu araçla şunları yapmanıza izin verecek bir yapılandırma oluşturabilirsiniz:

  • tüm projelerinizi (iş mantığı, GUI, vb.) ayrı kütüphanelere oluşturun
  • test projelerinizi oluşturun
  • testleri başlatın (bu belirli bölüm NUnit2 göreviyle yapılır ).
  • NCover göreviyle kod kapsamınızı inceleyin .

Biraz daha kodla şunları da yapabilirsiniz:

  • entegrasyon sunucunuzda her gece dağıtım gerçekleştirin
  • entegrasyon sunucunuzda NAnt varsa, zamanlanmış görevlerin yardımıyla gece entegrasyon testlerini başlatın

Tümü, Visual Studio dosyalarınızda hiçbir şey değiştirmeden yapılır. Ve gerçekten, bana aşırı mühendislik gibi gelmiyor, sadece bir dosya. Her şeyin işe yaraması bir, belki iki gün sürebilir, ancak bence iyi bir kurulum olacak.

Son olarak, müşteriye projeleri inşa etmek, test etmek ve çalıştırmak için gerekli olan her şeyi verirdim. Profesyonelliğinizi ve zihninizde kalite ile kod yazdığınızı gösterme eğilimindedir (zarif çözümler aradığınız için bana öyle geliyor)


0

Projenin küçük olması (başlangıçta), uygun mimarinin aşırı mühendislik olduğu anlamına gelmez. Test yazmak istediğiniz gerçeği, projenizin tamamen önemsiz bir kerelik kesmek olmadığını söyler.

Hangi GUI-Framework'ü kullandığınızdan bahsetmediniz. WPF MVVM (Model-View-ViewModel) iyidir ve tüm mantık için testleri kolayca yazmanıza izin verir. WinForms ile MVP (Model-View-Presenter) hakkında iyi şeyler duydum


Yazdığım tüm kodlar için testler yazıyorum. Önemsiz bulabileceğiniz şeyler bile. Test yazmadığım tek zaman başaktır. Bu durumda, bir müşteriye bir kereye mahsus bir yardımcı program gönderiyorum, bu yüzden test sadece bir lüksden daha fazlasıdır, kalite standartlarımızı karşılamak için bir gerekliliktir. "Aşırı mühendislik" açısından, bu iyi veya kötü mimari arasında bir seçim değildir, bunun yerine uygulama nispeten kısa bir yaşam döngüsüne sahip tek bir amaç olduğu için bu örnekte gerekli olmayan ek katmanları dayatma ihtiyacını ortadan kaldırır.
S.Robins

Kılavuz çerçeve seçimi söz konusu olduğunda, bunun test ortamının kurulum şeklini nasıl etkileyeceğini görmüyorum. NASIL mevcut araçları kullanarak GUI katmanı için birim testleri uygulamak için arıyorum. Bu özel cevap bana bununla ilgili hiçbir şey söylemiyor.
S.Robins

Simoraman - Oldukça yargılayıcı ilk paragrafı elinden aldıysanız, bu bir cevaba yönelecektir. Bunu düzeltin ve -1'imi kaldıracağım. @ S.Robins ikinci paragraf unutmayın olan tam bir cevap, yardım edebilirdi olmasa da - ilgili. GUI katmanınız ince, iyi yapılandırılmış ve açıksa ve tüm iş mantığı Model düzeyinde birim testlerle test edilirse, kullanıcı arayüzünü açıkça test etmek için ekstra güçlükten geçmeniz gerekmeyebilir.
Mark Booth

1
@MarkBooth Katmanlama gerçekten sorun değil. Simiraman'ın bahsettiği gibi MVP, MVVM veya daha ince bir şey yapabilirim. Ancak açık test gerektiren GUI'ye özgü bazı unsurlarım var, bu yüzden bunu bir soru olarak yazmaya karar verdim. Birkaç fikrim var ve daha kötüsü kötüleşirse sonunda sorunu çözebileceğimi ve kendime bir cevap yazabileceğimi biliyorum. Ancak ProgrammersSE için iyi bir soru olacağını düşündüğüm için bunu topluma açmak istedim. ;-)
S.Robins

0

Bu soruya verdiğim yanıta bir göz atın: Winforms çözümü için MVP'yi nasıl ayarlarım?

Aslında benim GUI nasıl katman ve nasıl test, gösteren bir örnek uygulama yazdım.

düzenlemenizi okuma: geliştirme ortamınızla bütünleşen bir test çalıştırıcısı kullanın. ReSharper kullanıyorum.


ReSharper önerisi için teşekkürler. Bu, geliştirirken kullandığım bir araç. Ne yazık ki, entegrasyon derleme sunucusunda testleri yürütürken yardımcı olmaz. Ayrıca, test sırasında bir exe'deki koda erişmek için Nunit testlerini nasıl yapılandıracağımı da söylemiyor.
S.Robins

1
Gayri resmi olarak. Exe, uygulama başlangıcının bir parçası olarak sunum yapan kişiyi, modelleri ve görünüm modellerini sınıf kitaplığından yükleyen görünümdür. En azından benim çözümümde, görünüm otomatik testlerle test etmeyecek kadar aptal ve sadece şeylerin doğru yazıldığından ve düğmelerin olması gereken yerde olduğundan emin olmak için kabul testleri yapıyoruz. NUnit-test bir dll yapmak çok kolaydır.
Bryan Boettcher

0

Nunit WinForms'u birkaç yıl önce yazmıştım (sanırım 6 yıl). Özellikle hatırladığım bir şey, bir birim test durumu olmasına rağmen, aynı zamanda uçtan uca test durumu olarak da hareket etmesidir. Bazen bir ön uçta test edilecek çok şey yoktur (basit bir form). Bu nedenle, bir düğmeyi tıklatarak açılan bir ileti kutusunu test etmeye çalışsanız bile, yanlışlıkla diğer katmanlardan diğer çeşitli yöntemleri test ediyorsunuz. Otomatikleştiremeyeceğiniz bazı şeyler var. Görünüm, his ve kullanılabilirlik otomatik birim testi kullanılarak otomatikleştirilemez. Serbest bırakmadan önce bazı manuel testler yapmanız gerekir.


Müşteriniz bir ekranın belirli bir şekilde görünmesi veya belirli bir şekilde değişmesi gerektiğini belirtiyorsa, bunları test edebilmeniz gerekir. Spesifikasyonları test olarak yakalamak BDD metodolojisinin kalbidir ve hiçbir zaman - yaratıcı da olsa - bir testi otomatikleştirmenin bir yolunu bulamadığınız bir durum bulamadım. Asıl soru, testin değerli olup olmayacağı, uygulamanın ilk etapta tüm testleri otomatikleştirmenize izin verecek kadar iyi faktörlü olup olmadığı ve testlerin maliyet etkin olup olmayacağıdır. Yine de katılıyorum, bazen öyle değiller.
S.Robins
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.