C ++ tabanlı oyunlar için hangi birim test çerçevesi? [kapalı]


13

Hangi test araçlarının en iyi kombinasyonunu düşünüyorsunuz? Seçtiğiniz çerçeve / kütüphane göz önüne alındığında:


Not: Bu gibi genel bir soru potansiyel iken SO üzerinde biri genellikle test için seçimi etkiler belirli bir iş akışına bağlı olduğu oyun gelişimini iddia ediyorum I. Daha üst düzey bir perspektif için bkz . Oyunların otomatik testi .


Bu soruda doğrudan yanlış bir şey görmeme rağmen, Topluluk Wiki'sinden faydalanacağını düşünüyorum. Örneğin: gamedev.stackexchange.com/questions/480/…
Jesse Dorsey

CW yaptım. Bununla birlikte, özellikle genel olarak tartışıldığı için, CW'nin ne zaman soru sorulacağına dair yönergeler benim için yeni belirsiz gibi görünüyor ( meta.stackexchange.com/questions/55888 ). Belki bu konuda SSS'de gamedev politikasını açıkça ifade edebiliriz?
jmp97

Yanıtlar:


7

UnitTest ++ ile çalışmak çok kolay buldum . Ben yine de sahte nesne işlevselliği için UnitTest ++ iyi bir arkadaşı olduğu söylenen ile birlikte, amop denemek zorunda kalacak . Aksi takdirde Google Mock popüler bir seçimdir. Ayrıca, UnitTest ++ ve Mock Objects üzerinde okumak isteyebilirsiniz .

UnitTest ++, Sürekli Entegrasyon yaklaşımınızla, örneğin Hudson ile kurulabilir

Ünite testine ve oyunların birlikte iyi gittiğine ikna olmadıysanız, bu ilham verici postayı okumak isteyebilirsiniz .


UnitTest ++, özellikle değiştirilmesi ve genişletilmesi kolay olduğu göz önüne alındığında, ihtiyacınız olan tek test çerçevesidir. Daha sonra herhangi bir Java programlaması yaparken kendinizi bulursanız, JUnit, gösterdiği son derece yetersizlikle bir çekiçle yüzünüze tekrar tekrar vurur.
dash-tom-bang

UnitTest ++ için github.com/unittest-cpp/unittest-cpp adresine gidin. Diğer her şey güncel değil.
Markus

4

UnitTest ++ için başka bir oy . Entegre edilmesi çok kolay, hedef gömülü platformumuz için çok kolay, anlaşılır ve kullanımı kolay bir şekilde derlenmiştir. Hudson ile de entegre ettik. GoogleTest'e baktık ancak reddettik (sanırım hedef platformumuz için derleme sorunları vardı), ancak benzer bir özellik kümesine sahip ve sizin için uygun olabilir.

Ayrıca bir çeşit duman testi çerçevesine de bakmak isteyebilirsiniz. Deneyimlerime göre, sadece birim testleri olan bir oyun için yeterli test kapsamı elde etmek zordur. Özellikle mevcut bir kod tabanına ve hatta büyük bir ekip için moreso'ya birim testi uyguluyorsanız. Duman testi, "tüm seviyelerin yüklendiğinden emin olun" gibi üst düzey şeyleri test ediyor olacaktır. Benim teorim, eğer her iki tür testim varsa, o zaman bir noktada ortada buluşup iyi bir sonuç verebilirler. :)


2

Geri döndüğümde C ++ 'da (feragatname: yaklaşık 2005'ti), biraz değiştirilmiş bir TUT (Template Unit Test Framework) sürümü kullandım . Bunu sevdim çünkü değiştirmeyi kolaylaştıran hafifti ve testler yazarken çok az "tutkal" gerekliydi.

İşte yaptığım çok basit bir değişiklik, bu da testleri yazmayı daha da istekli / temiz hale getiriyor:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

Yaptığım diğer değişiklik çıktı biçiminde yapıldı, böylece test hataları Visual Studio'nun hata listesinde (bir yapının parçası olarak çalıştırıldığında) doğru bir şekilde görünecekti, başarısız testin dosyasına ve satırına gitmek için tıklanabilirdi.

