Numaralandırmalar özel (umarım anlamlı) isimlerle sonlu türlerdir. Bir enum sadece gibi bir değere sahip olabilir void
ancak içeren null
(bazı diller diyoruz unit
ve adını kullanmak void
bir enum için hiçbir elementlerin!). Sanki iki değerlerine sahip olabilir bool
sahip olduğu false
ve true
. Sanki, üç olabilir colourChannel
ile red
, green
veblue
. Ve bunun gibi.
İki numara aynı sayıda değere sahipse, bunlar "izomorfik" olur; yani tüm isimleri sistematik olarak değiştirirsek, birini diğerinin yerine kullanabiliriz ve programımız farklı davranmaz. Özellikle, testlerimiz farklı davranmayacak!
Örneğin, result
içeren win
/ lose
/ draw
Yukarıdaki izomorftur colourChannel
biz örneğin yerine bu yana, colourChannel
ile result
, red
birlikte win
, green
ile lose
ve blue
ile draw
sürece biz bunu olarak ve her yerde (üretici ve tüketiciler, ayrıştırıcılar ve serialisers, veritabanı girdileri, günlük dosyaları, vb ) programımızda değişiklik olmayacaktır. Yazmış colourChannel
olduğumuz tüm " testler",colourChannel
!
Ayrıca, bir enum birden fazla değer içeriyorsa , aynı sayıda değer içeren yeni bir enum almak için bu değerleri her zaman yeniden düzenleyebiliriz . Değerlerin sayısı değişmedi yana, yeni düzenleme eskisinin izomorftur ve (not dolayısıyla biz tüm isimlerini geçiş olabilir ve bizim testleri hala geçerdi biz yapamaz sadece tanımını dışarı geçiş; yapmalıysak yine de tüm kullanım sitelerini kapat).
Bunun anlamı, makine söz konusu olduğunda, sıralamalar "ayırt edilebilir isimler" ve başka bir şey değildir . Bir enum ile yapabileceğimiz tek şey, iki değerin aynı (ör. red
/ red
) Veya farklı (ör. red
/ blue
) Olup olmadığı konusunda dallanmaktır . Bu yüzden, 'birim testinin' yapabileceği tek şey bu, örn.
( red == red ) || throw TestFailure;
(green == green) || throw TestFailure;
( blue == blue ) || throw TestFailure;
( red != green) || throw TestFailure;
( red != blue ) || throw TestFailure;
...
@ Jesm00'ün dediği gibi, böyle bir test programınızdan ziyade dil uygulamasını kontrol ediyor . Bu testler asla iyi bir fikir değildir: dil uygulamasına güvenmiyorsanız bile dışarıdan test etmelisiniz , çünkü testleri doğru bir şekilde çalıştırmak güvenilir değildir!
Bu teori; uygulama ne olacak? Enumların bu karakterizasyonu ile ilgili ana sorun, 'gerçek dünya' programlarının nadiren kendi içinde kalmasıdır: eski sürümlerimiz, uzak / gömülü dağıtımlarımız, geçmiş veriler, yedeklemeler, canlı veritabanları vb. bazı kullanımlar eksik olmadan bir adın tüm oluşumları.
Oysa böyle şeyler enum kendisinin 'sorumluluk' değildir: Uzak bir sistem ile iletişimi bozabilir Bir enum değişen, ama tersine biz olabilir düzeltmek böyle bir sorunu bir enum değiştirerek !
Bir sistem olması gerekenden ne olur: Bu senaryolarda, enum kırmızı-ringa olan bu yolu, başka olması ihtiyacı olduğunu yolu? Kaç tane test yazdığımız önemli değil, her ikisi de olamaz! Buradaki asıl suçlu, "yorumlama seçimlerini tam olarak ne olursa olsun" yerine iyi tanımlanmış formatlar üretmesi / tüketmesi gereken giriş / çıkış arayüzüdür. Bu nedenle asıl çözüm, i / o arayüzlerini test etmektir : beklenen formatı ayrıştırdığını / yazdırdığını kontrol etmek için birim testleri ve formatın diğer taraf tarafından gerçekten kabul edildiğini kontrol etmek için entegrasyon testleri ile.
Hala enumun 'yeterince iyi egzersiz yapıp yapmadığını' merak edebiliriz, ancak bu durumda enum yine kırmızı bir ringa balığıdır. Aslında endişelendiğimiz şey test paketinin kendisidir . Burada birkaç yolla güven kazanabiliriz:
- Kod kapsamı, test paketinden gelen çeşitli numaralandırma değerlerinin koddaki çeşitli dalları tetiklemek için yeterli olup olmadığını bize söyleyebilir. Değilse, ortaya çıkarılan dalları tetikleyen testler ekleyebilir veya mevcut testlerde daha çeşitli numaralar oluşturabiliriz.
- Mülk denetimi, koddaki dal çeşitliliğinin çalışma zamanı olanaklarını işlemek için yeterli olup olmadığını bize söyleyebilir. Örneğin, kod yalnızca işliyorsa
red
ve yalnızca test yapıyorsak, red
% 100 kapsama alanımız vardır. Bir özellik denetleyicisi, testlerimizi unuttuğumuz değerler green
ve blue
değerler üretme gibi iddialarımıza karşı örnekler üretmeye çalışacaktır .
- Mutasyon testi bize iddialarımızın sadece dalları takip etmek ve farklılıklarını görmezden gelmek yerine, enümü gerçekten kontrol edip etmediğini söyleyebilir .