Nasıl birimi kod-jeneratör test etmeliyim?

oy
23

Bu bildiğim zor ve açık uçlu bir sorudur, ama ben yere atmak ve herkes herhangi ilginç öneri olsaydı görmek istedim.

Ben (yudum aracılığıyla oluşturulur) C ++ koduna bizim piton arayüzünü alır ve WebServices olarak bu ortaya çıkarmak için gerekli kod üreten kod jeneratörü geliştirdik. Bu kodu geliştirdi zaman TDD kullanarak yaptım ama cehennem gibi kırılgan olmak benim testleri buldum. her test esasen ben outputted kod belirli bir bit ben giriş XML dosyalarındaki Test tanımlarını okur ve testi üreten küçük motor yazdı alırdım (C ++ başlığını olur) giriş kodunun belli bir süreliğine doğrulamak için istediğim için bu beklentiler gelen vakalar.

Sorun Hiç kodunu değiştirmek gidiyor korkuyorum edilir. Bu ve birim kendilerini test gerçeği bir şunlardır: karmaşık ve b: kırılgan.

Bu yüzden bu soruna alternatif yaklaşımlar düşünmeye çalışıyorum, ve ben belki yanlış anladı mücadele ediyorum beni vurur. Belki IE, sonuca daha fazla odaklanmak gerekir: Aslında ziyade, kod çalıştırmak ve ben bunu ne istersem oluşturur mu, kod ı istediğiniz şekilde görünüyor.

Herkes onlar paylaşmak ister misiniz buna benzer bir şeyin herhangi bir deneyimleri var mı?

Oluştur 14/08/2008 saat 12:59
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
12

Geri döndüm ve sorunuzu yeniden okumak ve zaten aynı sorunlar üzerine kendini dokundu bulundu, yerine kod düzeni / görünüm yürütülmesi sonuçlarına odaklanmak sonra, kendi kod üreteci ile benim deneyim bir özetini kadar yazmaya başladı.

Sorun bu, oluşturulan kod aslında birim test sisteminin ortamında çalıştırmak için uygun olmayabilir test etmek zordur, ve nasıl beklenen sonuçları kodlamak mı?

Sana küçük parçalara ve birim testi olanlar içine kod oluşturma yıkmak gerektiğini tespit ettik. Bana sorarsanız tam bir kod üreteci test Birim fazla birim testinden daha entegrasyon testi gibidir.

Cevap 14/08/2008 saat 13:04
kaynak kullanıcı

oy
0

Evet, sonuç önemli olan tek şey vardır. Gerçek angarya Oluşturulan kod ... bağımsız çalışan orada vakit sağlayan bir çerçeve yazıyor.

Cevap 14/08/2008 saat 13:38
kaynak kullanıcı

oy
0

Üzerinde çalıştırıyorsanız * nux bir bash komut dosyası veya makefile'daki lehine unittest çerçeveyi damping düşünebilirsiniz. pencerelerde Jeneratörü çalışır ve daha sonra (başka bir işlem gibi) ve bu unittest kodu kullanan bir kabuk uygulaması / işlevi oluşturmak düşünebilirsiniz.

Üçüncü bir seçenek kodu oluşturmak ve daha sonra bir unittest başka bir şey içerir ondan bir uygulama geliştirmenin olacaktır. Yine her giriş için bu çalıştırmak için bir kabuk komut dosyası durumlarda ne gerekir. beklenen davranış kodlamak için nasıl göstereceği için, C ++ kodu için olduğu gibi sadece ziyade C ++ birden oluşturulan arayüz kullanarak hemen hemen aynı şekilde yapılabilir diye düşündüğüm oluyor.

Cevap 14/08/2008 saat 14:46
kaynak kullanıcı

oy
5

"Birim test" test sadece bir tür olduğunu hatırlayın. Sen birim testi gerekir kodunuzu jeneratör parçaları. Burada asıl bakıyoruz (regresyon testi aka) sistem düzeyinde testidir. Farklı zihniyet, yaklaşım, beklentiler vb Kesinlikle fazla iş var ... sadece semantik değil, ama muhtemelen mermi ısırır, uçtan uca regresyon test takımı kurmak gerekir: Sabit C ++ dosyaları -> yudum arayüzleri -> piton modülleri -> bilinen çıktı. Gerçekten (nihai Python programının ne çıkar) beklenen çıkışı karşısında bilinen girişi (sabit C ++ kodu) kontrol etmek istiyorum. Kod üreteci sonuçlarını kontrol etme doğrudan nesne dosyalarını diffing gibi olurdu ...

Cevap 14/08/2008 saat 17:15
kaynak kullanıcı

oy
0

Bazı kurulum ve doğrulama kodu içinde onları yerleştirerek kod bireysel parçalarını test edebilirsiniz: Sadece sonuçlarının doğrulanması sırasında yine ince taneli test elde edebilirsiniz işaret etmek istedim:

int x = 0;
GENERATED_CODE
assert(x == 100);

Sağlanan Eğer oluşturulan kod küçük parçalar monte var ve parçalar, sık sık değişmez Eğer fazla koşul egzersiz yapabilirsiniz ve biraz daha iyi test etmek ve umarım bir yığın özelliklerini değiştirdiğinizde tüm testleri kırmak zorunda kalmamak.

