Strategia di test per i giochi


13

Ho ereditato un gioco educativo basato sul web. Nell'ultimo anno ho lavorato per stabilizzare il codice e aggiungere nuove funzionalità. La maggior parte della logica è nel front-end, quindi i test delle unità di back-end, sebbene utili, coprono una piccola percentuale del codice.

Il gioco è arrivato al punto in cui inizia a diventare complesso. Esistono due diverse modalità per ogni gioco e il gioco si comporta in modo diverso a seconda della modalità. Ci sono anche varie bandiere che influenzano il gioco.

Sono uno sviluppatore di applicazioni da oltre 10 anni e questo mi lascia perplesso. Nel mondo aziendale, un algoritmo funziona sempre allo stesso modo. Scriverò un test unitario per un algoritmo, mi aspetto il valore 42 e si guasterà se non ottengo quel valore.

Quando si tratta di giochi, mi sono perso. Come li collaudo? Ho tester disponibili per me. Posso passare il tempo a scrivere unit test.

I tester sono ... inaffidabili. Non sono i migliori a sradicare i problemi e non ho dato loro la direzione migliore. A meno di dedicare un sacco di tempo a ogni ciclo di rilascio per testare ogni permutazione e combinazione del gioco, come dovrei usarli come risorsa?

I test unitari sembrano limitati. Poiché la maggior parte della logica è javascript (e ho ereditato il codice spaghetti), posso utilizzare una suite front-end come Cucumber o selenio per assicurarmi che determinate funzionalità funzionino.

È questa la migliore strategia? In che modo le società di giochi testano i giochi?

Ho letto la domanda " Test Driven Development for Complex Games " (tra gli altri sul sito), ma non risponde a ciò che sto cercando. Sto chiedendo strategie, non esempi specifici di come testare.


i consigli sulle risorse di libri / fuori sede sono esplicitamente fuori tema per centro assistenza . Vedi meta.programmers.stackexchange.com/questions/6483/…
moscerino


Non è un duplicato. Questa domanda è come scrivere unit test. Sto chiedendo una strategia.
jeffkolez,


2
FWIW, quando si tratta di testare la GUI non si tratta più di unit test - è più simile ai test di integrazione o ai test di accettazione
slebetman

Risposte:


16

Nel mondo aziendale, un algoritmo funziona sempre allo stesso modo. Scriverò un test unitario per un algoritmo, mi aspetto il valore 42 e si guasterà se non ottengo quel valore.

Questo non è molto diverso nei giochi. La presenza di due modalità e più flag nel gioco su cui stai lavorando non cambia nulla: se prendi una modalità specifica con un set specifico di flag, otterrai sempre lo stesso valore ancora e ancora quando testerai una parte di il codice sorgente.

Con troppe modalità e flag, il gioco può diventare rapidamente molto difficile da testare, a causa del numero di possibili varianti. Al fine di mitigare il rischio di incontrare presto questa difficoltà, è necessario:

  • Deridere / stub gravemente . Mantenere le parti testate piccole e deridere tutto ciò su cui si basano.

    Se si basano sul tempo, deridete l'oggetto tempo per dare sempre un risultato specifico o un insieme di risultati specifici, indipendentemente dal tempo effettivo.

    Se fanno affidamento random(), deridilo per fornire una costante ogni volta.

  • Refactor . Se i test iniziano a essere eccessivamente complicati o se vedi che una classe, per essere testata, richiede dodici argomenti dopo aver implementato Dependency Injection, mentre ne richiedeva solo due in precedenza, devi rifattorizzare il codice.

  • Metti in discussione le regole commerciali effettive dell'applicazione. Ho smesso di contare il numero di progetti che erano quasi impossibili da testare a causa del numero di variazioni diverse richieste dai requisiti funzionali che nessuno aveva bisogno né capito, nemmeno le parti interessate.

    Quando un piccolo sito Web di e-commerce ha bisogno di dieci pagine per spiegare i requisiti funzionali utilizzati per determinare il modo in cui vengono calcolati i prezzi di spedizione, non si dovrebbe iniziare scrivendo test o codice, ma si dovrebbe tornare agli stakeholder e lavorare con loro per produrre requisiti sani .

Infine, automatizza ogni test . I tester sono necessari per scoprire situazioni in cui l'applicazione ha esito negativo. Usare i tester per eseguire, ancora e ancora, la stessa azione ad ogni revisione è controproducente e irrispettoso nei confronti dei tester: i test di regressione dovrebbero essere eseguiti dalle macchine, non dalle persone. Le persone, d'altra parte, sono molto più brave a trovare possibili bug. "E se io ..." è una delle tecniche che possono usare ("E se inserissi qualche megabyte di dati binari contenenti diversi \ x00 in un campo che chiede la mia età e vedo cosa accadrà?"), ma si possono usare anche approcci più formali.


Grazie per i tuoi commenti Sembra che ho molto lavoro da fare!
jeffkolez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.