Domanda

Considerando tale codice:

class ToBeTested {
public:
  void doForEach() {
    for (vector<Contained>::iterator it = m_contained.begin(); it != m_contained.end(); it++) {
       doOnce(*it);
       doTwice(*it);
       doTwice(*it);
    }
  }
  void doOnce(Contained & c) {
    // do something
  }
  void doTwice(Contained & c) {
    // do something
  }

  // other methods
private:
  vector<Contained> m_contained;
}

Voglio testare che se faccio il pieno vettoriale con 3 valori, le mie funzioni, saranno chiamati in ordine e quantità.Per esempio il mio test può essere qualcosa di simile a questo:

tobeTested.AddContained(one);
tobeTested.AddContained(two);
tobeTested.AddContained(three);

BEGIN_PROC_TEST()
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)

tobeTested.doForEach()
END_PROC_TEST()

Come si consiglia di eseguire questo test?Ci sono i mezzi per fare questo con CppUnit o GoogleTest quadri?Forse alcuni altri framework di unit test consentono di effettuare tali prove?

Capisco che probabilmente questo è impossibile senza la convocazione di eventuali funzioni di debug da queste funzioni, ma almeno può essere fatto automaticamente in alcuni framework di test.Non mi piace per eseguire la scansione di log di traccia e verificare la loro correttezza.

UPD:Sto cercando di controllare non solo l' stato di oggetti, ma anche il l'ordine di esecuzione per evitare problemi di prestazioni in fase più precoce possibile (e, in generale, voglio sapere che il mio codice è eseguito esattamente come mi aspettavo).

È stato utile?

Soluzione

Se siete interessati in termini di prestazioni, ti consiglio di scrivere un test che misura le prestazioni.

Controllare l'ora corrente, eseguire il metodo di sei preoccupato per, poi controllare il tempo di nuovo.Affermare che il tempo totale impiegato è inferiore a un certo valore.

Il problema con il check che i metodi sono chiamati in un certo ordine è che il codice è andando ad avere per cambiare, e non si vuole aggiornare il test quando succede.Si dovrebbe concentrarsi su come testare il il requisito reale invece di controllare i dettagli di implementazione che soddisfa tale requisito.

Detto questo, se davvero si vuole provare che i tuoi metodi sono chiamati in un certo ordine, è necessario effettuare le seguenti operazioni:

  1. Spostarli in un'altra classe, chiamata Collaboratore
  2. Aggiungere un'istanza di questa classe la classe ToBeTested
  3. Utilizzare un beffardo quadro per impostare la variabile di istanza su ToBeTested essere un beffe del Collborator classe
  4. Chiamare il metodo in esame
  5. Utilizzare il beffardo quadro di affermare che i metodi sono stati chiamati sul tuo mock nell'ordine corretto.

Io non sono un nativo cpp altoparlante, quindi non posso commentare che beffardo quadro si dovrebbe usare, ma vedo alcuni altri commentatori hanno aggiunto i loro suggerimenti su questo fronte.

Altri suggerimenti

Si possono controllare mockpp.

Si dovrebbe essere in grado di utilizzare qualsiasi buona beffardo quadro per verificare che le chiamate a collaborare oggetto sono di fatto in un ordine specifico.

Tuttavia, non è generalmente prova che un metodo che rende alcune chiamate ai metodi della stessa classe...perché?

Generalmente, quando si sta testando una classe, si preoccupano solo testando il suo pubblicamente visibili.Se si prova qualsiasi altra cosa, il test ti impedisce di refactoring più tardi.

Potrei fornire maggiore aiuto, ma non credo che il tuo esempio è coerente (Dove è l'implementazione per la AddContained metodo?).

Invece di cercare di capire come molte funzioni sono stati chiamati, e in quale ordine, trovare un insieme di fattori che possono solo produrre un output atteso se si chiama le cose nel giusto ordine.

Alcune beffardo quadri consentono di impostare ordinato aspettative, che ti permette di dire esattamente quali chiamate di funzione che si aspetta in un certo ordine.Per esempio, RhinoMocks per C# permette questo.

Io non sono un C++ programmatore quindi non sono a conoscenza di ciò che è disponibile per il C++, ma un tipo di strumento che potrebbe consentire a quello che stai cercando di fare.

http://msdn.microsoft.com/en-au/magazine/cc301356.aspx

Questo è un buon articolo su Contesto di Oggetti Associati.Esso contiene alcuni così avanzato roba, ma se non siete pigri e voglia di capire questo genere di cose sarà davvero utile.

Alla fine si sarà in grado di scrivere qualcosa come:[CallTracingAttribute()] public class TraceMe :ContextBoundObject {...}

Si potrebbe utilizzare ACE (o simili) debug quadri, e nel test, configurare l'oggetto di debug per lo streaming di un file.Allora avete solo bisogno di controllare il file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top