Stokastik davranış gösteren programları test etmek için en iyi uygulamalar nelerdir?


14

Ar-Ge çalışmaları yaparken, genellikle davranışlarında büyük ölçüde rastgele olan programlar yazarken bulurum. Örneğin, Genetik Programlama'da çalışırken, genellikle rasgele rastgele kaynak kodu üreten ve yürüten programlar yazarım.

Bu tür kodları test etmeyle ilgili bir sorun, hataların genellikle aralıklı olması ve çoğaltılması çok zor olabilmesidir. Bu sadece rastgele bir tohumun aynı değere ayarlanıp uygulanmaya başlamasının ötesine geçer.

Örneğin, kod çekirdek halka arabelleğinden bir ileti okuyabilir ve ileti içeriğinde koşullu atlamalar yapabilir. Doğal olarak, halka tamponunun durumu, daha sonra sorunu yeniden oluşturmaya çalıştığında değişmiş olacaktır.

Bu davranış bir özellik olsa da, diğer kodu beklenmedik şekillerde tetikleyebilir ve bu nedenle genellikle birim testlerin (veya insan testçilerin) bulamadığı hataları ortaya çıkarır.

Bu tür sistemleri test etmek için belirlenmiş en iyi uygulamalar var mı? Öyleyse, bazı referanslar çok yardımcı olacaktır. Değilse, diğer önerilerinizi bekliyoruz!


5
Çekirdek halka tamponunu da alay edemez misiniz? Ve kodunuzun diğer rastgele yönleri?
Jonathan Merlet

1
@JonathanMerlet Potansiyel olarak, ancak sorun, konuşlandırıldığında, kodun gerçek halka arabelleğine (gerçekten de gerçek bir işletim sistemine) erişimi olmasıdır . Bu yüzden sadece alay edilmiş bir sürümü test edersem, o zamana kadar bu böceklerin keşfini erteliyorum.
John Doucette

Bana öyle geliyor ki, sorun programın rastgele davranışı (rastgele tohum tarafından kontrol edilebildiği için) değil, bu 'çekirdek halka tamponunun' belirli durumları ile ilgilidir. Yani sorunuz aslında 'harici duruma bağlı bir programı nasıl test ederim', değil mi?
AakashM

@AakashM, evet, bunu ifade etmenin daha iyi bir yolu. Daha açık olmak gerekirse, dış duruma stochastic olarak erişen veya dış durumu değiştiren bir program.
John Doucette

Yanıtlar:


7

Kesin durumları yeniden oluşturmak için, önerildiği gibi kanca eklemek yararlıdır. Ayrıca sistemi "tohumlarını" (PRNG tohumunun yanı sıra çekirdek halka tamponu ve diğer belirleyici olmayan girdi kaynakları da dahil olmak üzere) dökülebilecek şekilde düzenleyin.

Ardından, testlerinizi hem gerçek rastgele girdiyle hem de daha önce keşfedilen ilginç vakalarda regresyon stiliyle çalıştırın.

Çekirdeğe erişiminiz durumunda, her durumda alay etmenizi tavsiye ederim. Uygulamada görünme olasılığı daha düşük olan eşdeğerlik sınıflarını kaplar için "boş" ve "dolu" ruhu veya "0, 1, 2 ^ n, 2 ^ n + 1, birçok" sayılabilir şeyler. Ardından, şimdiye kadar düşündüğünüz vakaları ele aldığınızı ve test ettiğinizi bilerek, sahte ve gerçek şeyle test edebilirsiniz.

Temel olarak, önerdiğim, deterministik ve belirsiz olmayan girdilerin bir karışımıdır, deterministik olanlar aklınıza gelebilecek ve şaşırdığınızların bir karışımıdır.


6

Yapılacak makul bir şey, rastgele sayı üretecini testler için sabit bir değerle tohumlamaktır, böylece deterministik bir davranış elde edersiniz.


1
bu; veya prng tamamen alay
jk.

1
Önerin için teşekkürler! Bunu birim testi için zaten yapıyorum, ancak tüm olası programları elle test edemiyorum.
John Doucette

2
ancak bu, rastgele çalışmanın düzgün çalışıp çalışmadığını test edemeyeceğiniz anlamına gelir ..
Louis Rhys

2

İstatistiksel testin tek yol olduğunu düşünüyorum. Tıpkı rasgele sayılar istatistiksel testlerle rasgelelik için "test edilir", bu nedenle rasgele davranış kullanan algoritmalar olması gerekir.

Algoritmayı aynı veya farklı girişlerle birden çok kez çalıştırın ve birbiriyle karşılaştırın. Bu yaklaşımdaki sorun, testi bitirmek için gereken hesaplama süresinde büyük bir artış.


Mutlaka değil, çünkü küçük bir "yayılan" girdi kümesi seçebilir ve bunlarda birden çok kez çalışabilirsiniz - güvenilirliği belirlemek için gereken girdi sayısı daha az olabilir. Bu "yayılma" seti kodun her dalına girmeli, tüm nesneleri başlatmalı vb.
Daniel Moskovich

2

Bu alanda uzman değilim, ancak stokastik program testine göre bilimsel bir literatür var.

Test sınıflarını kolayca oluşturamazsanız, #Euphoric'in söylediği gibi istatistiksel bir test kullanılabilir. Borning ve diğ. geleneksel ve istatistiksel yaklaşımları karşılaştırabilirler. @Euphoric tarafından önerilen istatistiksel testlerin genelleştirilmesi Whittaker tarafından tartışılan test olabilir. İstenen (sizin durumunuzda stokastik) davranışın stokastik bir modelini oluşturmayı ve daha sonra bu modelden belirli test senaryoları oluşturmayı önerdi ( özel makalesine bakın ).


Teşekkürler! Çok yardımcı görünüyor. Akademik kurumlar dışındaki kişiler için, makalenin bir ön baskı sürümü yazarın google kod deposundan buradan alınabilir
John Doucette
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.