Birim Testleri için bazı popüler adlandırma kuralları nelerdir? [kapalı]


204

Genel

  • Tüm testler için aynı standartları uygulayın.
  • Her test durumunun ne olduğu konusunda net olun.
  • Beklenen davranış hakkında net olun.

Örnekler

1) MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () 

Public void Sum_simpleValues_Calculated ()

Kaynak: Birim Testleri için adlandırma standartları

2) Her Sözcüğü Alt Çizgiyle Ayırma

Public void Sum_Negative_Number_As_1st_Param_Exception_Thrown() 

Public void Sum_Negative_Number_As_2nd_Param_Exception_Thrown () 

Public void Sum_Simple_Values_Calculated ()

Diğer

  • Test ile yöntem adlarını sonlandırma
  • Yöntem adlarını sınıf adıyla başlat

Yanıtlar:


94

Bu adamda seninleyim. Kullandığınız adlandırma kuralları şunlardır:

  • Her test durumunun ne olduğu açık.
  • Beklenen davranış hakkında özel.

Test adından başka neye ihtiyacınız var?

Ray'ın cevabının aksine Test ön ekinin gerekli olduğunu düşünmüyorum . Test kodu, bunu biliyoruz. Kodu tanımlamak için bunu yapmanız gerekiyorsa, daha büyük sorunlarınız vardır, test kodunuz üretim kodunuzla karıştırılmamalıdır.

Alt çizgi uzunluğu ve kullanımına gelince, test kodu , kimin umurunda? Sadece siz ve ekibiniz, okunabilir olduğu ve testin ne yaptığı konusunda net olduğu sürece göreceksiniz! :)

Bununla birlikte, maceralarımı test etmek ve bloglamak için hala oldukça yeniyim :)


20
"Okunabilir ve anlaşılır olduğu sürece" ve "kim ... umurunda" ise hafif çelişki. Herkes okunabilir ve net olmadığında önem veriyor, bu yüzden önemli. :-)
David Victor

1
Önek için bir ek argüman. IDE'de bir dosya ararken, Testve sınıf adınızla başlayarak test senaryolarını kolayca arayabilirsiniz . Sınıf adı ve test sınıfı adı aynıysa, her zaman iki dosyanın yolunu duraklatmak ve okumak zorundayız
BU KULLANICI İHTİYAÇLAR

@THISUSERNEEDSHELP Bence, src / libs & src / test gibi iyi bir klasör yapısına sahip olursanız, noktanızın kolayca aşılabileceğini düşünüyorum . Ben bazı test koşucu çerçeveler gibi bir önek gerektiren biliyorum testi yüzden bu durumlarda kaçınılmalıdır olmaz, test kod tanımlama için, ama geri kalanı için bir tekrarlayan olabilir hayır gerekli önek.
19:45

@ negrotico19 Siz Search Everywhere(vardiya kayması) veya Find a Class By Name(CMD O) IntelliJ'deki gibi bir durum düşünüyorum . Klasör yapısı veya modül yapısı ile ayırt edileceğini anlıyorum , ancak bir şey ararken, ne aramak istediğimizi zaten biliyoruz. Örneğin, bir test arıyorsanız test, aramamı adı aramak yerine adla sınırlamak ve sonra adı aramak ve daha sonra testi manuel olarak filtrelemek istiyorum. Bu küçük bir ayrım, ancak "[sınıf adı]" test etmek ve sadece bir pop-up var ve zihinsel yükü azaltmak çok daha kolay
BU KULLANICI İHTİYAÇLAR

37

Bu da okunmaya değer: Yapılandırma Birimi Testleri

Yapı, test edilen sınıf başına bir test sınıfına sahiptir. Bu olağandışı değil. Ama benim için alışılmadık olan, test edilen her yöntem için iç içe bir sınıfa sahip olmasıydı.

Örneğin

using Xunit;

public class TitleizerFacts
{
    public class TheTitleizerMethod
    {
        [Fact]
        public void NullName_ReturnsDefaultTitle()
        {
            // Test code
        }

        [Fact]
        public void Name_AppendsTitle()
        {
            // Test code
        }
    }

