Kontrolörler için neden birim testleri yazdınız?


22

Bana göre bu tamamen alakasız bir birim testi ve neden birisinin onu yazmak için zaman harcadığını anlamıyorum, çünkü ondan kazanılacak çok az değer var. Yöntemi bir tarayıcıda yürüterek bu denetleyici istenen türü döndürdüyse çok iyi bilirim. Gerçekten, bunun için bir testin gerekli olduğuna inanıyor musunuz ve neden?

public class ConstituencyControllerTests
{
    private ConstituencyController _constituencyController;
    private Mock<IConstituencyService> _IConstituencyServiceMock;

    public ConstituencyControllerTests() {
        _IConstituencyServiceMock = new Mock<IConstituencyService>();
    }

    [Test]
    public async Task I_Check_For_Return_Type_And_Result() {
        _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object );

        var result = await _constituencyController.Get();
        var content = ( (dynamic)result ).Content;

        Assert.IsEmpty( content );
        Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result );
        _IConstituencyServiceMock.Verify( x => x.ListOfConstituencies(), Times.Once() );
    }
}


7
@Gnat ile aynı fikirde değilsin. Bu, zorunlu olarak dil yapılarıyla ilgili değil, bir denetleyici tarafından döndürülen sonucun türü ile ilgilidir. Kalıtım hiyerarşisine sahip olmadığınız zaman aynı şeyi sıralamak için kaynaşabilirken, kontrol cihazı Ataların geri verilmesini beklediğinde tamamen farklı bir canavara dönüşür; ... Ayrıca böyle bir yöntemin test edilmesinin neden iyi bir fikir olabileceğini de cevaplar ...;) Ünite testleri, bir şeyde bir değişikliğin başka bir şeyi kırdığı durumlarda ortaya çıkması anlamına gelir.
Marjan Venema,


Kabul etme eğilimindeyim, genellikle uygulamanın giriş noktalarını test etmek için fazla zaman birimi harcamıyorum. Bir konsol uygulamasının ana yöntemini test etmek gibidir. sadece bana çok az mantıklı geliyor.
Mvision

Yanıtlar:


29

Anahtar nokta burada:

Bu denetleyici, yöntemi bir tarayıcıda yürüterek istenen türü döndürdüyse çok iyi bilirim

Birim tespiti, kendiniz göründüğünüz gibi, regresyon olmayan testlerin basit kod birimlerinin otomasyonu ile ilgilidir. Uygulamanızda daima birim tespiti yapmak istemezsiniz.

EDIT: @anotherdave yorum ekleniyor:

Ölçeklendirme kolaylığı ile ilgili. Bir denetleyiciyi tarayıcıda test etmek uygun olabilir; 10, 20, 50 denetleyiciden ne haber? Testi bir kez yazacaksınız; ek yükü olan denetleyiciyi değiştirdiğinizde güncellemeniz gerekebilir. Ama ne sıklıkla konuşlandırıyorsunuz? Her seferinde kesinlikle bir manüel kontrol, testten daha çok ek yük olduğunu

@ Vladislav'ın cevabına bir alternatif olarak , ünite testi kesinlikle her şey bir üstesinden gelebilir ve gerçekten istenmeyen olabilir. Daha hafif bir şeye ihtiyacınız olursa, Selenyum kullanarak daha yüksek düzeyde regresyon dışı testler yapabilirsiniz. Elbette ünite testinden daha az kapsama alırsınız, ancak ünite testini yaparken daha az zaman alan ve daha esnek olan bir maddi kapsama alabilirsiniz.

Diğer bir deyişle, basit bir elemanı her değiştirdiğinizde bir veya daha fazla testi güncellemeniz gereken her şeyi test ederseniz.


4
Ayrıca yeniden eklemek için: I would know perfectly well if this controller returned the wanted type by executing the method in a browser.- bu ölçeklendirme kolaylığı ile ilgili. Bir denetleyiciyi tarayıcıda test etmek uygun olabilir; 10, 20, 50 denetleyiciden ne haber? Testi bir kez yazacaksınız; ek yükü olan denetleyiciyi değiştirdiğinizde güncellemeniz gerekebilir. Ama ne sıklıkla konuşlandırıyorsunuz ? Her seferinde bir manuel kontrol kesinlikle testten daha fazla ek yük olduğunu kontrol eder.
16'da başka bir dave

"Ünite teslimi otomasyonla ilgilidir" - Doğru, ancak entegrasyon testi de (Selenyum / Web sürücüsü / vb.). Ünite testlerinin entegrasyon testlerinden daha hızlı uygulanmasının bu kadar kesin ve kuru olduğunu düşünmüyorum. Birçoğu yaklaşıma bağlıdır, ancak eğer etkili bir birim testi yaptırmak bir düzine farklı hizmeti ve her biri için yapılan çağrıları reddetmeyi gerektiriyorsa, bir entegrasyon testinin uygulanması daha hızlı ve daha basit olabilir (genellikle çalışması çok daha yavaş olsa da, evet) . Mesele şu ki, çoğu bağlamda ve test edilen kodun karmaşıklığına bağlı.
aroth