Cevap 16/09/2008 saat 08:41
kaynak kullanıcı

oy
0

Birim test Belli bir birim test sadece budur. sınıf A için şartname yazıyorsanız eğer sınıf A sınıfı B ve C gerçek somut sürümlerini yoksa Yani, ideal

Ok Bu soru için etiket C ++ / Python içerir, ancak mantık aynıdır sonradan fark ettik:

    public class A : InterfaceA 
    {   
      InterfaceB b;

      InterfaceC c;

      public A(InterfaceB b, InterfaceC c)   {
          this._b = b;
          this._c = c;   }

      public string SomeOperation(string input)   
      {
          return this._b.SomeOtherOperation(input) 
               + this._c.EvenAnotherOperation(input); 
      } 
    }

Yukarıdaki Sistem A sistemleri B ve C arayüzleri enjekte olduğundan, gerçek işlevselliği kalmadan başka sistem tarafından birim test sadece sistem A yürütülmektedir olabilir. Bu birim testidir.

Burada davranış her parça için zaman belirtimi farklı olan tamamlanma oluşturma bir sistem yaklaşan için akıllı bir şekilde olduğunu:

public class When_system_A_has_some_operation_called_with_valid_input : SystemASpecification
{
    private string _actualString;

    private string _expectedString;

    private string _input;

    private string _returnB;

    private string _returnC;

    [It]
    public void Should_return_the_expected_string()
    {
        _actualString.Should().Be.EqualTo(this._expectedString);
    }

    public override void GivenThat()
    {
        var randomGenerator = new RandomGenerator();
        this._input = randomGenerator.Generate<string>();
        this._returnB = randomGenerator.Generate<string>();
        this._returnC = randomGenerator.Generate<string>();

        Dep<InterfaceB>().Stub(b => b.SomeOtherOperation(_input))
                         .Return(this._returnB);
        Dep<InterfaceC>().Stub(c => c.EvenAnotherOperation(_input))
                         .Return(this._returnC);

        this._expectedString = this._returnB + this._returnC;
    }

    public override void WhenIRun()
    {
        this._actualString = Sut.SomeOperation(this._input);
    }
}

Yani sonuç olarak, tek bir ünite / şartname birden davranışlara sahip olabilir ve birim / sistemi geliştirmek olarak şartname büyür; Test altındaki sistem içindeki diğer beton sistemlerine bağlıdır ve eğer dikkat.

Cevap 19/05/2010 saat 22:17
kaynak kullanıcı

oy
0

Benim tavsiye bilinen böyle zaten yerinde olan bazı basit durumlarda olarak giriş-çıkış sonuçlarına ve bir dizi anlamaya olacağını birim testi üretilir kodu . Size üretilen tam dize biraz farklı olabilir jeneratör değiştikçe bu tamamen mümkün ... ama ne gerçekten umurumda aynı şekilde yorumlanır olup olmadığıdır. Senin özelliği olsaydı bu kodu test olacağını gibi sonuçları test eğer istediğiniz şekillerde başarılı olursa Böylece, dışarı bulacaksınız.

(: Imkansız da) Temelde, ne gerçekten bilmek istiyorum senin jeneratör fiziksel olası her kombinasyonu test etmeden beklediğiniz üretecek olup olmadığıdır. senin jeneratör zaman beklediğiniz şekilde tutarlı olduğunu sağlayarak, jeneratör her zaman olduğundan daha karmaşık durumlarda başarılı olacağından daha iyi hissedebilirsiniz.

Bu şekilde, aynı zamanda regresyon testlerinde (düzgün çalışmaya devam etmek gerekir birim testleri) paketi oluşturabilirsiniz. Bu, jeneratöre değişiklikler kod diğer formları kırarak değil emin olmasına yardımcı olacaktır. Eğer birim testleri anlayamadım bir hata karşılaştığınızda, bunun benzer kırılmayı önlemek için eklemek isteyebilirsiniz.

Cevap 25/07/2010 saat 22:56
kaynak kullanıcı

oy
0

Ben size bunu üretmek nasıl daha üreten şeyin test etmek gerektiğini bulmak.

Benim durumumda, program, bir web uygulaması içine derlemek birçok kod türlerini (C #, HTML, SCSS JS, vb) üretir. Ben regresyon hataları azaltmak için buldum iyi yolu genel değil jeneratör test ederek, web uygulaması kendisini test etmektir.

Beni yanlış anlamayın, hala jeneratör kod kısmını kontrol ünitesi testleri vardır, ama bizim karşılığını bizim en büyük patlama meydana uygulamanın kendisinde UI testleri olmuştur.

Bunu elde edip bu yana biz de biz programlama yoluyla uygulamayı test etmek için kullanabileceğiniz JS güzel soyutlama oluşturur. Biz bazı fikirler burada özetlenen takip: http://code.tutsplus.com/articles/maintainable-automated-ui-tests--net-35089

Büyük kısmı gerçekten aslında üreten şeyle dışarı kod kuşaktan, sistem uçtan uca test olmasıdır. Bir test başarısız olduğunda onun kolay jeneratör kırdı yere geri izlemek için.

Oldukça tatlı.

İyi şanslar!

Cevap 20/07/2015 saat 03:10
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more