Tegas pesan dalam tes

Halo lagi. Untuk mengantisipasi dimulainya kursus "Pengembang C #", kami telah menerjemahkan materi menarik tentang pesan penegasan dalam ujian dan dengan senang hati berbagi terjemahan dengan Anda.




Dalam posting ini kami akan berbicara tentang apakah Anda harus menggunakan pesan Tegas dalam pengujian Anda.

Saya menerima pertanyaan menarik dari kolega pembaca, yang ingin saya bahas lebih detail:

Saya punya pertanyaan tentang pesan Tegas: haruskah saya menggunakan kelebihan yang berisi parameter pesan dan menggunakannya untuk mengirim string yang menjelaskan alasan kegagalan Tegas (juga β€œKlaim”) ?

Jawaban untuk pertanyaan ini diturunkan ke dua aspek:

  • Keterbacaan tes - betapa mudahnya memahami apa yang dilakukan tes.
  • Kemudahan diagnosis - betapa mudahnya memahami mengapa tes gagal.

Mari kita bahas masing-masing secara individual

Keterbacaan tes


Orang sering menggunakan pesan Tegas untuk membantu anggota tim dan diri mereka sendiri di masa depan memahami apa yang terjadi dalam ujian. Mari kita lihat contoh berikut:

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    Assert.AreEqual(UserType.Employee, person.Type); //  
    Assert.AreEqual(1, company.NumberOfEmployees); //  
}

Alih-alih menegaskan, Anda juga dapat menunjukkan alasan mengapa tes menegaskan memvalidasi sesuatu:

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    Assert.AreEqual(UserType.Employee, person.Type, "Person must become an employee after hiring");
    Assert.AreEqual(1, company.NumberOfEmployees, "Number of employees must increase");
}

Pernyataan seperti itu membantu, tetapi harganya harus dibayar. Pesan-pesan ini mengharuskan Anda

  • Luangkan waktu untuk menulisnya
  • Terus bergerak maju

Di sini himpunan pro dan kontra sama dengan komentar pada kode. Dan, seperti dalam kasus komentar, saya menyarankan Anda: jangan menulis pesan tegas untuk tujuan keterbacaan. Jika Anda merasa tes ini tidak jelas tanpa menegaskan pesan, coba refactoring saja. Dalam jangka panjang, lebih mudah untuk membuat tes berbicara sendiri daripada membuatnya tetap sinkron dengan pesan tegas (dan ini hanya masalah waktu sebelum sinkronisasi rusak).

Masukkan pesan tegas hanya bila benar-benar diperlukan - saat Anda tidak dapat meningkatkan keterbacaan tes dengan cara lain. Tetapi bahkan kemudian, cenderung untuk memilih untuk tidak menulisnya.

Cara termudah untuk mendapatkan keuntungan cepat dalam keterbacaan tes adalah beralih ke catatan pernyataan yang dapat dibaca. Misalnya, NUnit memiliki model pernyataan berbasis kendala khusus yang membantu Anda menulis pernyataan dengan cara berikut:

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    Assert.That(person.Type, Is.EqualTo(UserType.Employee));
    Assert.That(company.NumberOfEmployees, Is.EqualTo(1));
}

Atau Anda dapat menggunakan Pernyataan Fasih favorit saya :

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    person.Type.Should().Be(UserType.Employee);
    company.NumberOfEmployees.Should().Be(1);
}

Pernyataan-pernyataan ini dibaca dalam bahasa Inggris sederhana - persis seperti yang Anda inginkan agar semua kode Anda dibaca. Kita manusia lebih suka melihat informasi dalam bentuk cerita. Semua cerita mematuhi model ini:

[] [] [].

Contohnya,

  .

Di sini - subjek, - aksi, dan - objek. Hal yang sama berlaku untuk kode.

Versi ini

company.NumberOfEmployees.Should().Be(1);

membaca lebih baik daripada

Assert.AreEqual(1, company.NumberOfEmployees);

justru karena sejarah dilacak di sini.
, . , .


Pandangan lain dari pesan tegas adalah dalam hal kemudahan diagnosis. Dengan kata lain, kesederhanaan memahami penyebab kegagalan tes tanpa memeriksa kode untuk tes ini. Ini berguna saat membaca hasil perakitan CI.

