Apa saja konvensi penamaan populer untuk Tes Unit? [Tutup]

204

Umum

  • Ikuti standar yang sama untuk semua tes.
  • Perjelas tentang apa masing-masing negara tes.
  • Lebih spesifik tentang perilaku yang diharapkan.

Contohnya

1) MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () 

Public void Sum_simpleValues_Calculated ()

Sumber: Penamaan standar untuk Tes Unit

2) Memisahkan Setiap Kata Dengan Garis Bawah

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 ()

Lain

  • Akhiri nama metode dengan Test
  • Mulai nama metode dengan nama kelas
tersengat
sumber

Jawaban:

94

Saya cukup banyak dengan Anda pada pria yang satu ini. Konvensi penamaan yang Anda gunakan adalah:

  • Jelas tentang apa masing-masing negara tes.
  • Khusus tentang perilaku yang diharapkan.

Apa lagi yang Anda butuhkan dari nama tes?

Bertolak belakang dengan jawaban Ray, saya pikir Tes awalan tidak diperlukan. Itu kode uji, kita tahu itu. Jika Anda perlu melakukan ini untuk mengidentifikasi kode, maka Anda memiliki masalah yang lebih besar, kode pengujian Anda tidak boleh bercampur dengan kode produksi Anda.

Adapun panjang dan penggunaan garis bawah, kode tesnya , siapa yang peduli? Hanya Anda dan tim Anda yang akan melihatnya, asalkan itu dapat dibaca, dan jelas tentang apa yang dilakukan tes, lakukan! :)

Yang mengatakan, saya masih cukup baru untuk menguji dan membuat blog petualangan saya dengan itu :)

Rob Cooper
sumber
20
Kontradiksi ringan "asalkan bisa dibaca, dan jelas" dan "siapa ... peduli". Yah semua orang peduli ketika itu tidak dapat dibaca & jelas, jadi itu sebabnya itu penting. :-)
David Victor
1
Satu argumen tambahan untuk awalan. Saat Anda mencari file di IDE, Anda dapat dengan mudah mencari kasus uji dengan memulai dengan Testdan nama kelas Anda. Jika nama kelas dan nama kelas uji sama, kita akan selalu harus berhenti dan membaca jalur dua file
PENGGUNA INI MEMBUTUHKAN BANTUAN
@ THISUSERNEEDSHELP Saya pikir poin Anda dapat dengan mudah diatasi dengan memiliki struktur folder yang baik seperti src / libs & src / tes . Saya tahu beberapa kerangka uji pelari memang membutuhkan awalan seperti tes untuk identifikasi kode uji, jadi dalam kasus-kasus itu tidak akan dihindari, tetapi untuk sisanya itu bisa menjadi pengulangan tanpa awalan yang diperlukan .
negrotico19
@ negrotico19 Saya sedang memikirkan kasus seperti di IntelliJ ketika Anda Search Everywhere(shift shift) atau Find a Class By Name(CMD O). Saya mendapatkan bahwa itu akan dibedakan oleh struktur folder atau struktur modul, tetapi ketika kita mencari sesuatu, kita sudah tahu apa yang ingin kita cari. Misalnya, jika saya mencari tes, saya ingin membatasi pencarian saya testdan kemudian mencari nama, daripada mencari nama dan kemudian menyaring tes secara manual dengan mata. Ini perbedaan kecil, tetapi jauh lebih mudah untuk "menguji [nama kelas]" dan hanya memiliki satu pop up dan mengurangi beban mental
PENGGUNA INI MEMBUTUHKAN BANTUAN
37

Ini juga layak dibaca: Tes Unit Penataan

Struktur memiliki kelas uji per kelas yang diuji. Itu tidak biasa. Tetapi yang tidak biasa bagi saya adalah dia memiliki kelas bersarang untuk setiap metode yang diuji.

misalnya

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
        }
    }
}

Dan inilah alasannya:

Nah untuk satu hal, ini cara yang bagus untuk menjaga agar tes tetap teratur. Semua tes (atau fakta) untuk suatu metode dikelompokkan bersama. Misalnya, jika Anda menggunakan pintasan CTRL + M, CTRL + O untuk meruntuhkan badan metode, Anda dapat dengan mudah memindai tes Anda dan membacanya seperti spesifikasi untuk kode Anda.

Saya juga suka pendekatan ini:

MethodName_StateUnderTest_ExpectedBehavior

Jadi mungkin sesuaikan dengan:

StateUnderTest_ExpectedBehavior

Karena setiap tes akan berada di kelas bersarang

Lucifer
sumber
2
Bagi mereka yang menggunakan test runner Resharper di Visual Studio, mereka memperbaiki bug menggunakan kelas tes bersarang di 8.x. Sejak itu, ini menjadi struktur pilihan saya sejauh ini.
angularsen
Apakah penting bahwa namanya menjadi sangat panjang dengan pendekatan MethodName_StateUnderTest_ExpectedBehavior? Seperti "InitializeApiConfiguration_MissingApiKey_IllegalArgumentException". Apakah ini benar-benar nama tes yang bagus?
portfoliobuilder
28

Saya cenderung menggunakan konvensi MethodName_DoesWhat_WhenTheseConditionsjadi misalnya:

Sum_ThrowsException_WhenNegativeNumberAs1stParam

Namun, apa yang saya lihat banyak adalah untuk membuat nama tes mengikuti struktur unit pengujian

  • Mengatur
  • Bertindak
  • Menegaskan

Yang juga mengikuti sintaks BDD / Gherkin dari:

  • Diberikan
  • Kapan
  • Kemudian

yang akan menamai tes dengan cara: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

