2012-12-07 34 views
5

Kendi erişim katmanımı bir oyun motoruna yazdım. Kendi kodumu işleme koymamı sağlayan her kareyi alan bir GameLoop var. Belirli şeyler yapabiliyorum ve bu şeylerin olup olmadığını kontrol edebiliyorum. çok temel bir şekilde, bu gibi görünebilir:Eşzamansız kod nasıl test edilir

void cycle() 
{ 
    //set a specific value 
    Engine::setText("Hello World"); 

    //read the value 
    std::string text = Engine::getText(); 
} 

benim Engine -layer otomatik testler yazılı çalışıp çalışmadığını test etmek istiyorum. Bu gibi basit karşılaştırma testleri için Boost Unixest Framework'ü kullanma konusunda bazı tecrübelerim var.

sorun şu ki, motor yapmak istiyorum bazı şeyler sadece cycle() çağrısının ardından işlem görür. Engine::getText()'u doğrudan Engine::setText(...)'dan sonra arayarak boş bir dize dönecektir. Bir sonraki cycle() numaralı çağrıya kadar beklerseniz, doğru değer döndürülür.

şimdi aynı döngüde bunları işlemek mümkün değilse benim testleri yazmak nasıl merak ediyorum. En iyi uygulamalar var mı? Böyle bir ortamda Boost Unittest Framework tarafından verilen "geleneksel test" yaklaşımını kullanmak mümkün mü? Böyle özel bir duruma yönelik belki de başka çerçeveler var mı?

Burada her şey için C++ kullanıyorum ama programlama dili ile ilgili olmayan cevaplar olduğunu düşünebiliriz.

GÜNCELLEME: Seninle iki seçenek vardır cycle()

+0

Motor işlenmesi bitti bir şekilde size sinyal sürece, gerçekten bu çalışma görmüyorum. Yine de diğer insanların cevaplarını görmek çok meraklı. motor 'isResultReady() olmadığından –

cevap

-1

ait Engine dışında erişmek mümkün değildir:

Eğer eşzamanlı veya C++ 11 gelecekleri kullanılarak kullanılabilir olması kütüphane (sonucun readyness gösterebilir) tesis sizin var en iyi yukarıda olması gerekmektedir ardından test durumda

void testcycle() 
{ 
    //set a specific value 
    Engine::setText("Hello World"); 
    while (!Engine::isResultReady()); 
    //read the value 
    assert(Engine::getText() == "WHATEVERVALUEYOUEXPECT"); 
} 

aşağıdaki gibi bir şey yapabilirsiniz gibi Bir zaman aşımı (bu sahte hataları sahip çünkü gerçi iyi bir seçenek değildir): Yukarıdaki örnekte

void testcycle() 
{ 
    //set a specific value 
    Engine::setText("Hello World"); 
    while (Engine::getText() != "WHATEVERVALUEYOUEXPECT") { 
     wait(1 millisec); 
     if (total_wait_time > 1 sec) // you can put whatever max time 
       assert(0); 
    } 

} 
+0

İlk cevap mümkün değildir' ikinci cevap tasarımıyla kötü: Eğer zaman uykuya ihtiyacı olduğunu unutuyorsun çünkü tanıtan zaman aşımları ve testlerin bu tür uyur kötü bir şey olduğunu Her makinede farklı olabilir. Core i7'niz sadece 1 saniye sürebilir, ancak bazı eski Pentium 2'ye ihtiyaç duyabilir. Her iki durumda da test çantası geçmelidir, ancak - eğer bir uyku kullanılırsa - ikinci durumda başarısız olur. –

+1

GameEngine, 'cycle()' işlevini çağırdıktan sonra 'Engine :: setText (..)' işlemlerini gerçekleştirir; bu nedenle, bir zaman aşımı eklenmesi, hemen ardından Engine Engine 'getText()' olarak adlandırılanla aynı olurdu. zaman. Önümüzdeki 'döngüsünde()' – MOnsDaR

+0

@DanielKamilKozar anlamına gelir GameEngine, işlenen setText'is 'sonra doğru sonuçları almak için tek açabiliyorum - düzgün yorumlarımı okumalısınız .. "(bu iyi seçenek değildir Yine de, sahte hatalar olabileceğinden dolayı) " – RamneekHanda

0

, std::string text = Engine::getText(); tek döngüsünden hatırlıyorum ama sonraki yürütmek istediğiniz koddur. Daha sonra yürütmek için kaydedebilirsiniz. Örneğin - C++ 11 kullanarak, testi satır içi belirtilen basit bir işleve sarmak için bir lambda kullanabilirsiniz.

İlgili konular