Dari sudut pandang diagnostik, ikuti panduan ini: jika Anda dapat dengan mudah memulai kembali tes secara lokal, tes ini tidak memerlukan pesan yang tegas. Ini berlaku untuk semua tes unit (karena mereka tidak bekerja dengan dependensi out-of-proses), tetapi pada tingkat yang lebih rendah untuk tes integrasi dan end-to-end.


Menguji piramida

Saat Anda naik lebih tinggi dalam piramida pengujian, Anda mungkin memerlukan informasi lebih rinci, karena tes integrasi (dan terutama ujung-ke-ujung) lebih lambat dan Anda mungkin tidak dapat menjalankannya kembali sesuka hati.

Tetapi bahkan dengan integrasi dan tes ujung ke ujung, ada cara untuk memfasilitasi diagnostik tanpa menggunakan pesan konfirmasi:

  • Jadikan tes tes sebagai modul perilaku - ketika tes memeriksa satu hal, seringkali mudah untuk menentukan apa yang salah. (Ini tidak selalu berlaku untuk tes ujung ke ujung, karena Anda mungkin ingin tes ini untuk memeriksa bagaimana beberapa unit perilaku bekerja erat).
  • Beri nama tes unit Anda sesuai - Nama tes ideal menggambarkan perilaku aplikasi dalam istilah bisnis sehingga bahkan non-programmer dapat memahaminya.

Dan jangan lupa bahwa bahkan tanpa pernyataan pengguna, Anda masih memiliki pesan yang dihasilkan oleh lingkungan pengujian unit untuk Anda.

Misalnya, kesalahan dalam pernyataan berikut:

person.Type.Should().Be(UserType.Employee);

memberikan pesan kesalahan berikut:

Xunit.Sdk.EqualException: Assert.Equal() Failure
Expected: Employee
Actual:   Customer

Kombinasi pesan tersebut dihasilkan oleh lingkungan dan nama tes yang dapat dibaca manusia membuat 90% dari pesan yang menegaskan pengguna tidak berguna bahkan dalam hal kemudahan diagnosis. Satu-satunya pengecualian adalah tes ujung ke ujung yang panjang. Mereka sering berisi pemeriksaan multi-tahap, jadi masuk akal untuk menggunakan pesan tegas tambahan untuk memahami langkah mana yang gagal. Namun, seharusnya tidak ada banyak tes end-to-end seperti itu.

Tentu saja, untuk memanfaatkan pesan kesalahan yang dihasilkan oleh kerangka kerja, Anda harus menghindari perbandingan Boolean yang umum, seperti:

(person.Type == UserType.Employee).Should().BeTrue();

Karena mereka mengarah ke pesan kesalahan berikut:

Xunit.Sdk.TrueException: Assert.True() Failure
Expected: True
Actual:   False

Yang sama sekali tidak membantu dengan diagnosis.

Ringkasan


Apakah Anda sering merasa malas ketika harus menulis pernyataan? Nah, sekarang Anda bisa membenarkannya dan mengirim kolega Anda ke artikel ini.


"Saya senang bahwa ini memiliki nama" Di

samping lelucon, bagaimanapun, ini adalah ringkasannya:

  • Ada dua aspek untuk menggunakan pesan tegas:
    • Keterbacaan tes (betapa mudahnya memahami apa yang dilakukan tes).
    • Kemudahan diagnosis (betapa mudahnya memahami mengapa tes gagal selama CI membangun).
  • Dalam hal keterbacaan tes, pesan menegaskan adalah komentar kode. Alih-alih mengandalkan mereka, refactor tes Anda untuk mencapai keterbacaan.
  • Dalam hal kemudahan diagnosis, alternatif terbaik untuk menegaskan pesan adalah:
    • Menguji modul perilaku tunggal dengan tes
    • Penamaan tes dalam istilah bisnis
  • Satu-satunya pengecualian adalah tes ujung ke ujung yang panjang.

Itu saja. Anda dapat mempelajari lebih lanjut tentang kursus kami di webinar gratis , yang akan diadakan hari ini.

All Articles