    public class TheKnightifyMethod
    {
        [Fact]
        public void NullName_ReturnsDefaultTitle()
        {
            // Test code
        }

        [Fact]
        public void MaleNames_AppendsSir()
        {
            // Test code
        }

        [Fact]
        public void FemaleNames_AppendsDame()
        {
            // Test code
        }
    }
}

İşte nedeni:

Bir kere, testleri düzenli tutmanın iyi bir yolu. Bir yöntemin tüm testleri (veya gerçekleri) birlikte gruplandırılır. Örneğin, yöntem gövdelerini daraltmak için CTRL + M, CTRL + O kısayolunu kullanırsanız, testlerinizi kolayca tarayabilir ve kodunuz için bir özellik gibi okuyabilirsiniz.

Bu yaklaşımı da seviyorum:

MethodName_StateUnderTest_ExpectedBehavior

Yani belki şu şekilde ayarlayın:

StateUnderTest_ExpectedBehavior

Çünkü her test zaten iç içe bir sınıfta olacak


2
Resharper'ın Visual Studio'da test çalıştırıcısını kullananlar için, 8.x'te iç içe test sınıfları kullanarak hataları düzeltti. O zamandan beri bu benim tercih ettiğim yapı oldu.
angularsen

MethodName_StateUnderTest_ExpectedBehavior yaklaşımıyla adın gerçekten uzun olması önemli mi? "InitializeApiConfiguration_MissingApiKey_IllegalArgumentException" gibi. Bu gerçekten iyi bir test adı mı?
portföy oluşturucu

28

Ben MethodName_DoesWhat_WhenTheseConditionsböyle bir sözleşmeyi kullanma eğilimindedir :

Sum_ThrowsException_WhenNegativeNumberAs1stParam

Ancak, çok gördüğüm test adının, birim test yapısını takip etmesini sağlamaktır.

  • düzenlemek
  • davranmak
  • belirt

Bu da BDD / Gherkin sözdizimini takip eder:

  • verilmiş
  • Ne zaman
  • Sonra

testi şu şekilde adlandırır: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

örnek için:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

Ancak önce test edilen yöntem adını koymayı çok tercih ederim, çünkü daha sonra testler alfabetik olarak düzenlenebilir veya VisStudio'daki üye açılır kutusunda alfabetik olarak sıralanabilir ve 1 yöntem için tüm testler birlikte gruplanır.


Her durumda, test adının ana bölümlerini her sözcüğün aksine alt çizgi ile ayırmayı seviyorum , çünkü testin okunmasını ve puanının daha kolay anlaşılmasını kolaylaştırdığını düşünüyorum.

Başka bir deyişle, seviyorum: Sum_ThrowsException_WhenNegativeNumberAs1stParamdaha iyi Sum_Throws_Exception_When_Negative_Number_As_1st_Param.


22

Ben test yöntemlerimi herhangi bir alt çizgi veya ayırıcı olmadan "PascalCasing" kullanarak diğer yöntemler gibi adlandırın. Ben yöntem için postfix Test'i bırakıyorum , çünkü değer katmıyor. Yöntemin bir test yöntemi olması TestMethod özelliği ile belirtilir .

[TestMethod]
public void CanCountAllItems() {
  // Test the total count of items in collection.
}

Her Test sınıfının yalnızca bir başka sınıfı test etmesi gerektiğinden, sınıfın adını yöntem adının dışında bırakır. Test yöntemlerini içeren sınıfın adı, postfix "Tests" ile test edilen sınıf gibi adlandırılır.

[TestClass]
public class SuperCollectionTests(){
    // Any test methods that test the class SuperCollection
}

İstisnalar veya mümkün olmayan eylemleri test eden yöntemler için, test yöntemini Cannot kelimesiyle önek olarak eklerim .

[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
  // Cannot add the same object again to the collection.
}

Adlandırma konvantürüm, Bryan Cook'un "TDD İpuçları: Test Adlandırma Kuralları ve Yönergeleri" makalesine dayanmaktadır. Bu makaleyi çok yardımcı buldum.