@anotherdave yorum eklendi
Walfrat

@Asayıma göre tam tersi oldu, tam birim testi bir kod çok zaman alan ve değiştirmek için bazı birim testi yapmadan kodun değiştirilmesini çok zorlaştıran bir şey. Entegrasyon testi daha hafiftir. Elbette ünite testinin çok karmaşık bir şey yapmasını istersiniz, ancak üniteyi test ettiğiniz için değil, her şeyi ünite test etmeniz gerekir. Yine var ki, olmadığı yerlerde gümüş mermiyi arayan insanları görüyoruz.
Walfrat

24

Kontrolörler için neden birim testleri yazdınız?

Çünkü bağlamı bilmeden, bunu ya da bunu test etmeniz gerekip gerekmediğinden emin olamazsınız. İşte bazı nedenler, denetleyicileri neden test etmek isteyebilirsiniz:

  • denetleyici, hataya açık karmaşık hizmet kablolama mantığı içerebilir. Hizmetlerin kendileri işe yarayabilir, test etmek istediğiniz sonuçtur ve bazı nedenlerden dolayı uygulamanıza düzenleme katmanı eklememeyi düşündüğünüz
  • kontrol cihazlarınız uygulamanın BÜTÜN iş mantığını içerir ve kontrol cihazlarının aslında test edebileceğiniz tek şey vardır (lütfen ideal yaşam kodları ile çalıştığınız tüm yaşamınız, bu tür kod tabanları var, inan bana)
  • takımın% 99 dahi ve ortalama insanın% 1'inden oluşuyor ve bu% 1'i maaşlarındaki böceklerden uzak tutmak istiyorsun.

2
Eklemek isterim: "Gelecekte projeden kimin çıkacağını tahmin edemezsiniz ve testler kendinden belgelendirilmiş kodun bir parçası"
Laiv

4
Orta noktaya göre, akılda test olmadan oluşturulmuş bir proje, alaysız bir kontrolör testinden başka bir şekilde test edilemez. Bakımları tam olarak böyle bir projeye sahip olan bir C # ekibi ile çalışıyorum, bu yüzden daha hassas testler yapabilmek için gerekli yapıyı (arayüzler vb.) Ekleyene kadar kontrolör testleri yapıyorlar.
Wayne Conrad

1

OP’ye tamamen katılıyorum.

Bir denetleyici için bir birim testi anlamsızdır. Denetleyicilerinizi dolaylı olarak regresyon testleriyle (örneğin Selenyum kullanarak) test edersiniz.

Denetleyicinin kullandığı tüm bileşenleri / nesneleri TDD'ye yerleştirmeli ve denetleyicileri mümkün olduğu kadar ince tutmalısınız. O zaman her şey düzgün bir şekilde test edildi. Emin olmak istediğiniz şey, web isteklerini gerçekleştirirken her şeyin birlikte iyi çalışmasıdır. Bu regresyon testi.


Belki öyle, ama bu sorunun cevabı değil. Aslında, burada birim testlerinin kullanımına karşı bir argümandır.
JᴀʏMᴇᴇ

Sanırım "bunun için bir testin gerekli olduğuna inanıyor musunuz ve neden?" Sorusunu cevapladım.
16'da

Evet, sanırım @winkbrace ve bu konuda aynı düşünceleri paylaşıyorum. Ama aynı zamanda, test etmen gereken şeyle ilgili bir tartışma olduğuna inanıyorum. Bence insanlar çok fazla test ediyor ve "yanlış" şeyleri. Benim örneğimde, denetleyiciyi test etmek çok az değer veriyor çünkü çok ince ve umarım hizmetleri çevreleyen testler yapıyor. Buradaki tüm cevaplar anlamlıdır ve iyi puanlara sahiptir, ancak bir tanesini doğru cevap olarak tanımlamak gerçekten mümkün değildir.
Donlar

Denetleyici mantığı, ayrı ayrı bileşenler için birim testlerinden ayrı ve ayrı otomatik entegrasyon testleri kullanılarak test edilebilir.
KevBurnsJr 17:17

-1: Bir denetleyici için yapılan bir birim testi anlamsız olabilir . Kontrolörler dönüşümle ilgilidir, ancak bazen dönüşümün kendisi karmaşıktır ve bir geliştirici bunu kapsam altına almak isteyebilir. Ayrıca, birim testlerinin 1) nihayetinde bir uygulamanın doğrulanması ile ilgili olduğunu, mutlaka üst düzey davranışların doğrulanması gerekmediğini ve 2) çok hızlı olması gerektiğini düşünüyorum. . Her iki nitelik de birim testlerini uygulama süresi boyunca çok daha faydalı kılmaktadır; Başka bir deyişle, eninde sonunda bir geliştirici aracıdır ve tesadüfen ürün kalitesini doğrulamanın bir yoludur.
rsenna
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.