Test oluşturma çıktısını nasıl hesaplayabilirim?


19

Son zamanlarda Test Odaklı Geliştirme'yi (TDD) kucaklıyorum ve geliştirme çıktım ve kod tabanımın esnekliği üzerinde harika etkileri oldu. Bu yaklaşımı OpenGL'de yaptığım bazı oluşturma çalışmalarına genişletmek istiyorum, ancak buna iyi bir yaklaşım bulamadım.

Somut bir örnekle başlayacağım, böylece ne tür şeyleri test etmek istediğimi biliyoruz; diyelim ki, bir eksen etrafında dönen bir birim küpü oluşturmak istiyorum ve bazı kareler için her karenin doğru oluşturulmasını sağlamak istiyorum.

Bunun için nasıl otomatik test senaryosu oluşturabilirim? Tercihen, küpü oluşturmak için herhangi bir kod yazmadan önce bir test senaryosu yazabilirim (her zamanki TDD uygulamalarına göre). Diğer birçok şey arasında, küpün boyutunun, konumunun ve yönünün oluşturulan her karede düzeltin. Gölgelendiricilerimdeki aydınlatma denklemlerinin her çerçevede doğru olduğundan emin olmak isteyebilirim.

Karşılaştığım uzaktan yararlı olan tek yaklaşım, işlenmiş çıktıyı, genellikle TDD uygulamasını engelleyen ve çok hantal olan bir referans çıktıyla karşılaştırmayı içerir.

İstediğim diğer gereklilikler hakkında devam edebilirim, ancak korktuğum gibi listelediklerim ulaşılamıyor.


3
Buradaki tüm sorun, test durumunuzun iyi bir çıktıyla belirlenmesidir; ama bu çıktı buggy ise (yanlış pozitif) ne olur? Her iki şekilde de önce tel kafesleri kontrol ederek başlardım; sonra ileri işlenmiş bir sahneye geçin ve sonunda ertelenir (bunu kullanırsanız). Hızlı bir karşılaştırma yapmak için görüntünün tamamını XOR yapabilirsiniz (tamamen siyah geçişler). GPU, TDD'yi uygulamak için gerçekten kötü bir alandır; ama akıllıca bir şey bulursanız bilmek isterim.
Jonathan Dickinson

Tam olarak umduğum cevabı alamayacağımdan şüpheleniyorum, ama yine de bazı iyi fikirler umuyorum. Kara geçişte iyi düşünülmüş. Derinlik arabelleğinin test edilmesi de yardımcı olabilir.
notlesh


@Adam bunu paylaştığın için teşekkürler. Ne yazık ki, mobil oyunlar üzerinde çalışan benim gibi bir indie için ulaşılamaz yolu :) Ayrıca temel gereksinimlerimin çoğunu başarısız.
notlesh

@Adam kesinlikle bu bağlantıyı 'cevaplamalısınız'. Oldukça yeni.
Jonathan Dickinson

Yanıtlar:


8

Bu, Onay Testleri çerçevesinin iyi bir uygulaması veya buna benzer bir şey gibi görünüyor.

Yorumlarda belirtildiği gibi, kötü çıktıyı onaylarsanız hala yanlış pozitiflerle ilgili bir sorununuz olacaktır, ancak bu LEAST'ta çıktının önemli ölçüde değiştiğini söyleyecektir.

OpenGL kullandığınızdan, onayların sizin için doğrudan işe yaramayacağını varsayıyorum, ancak fikir sağlam. Sadece dosya karmasını kontrol edin ve farklıysa, arızayı uygun bir dif görüntüleyicide gösterin (görüntü farklı programı gibi). Yeni sürümü onaylarsanız, "onaylanan" dosyayı yeni sonuca uyacak şekilde güncelleyin.


Bu ilginç bir araç. Yukarıdaki yorumlarda Adam'ın bağlantısında test çiftliği gibi bir şey aldıysanız ve bunun gibi entegre bir onay mekanizması uyguladıysanız, muhtemelen oldukça düşük bir şeye yaklaşmaya başlayacaksınız. Paylaşım için teşekkürler!
notlesh

