Test başına yalnızca bir iddiada bulunmanız gerekiyorsa; birden fazla giriş nasıl test edilir?


15

Bazı test senaryoları oluşturmaya çalışıyorum ve denemelisiniz ve test senaryosu başına iddia sayısını sınırlamanız gerektiğini okudum.

Benim sorum şu, birden çok girişle bir işlevi test etmenin en iyi yolu nedir? Örneğin, kullanıcıdan bir dize ayrıştırır ve dakika sayısını döndüren bir işlevi var. Dize şeklinde olabilir "5w6h2d1m", w, h, d, mhaftalar, saat, gün ve dakika sayısını karşılık gelmektedir.

'Test kuralı başına 1 iddia' yı takip etmek istersem, her girdi varyasyonu için birden fazla test yapmam gerekir mi? Bu aptalca görünüyor, bunun yerine sadece şöyle bir şeyim var:

self.assertEqual(parse_date('5m'), 5)
self.assertEqual(parse_date('5h'), 300)
self.assertEqual(parse_date('5d') ,7200)
self.assertEqual(parse_date('1d4h20m'), 1700)

Bir test durumunda. Daha iyi bir yol var mı?


Bunu yapmanın en iyi yolu parametreleri kullanmaktır (bazı çerçeveler bu özelliği destekler, tüm çerçeveler gerekir). Bu şekilde tek bir davranışı test edersiniz, ancak birçok test vakasını dikkate alırsınız ve yine de bir hata oluşursa hangi parametre değerlerinin hataya neden olduğunu görebilirsiniz
Kemoda

Yanıtlar:


23

Her test "kuralı" için tek bir iddiayı görüntülemenin daha pragmatik bir yolu, iddialarınızın tek bir testte tek bir kavramı kapsamasıdır.

Bu şekilde, tek bir kavramı tek bir testte test ediyorsunuz. Sizin durumunuzda, giriş dizenizin tek bir tarihte doğru bir şekilde ayrıştırılıp ayrıştırılmadığı.

Birden fazla iddia ile tek bir kavramı test edip etmediğinizi veya birçok testte tek bir iddiada bulunup bulunmadığınızı kontrol etmek için kararınızı vaka bazında kullanmalısınız.

Daha net testler, daha az tekrarlama yapan ve testlerinizin yönteminizdeki farklı hata noktalarını vurgulayabilmesini sağlayan seçeneği tercih edin. Bir testin neyin yanlış gittiğini bulmak için testinizde hata ayıklamak yerine tam olarak ne olduğunu başarısızlıkla sonuçladığında net olmasını istersiniz.


17

Bu, test kitaplığınıza çok bağlıdır. C # kütüphanesinde NUnit gibi bir şey yapabilirsiniz:

[TestCase('5m', 5)]
[TestCase('5h', 300)]
[TestCase('5d', 7200)]
[TestCase('1d4h20m', 1700)]
public void ParseDateTest(inputString, expectedMinutes)
{
    Assert.That(parse_date(inputString), Is.EqualTo(expectedMinutes));
}

Testng ile Java'da @DataProvider yöntemleri var
Kemoda

bu en iyi çözüm IMHO. neredeyse her dilde testlerinizi parametreleştirebilirsiniz. java için: @Parameterized , JunitParams , Zohhak
piotrek

3

Evet, her girdi varyasyonu için birden fazla test yapın.

Test kılavuzu başına bir iddianın ana amacı (ideal olarak) bir hatanın bir test hatasına yol açmasını sağlamaktır (tam tersi). Sonra kök neden hata ayıklamak ve doğrulamak için çok hassas bir test ile çalışabilirsiniz. Bunu bir iddia ile kırabilirsin ve birden fazla iddiada iyi olabilirsin. Bu özel senaryoda, her son ek için bir test ve birkaç sipariş kombinasyonu olurdu.

Umarım testlerin izole edilmesinin neden bir yararı olduğu açıktır: bir şeyler ters gittiğinde hata ayıklamak için daha az zaman harcarsınız. Şimdi, eğer testin başarısız olmasının muhtemel olmadığından ve test boyunca avlanma yükünün küçük olduğundan gerçekten eminseniz, belki de uygulama süresinden tasarruf etmek için hepsini bir kerede test etmek mantıklıdır.

Ancak tarih, kodu okuma / kullanma pahasına kod yazmaya biraz zaman kazandırmanın asla buna değmeyeceğini göstermiştir. Dolayısıyla kılavuz.


1

Puristler, farklı girdi değerleri için iddiaların test sınıfı içinde ayrı test yöntemlerine konulması gerektiğini söyleyecektir. Bunun bir nedeni, test kullanıcı arayüzünüze bağlı olarak, bireysel test hatalarını ayırt etmenin bireysel iddialar arasında olduğundan daha kolay ayırt edilmesidir, bu da hatanın kaynağını daha hızlı bir şekilde tanımlamanıza neden olabilir.

JUnit ile test ederken, aynı test yöntemi içinde bir iddiayı diğerinden ayırmak için başlangıç ​​String argümanına sahip assert * yöntemlerinin sürümünü kullanarak bu sorunu çözebiliriz.

self.assertEqual("just minutes", parse_date('5m'), 5)
self.assertEqual("just hours", parse_date('5h'), 300)
self.assertEqual("just days", ('5d') ,7200)
self.assertEqual("days, hours, minutes", parse_date('1d4h20m'), 1700)
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.