Son zamanlarda ünite testi en iyi uygulamalarında kendimi çok eğitmeye çalıştım. Çoğunluğu mükemmel bir anlam ifade ediyor, ama genellikle gözden kaçan ve/veya kötü bir şekilde açıklanmış bir şey var: Bir birim testinin nasıl bir işlevi var?Dekore edilmiş işlevler nasıl birim-test edilir?
def stringify(func):
@wraps(func)
def wrapper(*args):
return str(func(*args))
return wrapper
class A(object):
@stringify
def add_numbers(self, a, b):
"""
Returns the sum of `a` and `b` as a string.
"""
return a + b
Açıkçası şu testler yazabilirsiniz:
def test_stringify():
@stringify
def func(x):
return x
assert func(42) == "42"
def test_A_add_numbers():
instance = MagicMock(spec=A)
result = A.add_numbers.__wrapped__(instance, 3, 7)
assert result == 10
Bu bana% 100 kapsama verir:
en Bu kodu olduğunu varsayalım biliyorum ki stringify()
süslenmiş alır herhangi bir işlev sonucunu bir dize olarak alır ve oyulmamış A.add_numbers()
işlevinin argümanlarının toplamını döndürdüğünü biliyorum. Bu nedenle, aktarma özelliğiyle, A.add_numbers()
'un dekore edilmiş sürümü, argümanın toplamını bir dize olarak döndürmelidir. Her şey iyi görünüyor!
Ancak bundan tamamen memnun kalmıyorum: testlerim, yazdığım gibi başka bir dekoratör kullanacak olsam da yine de geçebilir (başka bir şey yaparsa, sonucu str
'a çevirmek yerine 2 ile çarpın) . Benim fonksiyonum A.add_numbers
artık doğru olmayacaktı, testler hala geçerdi. Harika değil.
A.add_numbers()
'un dekore edilmiş sürümünü test edebilirdim, ancak dekoratörlerim zaten birim test edildiğinden beri ben fazla şey yapardım.
Burada bir şey eksik gibi hissediyorum. Birbirini dekore edilmiş işlevler için iyi bir strateji nedir?
Soruyu biraz fazla hızlı okuduğunuzu düşünüyorum. Fonksiyonel testler yazmayı değil, birim testleri yapmayı düşünmüyorum. – ereOn
'add_numbers'' stringify' tarafından dekore edilen başka bir işlev aslında bir uygulama detayıdır. 'Add_numbers' öğesinin amaçlandığı şekilde çalıştığını test edin ve farklı bir dekoratör (veya hiçbir dekoratör kullanmıyorsanız) fark etmez. – chepner
@chepner: Birim testleri, uygulama ayrıntılarını test etmek için tam buradadır. Yine, eğer işlevsel/entegrasyon testleri hakkında konuşuyor olsaydık, kabul ederdim. Bu sadece konu dışı bir konu. – ereOn