(Yetenek o şey araçlarının bu tür yapmak o daha ziyade onun içine sığacak şekilde zorlamadan daha TDD / CI sürecine uyum yapılabilir.)

İşte bir örnek test (editörümden komut yığınından):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(Yukarıdaki kodda csve odmodül başına fikstür ve TestCommandsahte bir nesnedir.)



2

Profesyonel bir oyun geliştiricisi değilim, ancak profesyonel bir yerleşik geliştiriciyim. Belki de tam olarak oyun gibi değil, yakın. İş yerimde birkaç tane kullandık.

Google testini gerçekten çok seviyorum . Son birim test çerçevelerinin en iyi özelliklerinin hepsine sahiptir ve hepsini minimum, akış çizgili bir arayüzde tutar.

Listemde Sonraki olduğunu Boost Testi . Google testinin API'sı Boost'tan biraz daha modern.Test, ancak Boost Test yeni özellikler eklemek ve acımasız CppUnit paradigmasını ortadan kaldırmak için harika bir iş çıkardı.

Ayrıca CxxTest kullandım . Oldukça iyi yapılmış, ancak Boost.Test veya Google Test kadar modern olmadığını söyleyebilirsiniz. Özellikle, test süitleri ve fikstürleri için desteği biraz gariptir.

Gelişmiş özellikleri kullanmayı seviyorum, ancak minimalistseniz, üçü arasındaki farkı asla göremezsiniz. Meslektaşlarımın çoğu, otomatik kayıt testini destekleyen (bildirimsel olarak) ve bir çeşit CHECK_EQUALS (a, b) makrosuna sahip bir birim test çerçevesinden memnun olacaktır.


1

Favori test kütüphanem QuickCheck http://en.wikipedia.org/wiki/QuickCheck . Deneysel bir C ++ sürümü var, ancak çok ağır görünüyor, ancak özel bir kütüphane olmadan bile prensiplerin kullanımı kolaydır.

Tüm sınıflarımda rastgele bir örnek oluşturabilecek bir genArbitrary yöntemi var. Bunu, yükleme ve boşaltma gibi tersinir süreçleri duman testi için kullanıyorum. Binlerce rastgele sahne oluşturabilir ve çeşitli özelliklerin sahip olup olmadığını kontrol edebilirim (serileştirdiğim sahne serisini kaldırdığım sahne ile aynı).

Geleneksel birim testlerinin yerini almaz (birçok potansiyel birim testine olan ihtiyacı azaltır), ancak hataları keşfetmenin harika bir yoludur ve bellek ayırma stratejimi (Valgrind ile birlikte) stres testine yardımcı olur. Bir milyondan fazla tahsinin Valgrind saf çıkmasını izlemek harika :).

CxxTest'i sevdiğim bir test takımı olarak kullanıyordum. Şimdi bütün sınavlarım ayrı exes. Ben sadece Test adlı bir klasör var ve Test_ ile başlayan dosya bir test olur. Şimdiye kadar test yapmak gerçekten kolay bir hafif.


0

Java ile çok iyi kütüphaneler var ... C ++ için geçerli değil.

C ++ kullanıcıları için, Kitware'den çok ilginç bir zincir aracı var:

  • CMake: araç yapmak
  • CDash: sürekli entegrasyon aracı

Kitware, Bilgisayar Bilimi için C ++ kodları yazar.

Kişisel projeler için, Boost unit test kütüphanesini kullanıyorum (Masaüstü platformunda). Sürekli Entegrasyon için Hudson kullanıyorum:

  • Tomcat'e kolay kurulum
  • script

0

TUT (Şablon Birim Testi) çerçevesini ikinci yapacağım ; süper hafif ve son derece esnektir, kurulumu ve kullanımı gerçekten kolay değildir (tek bir başlık içerir, biraz ana / kurulum kodu ve 24 satır test kodu daha sonra bir birim testiniz vardır). Ben gömülü yazılım geliştirme de dahil olmak üzere büyük bir başarı için hızlı prototipleme / TDD / öğrenme şablonları için binfmtc (komut dosyaları olarak C ++ programları çalıştırmak) ile birleştirdim . XML çıktısı alabildiği için, Jenkins (CI) ve Sonar ile birbirini takip eden projelerim üzerine de güzelce konuştu.

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.