2010-06-21 4 views
22

Pregunta rápida, estoy usando el marco de prueba de Visual Studio para pruebas unitarias. Solo me pregunto ¿cuál es la diferencia entre usar el constructor para hacer un trabajo de inicialización o tener un método con el atributo [TestInitialize()]?¿Cuál es la diferencia entre usar el constructor en el framework VS Testing vs. el atributo TestInitialize()?

+1

posible duplicado de [¿Utiliza TestInitialize o el constructor de la clase de prueba para preparar cada prueba? y por qué?] (http://stackoverflow.com/questions/334515/do-you-use-testinitialize-or-the-test-class-constructor-to-prepare-each-test-and) – mafu

Respuesta

11

This post ofrece una descripción general de los diferentes métodos. Como puede ver, el ctor se llama inmediatamente antes del ClassInitialize (solo una vez, por supuesto) y TestInitialize.

Ponga las cosas que requieren código en ClassInitialize en su método TestInitialize. Todo lo que debe configurarse antes de ClassInitialize va en el ctor.

Obviamente, el contenido TestInitialize se ejecutará una vez antes de cada prueba. El método correspondiente para cerrar después de cada prueba es TestCleanup. Para las clases, use ClassCleanup. Lo mismo existe para los ensamblajes también (AssemblyInitialize/Cleanup).

Further reading

+0

Tus dos primeras oraciones son incorrectos El ctor se llama antes de cada prueba (que obtiene su propia instancia). 'ClassInitialize' se llama (una vez) antes de cualquier ctor (y por lo tanto cualquier prueba) - ¡por eso tiene que ser estático! –

+0

Esta ans no es correcta. @ OhadSchneider's está bien –

+0

@PingJin si está de acuerdo conmigo, podría votar mi respuesta ... :) –

2

El ctor es para inicializar el objeto.

TestInitialize es para inicializar cualquier objeto o datos necesarios para ejecutar la prueba.

+4

Pero dado que el objeto que está construyendo es una clase de prueba, seguramente lo único que estaría inicializando en ese constructor son objetos o datos necesarios para ejecutar la prueba ... – bacar

+2

Para aclarar, TestInitialize se ejecuta antes de cada prueba, por lo que si inicializa los objetos aquí, se volverán a crear para cada prueba. Esta es una buena práctica. De lo contrario, el mismo objeto se compartiría en todas las pruebas de la clase, un gran no-no en las pruebas unitarias. –

1

Conceptualmente son lo mismo, ya que MSTest crea una nueva instancia de su clase de prueba antes de cada ejecución de prueba. Sin embargo, técnicamente hay algunas diferencias:

  1. La Héctor se llama antes de TestInitialize (no es de extrañar ya que este último es un método de instancia).
  2. Tiene acceso a TestContext en TestInitialize.
  3. Se habilitan más escenarios de herencia con TestInitialize: https://stackoverflow.com/a/8689398/67824.
  4. Puede asignar readonly campos en el ctor. Creo que es bastante importante: https://stackoverflow.com/a/45270180/67824.
Cuestiones relacionadas