jadi untuk contoh Anda:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

Namun saya lebih suka menempatkan nama metode yang diuji terlebih dahulu, karena dengan demikian pengujian dapat disusun berdasarkan abjad, atau muncul menurut abjad di dalam kotak dropdown anggota di VisStudio, dan semua tes untuk 1 metode dikelompokkan bersama.


Dalam hal apapun, saya seperti memisahkan utama bagian dari nama tes dengan garis bawah, sebagai lawan setiap kata , karena saya pikir itu membuat lebih mudah untuk membaca dan mendapatkan titik uji di.

Dengan kata lain, saya suka: Sum_ThrowsException_WhenNegativeNumberAs1stParamlebih baik daripada Sum_Throws_Exception_When_Negative_Number_As_1st_Param.

CodingWithSpike
sumber
22

Saya memberi nama metode pengujian saya seperti metode lain menggunakan "PascalCasing" tanpa garis bawah atau pemisah. Saya meninggalkan Tes postfix untuk metode ini, karena tidak menambah nilai. Bahwa metode tersebut adalah metode uji ditunjukkan oleh atribut TestMethod .

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

Karena fakta bahwa setiap kelas Uji hanya boleh menguji satu kelas lain saya meninggalkan nama kelas dari nama metode. Nama kelas yang berisi metode tes diberi nama seperti kelas yang diuji dengan postfix "Tes".

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

Untuk metode yang menguji pengecualian atau tindakan yang tidak mungkin, saya awali metode pengujian dengan kata Tidak Dapat .

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

Konversi penamaan saya didasarkan pada artikel "Kiat TDD: Konvensi & Pedoman Penamaan Tes" dari Bryan Cook. Saya menemukan artikel ini sangat membantu.

Jehof
sumber
1
+1 untuk tautan ke pos saya - meskipun tidak perlu menggunakan awalan "Tes" di Tes Anda. Pastikan bahwa tes Anda menentukan perilaku yang diharapkan. Sebagai contoh, CanRetrieveProperCountWhenAddingMultipleItems ()
bryanbcook
2
Saya tidak suka karena itu Tidak termasuk perilaku yang diharapkan
Johannes Rudolph
5

Rangkaian nama pertama lebih mudah dibaca oleh saya, karena CamelCasing memisahkan kata-kata dan bagian bawah underbars dari skema penamaan.

Saya juga cenderung menyertakan "Tes" di suatu tempat, baik dalam nama fungsi atau namespace atau kelas terlampir.

Frank Szczerba
sumber
2
@Jujur metodeName = camelCase MethodName = PascalCase
Metro Smurf
@ metro-smurf: perbedaan yang menarik, saya belum pernah mendengar istilah PascalCase digunakan, dan saya sudah melakukan ini sejak lama. Saya hanya melihat istilah PascalCase muncul di lingkaran pengembang Microsoft, apakah itu yang Anda lakukan?
Frank Szczerba
Sejarah seputar Pascal Casing dan Camel Casing (dari: Brad Abrams - blogs.msdn.com/brada/archive/2004/02/03/67024.aspx ) ... "Dalam desain awal Kerangka kami memiliki ratusan jam debat tentang gaya penamaan. Untuk memfasilitasi debat ini kami menciptakan sejumlah istilah. Dengan Anders Heilsberg (desainer asli Turbo Pascal) anggota kunci tim desain, tidak mengherankan bahwa kami memilih istilah Pascal Casing untuk gaya casing. dipopulerkan oleh bahasa pemrograman Pascal. "
Heliac
-3

Selama Anda mengikuti satu latihan, itu tidak terlalu penting. Secara umum, saya menulis tes unit tunggal untuk metode yang mencakup semua variasi untuk suatu metode (saya punya metode sederhana;) dan kemudian menulis set tes yang lebih kompleks untuk metode yang memerlukannya. Struktur penamaan saya biasanya diuji (peninggalan dari JUnit 3).

Munger
sumber
-8

Saya menggunakan awalan 'T' untuk ruang nama tes, kelas dan metode.

Saya mencoba untuk menjadi rapi dan membuat folder yang mereplikasi ruang nama, kemudian membuat folder tes atau proyek terpisah untuk tes dan mereplikasi struktur produksi untuk tes dasar:

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

Saya dapat dengan mudah melihat bahwa ada sesuatu yang merupakan tes, saya tahu persis apa kode asli yang berkaitan, (jika Anda tidak dapat menyelesaikannya, maka tesnya terlalu berbelit-belit).

Sepertinya konvensi penamaan antarmuka, (maksud saya, Anda tidak bingung dengan hal-hal yang dimulai dengan 'I', Anda juga tidak akan dengan 'T').

Mudah dikompilasi dengan atau tanpa tes.

Itu baik secara teori, dan bekerja cukup baik untuk proyek-proyek kecil.

pengguna566399
sumber
3
Pendekatan yang menarik. Beberapa orang mungkin berpendapat bahwa awalan T bertentangan dengan konvensi yang Anda gunakan dalam obat generik (misalnya func (T1, T2, TResult)), tetapi saya pribadi tidak peduli selama ada konsensus dalam tim. Nama-nama yang singkat membuat hal-hal lebih mudah dibaca juga.
tersengat
Terlalu Hungaria (notasi) bagi saya. Juga, iklan menyengat menyatakan, awalan T digunakan untuk parameter tipe umum.
Danny Varod
Saya setuju, notasi Hongaria telah dikurangi dan karena konflik dengan parameter tipe generik standar, saya tidak melihat pengecualian yang berlaku dalam kasus ini (seperti ada untuk antarmuka).
SonOfPirate