2010-06-21 7 views
22

Domanda veloce, sto usando il framework di test di Visual Studio per il test delle unità. Mi chiedo quale sia la differenza tra l'uso del costruttore per eseguire il lavoro di inizializzazione e l'avere un metodo con l'attributo [TestInitialize()]?Qual è la differenza tra l'utilizzo del costruttore nell'attributo VS Testing framework e TestInitialize()?

+1

possibile duplicato di [Si utilizza TestInitialize o il costruttore della classe di test per preparare ciascun test? e perché?] (http://stackoverflow.com/questions/334515/do-you-use-testinitialize-or-the-test-class-constructor-to-prepare-each-test-and) – mafu

risposta

11

This post offre una panoramica dei diversi metodi. Come puoi vedere, il ctor viene chiamato immediatamente prima dello ClassInitialize (solo una volta, ovviamente) e TestInitialize.

Quindi, inserire le cose che richiedono il codice in nel metodo TestInitialize. Tutto ciò che dovrebbe essere impostato prima dello ClassInitialize va nel ctor.

Ovviamente, il contenuto di TestInitialize verrà eseguito una volta prima di ogni test. Il metodo corrispondente per chiudere dopo ogni test è TestCleanup. Per le classi, utilizzare ClassCleanup. La stessa cosa esiste anche per gli assembly (AssemblyInitialize/Cleanup).

Further reading

+0

Le tue prime due frasi non sono corretti. Il ctor viene chiamato prima di ogni test (che ottiene la sua istanza). 'ClassInitialize' è chiamato (una volta) prima di qualsiasi ctor (e quindi qualsiasi test) - questo è il motivo per cui deve essere statico! –

+0

Questo ans non è giusto. @ OhadSchneider ha ragione –

+0

@PingJin se sei d'accordo con me, potresti invitare la mia risposta ... :) –

2

Il ctor di inizializzare l'oggetto.

TestInitialize serve per inizializzare qualsiasi oggetto o dato necessario per eseguire il test.

+4

Ma dato che l'oggetto che stai costruendo è una classe di test, sicuramente l'unica cosa che avresti inizializzato in quel costruttore sono oggetti o dati necessari per eseguire il test ... – bacar

+2

Per chiarire, TestInitialize viene eseguito prima di ogni test, quindi se si inizializzano gli oggetti qui, verranno ricreati per ogni test. Questa è una buona pratica. Altrimenti, lo stesso oggetto sarebbe condiviso in tutti i test della classe, un grande test senza unità. –

1

Concettualmente sono gli stessi, poiché MSTest crea una nuova istanza della classe di test prima di ogni esecuzione del test. Tuttavia, tecnicamente ci sono alcune differenze:

  1. ctor è chiamato prima TestInitialize (non sorprende in quanto quest'ultimo è un metodo di istanza).
  2. Hai accesso a TestContext in TestInitialize.
  3. Altri scenari di ereditarietà sono abilitati con TestInitialize: https://stackoverflow.com/a/8689398/67824.
  4. È possibile assegnare i campi readonly nel ctor. Penso che sia abbastanza importante: https://stackoverflow.com/a/45270180/67824.
Problemi correlati