Onay testi otomatik test değildir.
zwcloud

@zwcloud: Ne demek istiyorsun? Herhangi bir test gibi, yazıldıktan sonra otomatiktir. Sadece ilk onay yazma sürecinin bir parçası.
John Gietzen

@JohnGietzen Bunu cevabından anlayamadım. Onay Testleri fikrini daha açık bir şekilde açıklığa kavuşturmanız gerektiğini düşünüyorum . Yanıt güncellendiğinde aşağı oyu kaldıracağım.
zwcloud

6

Oyun işine girmiyorum, bu yüzden lütfen olası aptal ve naif algıyı taşıyın

Benim için, tamamen işlenmiş görüntüleri karşılaştıran testler yazmak gerçekten birim testler değil , tam entegrasyon testleridir, çünkü başarılı bir test çalışması için her şeyin iyi çalışması gerekir.

Her şeyin yolunda olup olmadığını kontrol edebileceğiniz bir ara tabakaya ne dersiniz? Aklıma gelen iki şey var:

  1. Doğrudan çizim yapmayın, ancak çağrıları aşağıya dönüştürmeye dönüştürülen bir komut akışı yayınlayın . Komut akışının doğruluğu kontrol edilebilir. Bu uçtan uca test değildir, ancak tam entegrasyon testleri değil, birim testleri istiyorsunuz .

  2. Bu gerçekten 1'in bir varyasyonudur. OpenGL'yi sarın, tüm çağrıları yakalayın, bunu gerçekten test etmek istediğiniz şeye indirin ve çıktının hala eşleşip eşleşmediğini kontrol edin. OpenGL sarıcı, doğru yapılandırılmışsa kontrolü kendisi yapabilir ve bir alay haline dönüşür .


3

Sorun, 3d motorların bit için tam bir görüntü çıkışı gerektirmemesidir. Nedeniyle ortaya çıkan eserler izleyici tarafından görülmediği sürece bazı boşluklar tolere edilir. Beklenenden% 1 daha koyu bir doku genellikle ciddi bir sorun değildir ... genellikle. Bazı şartlar altında görsel bir eser olabilir. Ve sorun da bu: İnsanların hangi izleyicilerin fark edeceğini ve fark etmediğini otomatik bir test için değerlendirmek zor. Yine de, otomatik testler, çok basit geometride kullanıldığında basit sağlık kontrolleri için kullanılabilir.

Yapabileceğiniz şey, bazı basit sahneleri oluşturmak ve ardından oluşturulan görüntüyü bir referans oluşturma ile karşılaştırmaktır. Bu referans oluşturma, başka bir grafik motorundan gelebilir veya aynı motordan daha önceki bir ekran görüntüsü olabilir (regresyon testi).

Grafik motorundaki bir değişiklikten sonra bazı testler başarısız olduğunda, bir insan test cihazı, çıktıyı referans görüntüyle karşılaştırmalı ve yeni çıktının eskisi kadar iyi (veya daha iyi) görünüp görünmediğine karar vermelidir. Durum böyle olduğunda, test yeni ve geliştirilmiş çıktılarla karşılaştırılmak üzere değiştirilmelidir.

Otomatik olarak kontrol edebileceğiniz başka bir şey de performans gereksinimleridir. Böyle bir gereklilik, kendi kendine çalışan bir demo sırasında (oyundan gerçek bir sekansı simüle ederek) kare hızının test sisteminde 40 Fps'nin altına düşmemesi olabilir. Bu otomatik olarak test edebileceğiniz bir şeydir. Test edemediğiniz şey, renderın tatmin edici olduğudur. Ancak bu testleri, geliştiricilerinizin mükemmel görünen ancak lansmandan yıllar sonra uygun fiyatlı herhangi bir sistemde düzgün çalışmayan bir oyun geliştirmesini önlemek için kullanabilirsiniz (merhaba Crytek).

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.