1
Yazıma bağlantı için +1 - Testlerinizde bir "Test" öneki kullanmanız gerekmese de. Testlerinizin beklenen davranışı belirttiğinden emin olun. Örneğin, CanRetrieveProperCountWhenAddingMultipleItems ()
bryanbcook

2
Sevmiyorum çünkü beklenen davranışı içermiyor
Johannes Rudolph

5

CamelCasing sözcükleri ayırdığından ve alt çubuklar adlandırma şemasının bölümlerini ayırdığından, ilk ad kümesi benim için daha okunabilir.

Ben de işlev adı veya ek ad alanı veya sınıf, bir yere "Test" dahil eğilimindedir.


2
@Frank methodName = camelCase MethodName = PascalCase
Metro Şirin,

@ metro-smurf: ilginç bir ayrım, PascalCase terimini hiç duymadım ve bunu uzun zamandır yapıyorum. Sadece PascalCase teriminin Microsoft geliştirici çevrelerinde ortaya çıktığını görüyorum, yaptığınız şey bu mu?
Frank Szczerba

Pascal Casing ve Camel Casing etrafındaki tarih (from: Brad Abrams - blogs.msdn.com/brada/archive/2004/02/03/67024.aspx ) ... "Çerçevenin ilk tasarımında yüzlerce saatimiz vardı tasarım tartışmalarının önemli bir üyesi olan Anders Heilsberg (Turbo Pascal'ın orijinal tasarımcısı) ile kasa stili için Pascal Casing terimini seçmemiz şaşırtıcı değil Pascal programlama dili tarafından popüler hale getirildi. "
Heliac

-3

Tek bir uygulamayı takip ettiğiniz sürece bunun bir önemi yok. Genel olarak, bir yöntemin tüm varyasyonlarını kapsayan bir yöntem için tek bir birim sınaması yazarım (basit yöntemlerim var;) ve sonra bunu gerektiren yöntemler için daha karmaşık sınama kümeleri yazarım. Bu nedenle adlandırma yapım genellikle testtir (JUnit 3'ten bir engel).


-8

Test ad alanları, sınıflar ve yöntemler için bir 'T' öneki kullanıyorum.

Düzgün olmaya çalışıyorum ve ad alanlarını çoğaltan klasörler oluşturmaya, sonra testler için bir test klasörü veya ayrı bir proje oluşturmaya ve temel testler için üretim yapısını çoğaltmaya çalışıyorum:

AProj
   Objects
      AnObj
         AProp
   Misc
      Functions
         AFunc
   Tests
      TObjects
         TAnObj
            TAnObjsAreEqualUnderCondition
      TMisc
         TFunctions
            TFuncBehavesUnderCondition

Kolayca bir şey bir test olduğunu görebiliyorum, tam olarak hangi orijinal kod ile ilgili olduğunu biliyorum, (eğer bunu çalışamazsanız, o zaman test zaten çok kıvrık).

Tıpkı konvansiyon adlandırma arayüzlerine benziyor (yani, 'I' ile başlayan şeylerle karıştırılmayacaksınız, ne de 'T' ile başlayacaksınız).

Testlerle veya testler olmadan derlemek kolaydır.

Zaten teoride iyi ve küçük projeler için oldukça iyi çalışıyor.


3
İlginç bir yaklaşım. Bazı insanlar T önekinin jeneriklerde kullandığınız konvansiyonla (örneğin func (T1, T2, TResult)) çatıştığını iddia edebilir, ancak ekip içinde bir fikir birliği olduğu sürece kişisel olarak umursamıyorum. İsimler kısadır, bu da işleri daha okunabilir hale getirir.
sokulursam

Benim için çok Macarca (gösterim). Ayrıca, reklam adının belirtildiği gibi, T türü önek genel tür parametreleri için kullanılır.
Danny Varod

Katılıyorum, Macarca gösterimi sınırlandırılmış ve standart genel tip parametreleriyle olan çatışma nedeniyle, bu durumda (arayüzler için olduğu gibi) uygulanan bir istisna görmüyorum.
SonOfPirate
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.