Saya baru-baru ini menemukan beberapa kode yang baru ditulis yang diselingi dengan banyak Debug.Assert (C #).
Haruskah kita masih menggunakan ini secara luas meskipun penggunaan TDD, BDD dan Unit Testing secara umum?
Saya baru-baru ini menemukan beberapa kode yang baru ditulis yang diselingi dengan banyak Debug.Assert (C #).
Haruskah kita masih menggunakan ini secara luas meskipun penggunaan TDD, BDD dan Unit Testing secara umum?
Jawaban:
Saya tidak melihat alasan mengapa Anda tidak boleh menggunakan Assert. Dengan melakukan itu, Anda telah mengakui adanya kebutuhan akan penjaga, seperti prasyarat & invarian, dan membuat langkah menuju Desain berdasarkan Kontrak . Menyatakan hanya satu cara untuk mencapai ini ...
// Precondition using Asert
void SomeMethod(Foo someParameter)
{
Debug.Assert(someParameter != null)
}
// Precondition using If-Then-Throw
void SomeMethod(Foo someParameter)
{
if (someParameter == null)
throw new ArgumentNullException("someParameter");
}
// Precondition using Code Contracts
void SomeMethod(Foo someParameter)
{
Contract.Requires(someParameter != null);
}
// Precondition using some custom library
void SomeMethod(Foo someParameter)
{
Require.ArgumentNotNull(() => someParameter);
}
Semua cara mencapai hal yang sama: ketahanan dalam kode. Itu hanya datang untuk memilih opsi, di mana Assert adalah pilihan yang valid.
Perhatikan bahwa saya belum menyebutkan tes unit sama sekali sejauh ini, karena mereka mencapai sesuatu yang sangat berbeda. Tes unit secara formal membuktikan kekokohan kode dengan melatih penjaga:
[Test]
void SomeMethod_WhenGivenNull_ThrowsArgumentNullException()
{
delegate call = () => someObject.SomeMethod(null);
Assert.That(call).Throws<ArgumentNullException>();
}
Ini adalah jenis pernyataan yang sepenuhnya berbeda ...
** Perhatikan bahwa dalam beberapa kerangka kerja sebenarnya cukup sulit untuk menguji unit untuk kegagalan pernyataan, karena kegagalan pernyataan dapat menurunkan seluruh runtime, jadi salah satu opsi lain mungkin lebih disukai ... *
Saya menganggap tes menegaskan dan unit menjadi dua alat yang berbeda di kotak alat saya. Beberapa hal lebih cocok untuk satu, dan beberapa lebih cocok untuk yang lain.
Sebagai contoh, hari ini saya lebih banyak menggunakan pernyataan untuk memvalidasi parameter untuk metode non-publik.
Saya melihat Debug.Assert sebagai optimasi prematur saat ini. Kecuali Anda benar-benar membutuhkan kinerja, menekan Assert dalam mode rilis dapat menyembunyikan bug lebih lama.
Sebagai MattDavey poin kontrak kode bisa menjadi unggul, menyediakan statis memeriksa bukannya memeriksa dinamis, dan jika tidak tersedia saya lebih memilih Trace.Assert atau tua polosif(x) throw SomeException;
Debug
kelas akan dilewati dari kompilasi ... jadi menekan panggilan untuk Assert
hanya untuk kinerja bukan hanya optimasi prematur, itu omong kosong belaka.