¿Prueba unitaria, NUnit o Visual Studio?

114

Estoy usando Visual Studio (a veces resharper) para ejecutar mi prueba unitaria.

Escuché sobre NUnit, pero no sé muchas cosas al respecto ...

¿Debería preocuparme por eso? ¿Puede ofrecer algo mejor que Visual Studio?

¿Debería usar NUnit y por qué?

Tim
fuente
12
También considere xunit, sin embargo, haga lo que haga, eche un vistazo a TestDriven.net
Ian Ringrose
Véase también stackoverflow.com/questions/707444/…
David Schmitt
prueba xunit.net. Es un marco de prueba unitario de código abierto y agradable para la aplicación .net.
Mukesh Arora

Respuestas:

100

NUnit tiene pocas ventajas sobre MS-Test

  1. Atributo de suite: puede agregar pruebas y ejecutarlas por separado (útil para proyectos grandes con pruebas rápidas y lentas, por ejemplo)
  2. Método de afirmación legible, p. Ej. Assert.AreEqual(expected, actual)VsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit tiene actualizaciones de versión frecuentes: MS-Test solo tiene una por versión de VS.
  4. Muchos corredores integrados, incluidos Resharper y TestDriven.NET
  5. Aserción de mensaje de excepción esperada: se puede hacer usando el atributo en NUnit pero debe hacerse usando Try-Catch en MS-Test
  6. [TestCase]! NUnit permite pruebas parametrizadas.
Elíseo
fuente
32
La excepción también se puede afirmar por atributo en MS-Test: ExpectedExceptionAttribute.
Stefan Steinegger
9
Usaría NUnit con Assert.Throws <> () porque esto sigue el Principio AAA, que no es válido para el atributo.
Oliver Hanappi
25
La # 3 no es una característica, es un problema y la # 5 es 100% falsa; MS Test tiene el atributo ExpectedException y siempre lo tiene .
Randolpho
4
@Elisha Como recuerdo, deliberadamente no apoyaron la verificación del texto del mensaje porque el texto no se considera significativo y puede ser arbitrario. Es decir, no afecta el flujo de un programa.
Rob Kent
7
"# 3 no es una característica, es un problema" - no suena como una forma muy ágil de pensar ...
SamuelKDavis
72

Desde mi punto de vista actual (después de 8 meses de desarrollo con cerca de 10 desarrolladores de media) Yo aconsejaría contra el uso de MSTest por las siguientes razones

  • El marco en sí mismo es bastante lento. No me refiero al código de prueba que escribe, está bajo su control. Me refiero a que el marco que ejecuta esas pruebas es lento, ya sea que esté ejecutando un conjunto de pruebas, pruebas únicas, etc.
  • La necesidad de mantener un archivo de metadatos de prueba que siempre genera complicaciones cuando varios desarrolladores están trabajando en él (recreando, por ejemplo, los metadatos, etc.). Todos los demás conjuntos de pruebas no necesitan un archivo de metadatos. Es agradable organizar sus pruebas, pero puede lograr lo mismo a través de espacios de nombres, clases y nombres de métodos.
  • Haciendo Integración Continua, si desea ejecutar pruebas unitarias en su máquina de compilación, deberá instalar Visual Studio en esa máquina.

En otras palabras, si tuviera que decidir de nuevo hace 8 meses, probablemente tomaría NUnit. Puede que no tenga el informe de resultados de las pruebas integrado, pero los desarrolladores tendrían una experiencia de prueba más fluida.

flq
fuente
6
+1, evite MSTest a menos que no tenga otra opción. Los diversos marcos de código abierto son mejores (xUnit, NUnit, MbUnit, etc.).
Brannon
49

Aquí está mi experiencia con MS Test

  • Estamos ejecutando MS Test con alrededor de 3800 Test.
  • Las pruebas tardan mucho en comenzar a ejecutarse, lo cual es doloroso cuando se ejecutan pruebas individuales.
  • Se necesitan alrededor de 1 GB de memoria para ejecutar las pruebas. No, no se debe a pérdidas de memoria en nuestras pruebas. Con frecuencia nos encontramos con OutOfMemoryExceptions.
  • Debido a que usa tantos recursos, estamos comenzando a ejecutar las pruebas desde archivos por lotes. Entonces, ¿para qué sirve toda la integración?
  • Tiene errores e inestable:
    • Por ejemplo, si elimina el atributo [Ignorar] de una prueba, no lo reconoce, porque almacena en caché información sobre las pruebas en algún lugar. Debe actualizar la lista de pruebas, que a veces resuelve el problema, o reiniciar VS.
    • No copia aleatoriamente ensamblados de referencia al directorio de salida.
    • Los elementos de implementación (archivos adicionales que se utilizarán) simplemente no funcionan correctamente. Se ignoran al azar.
  • Hay información oculta (no visible en el código de prueba) en los archivos vsmdi y testrunconfig. Si no le importa, es posible que no funcione.
  • Funcionalmente, podría ser comparable a NUnit, pero es muy costoso si considera usar la edición VS tester.

Además: tenemos algunas pruebas más ahora, ni siquiera puedo decir cuántas. Ya es imposible ejecutarlos todos desde Visual Studio, debido a OutOfMemoryExceptions y otros problemas de inestabilidad. Ejecutamos las pruebas a partir de scripts. Sería fácil ver los resultados de las pruebas en Visual Studio, pero cuando la solución está abierta, VS se bloquea (siempre). Por lo tanto, debemos buscar las pruebas que fallaron mediante la búsqueda de texto. Ya no hay ventaja de una herramienta integrada.


Otra actualización : estamos usando VS 2013 ahora. Muchas cosas cambiaron. Reescribieron el corredor de pruebas de MS Test por tercera vez desde que comenzamos. Esto provocó muchos cambios importantes, pero ninguna de las versiones nuevas estaba haciendo nada mejor. Nos alegra no haber utilizado las funciones sofisticadas de MS Test, porque ya no son compatibles. Realmente es una pena. Todavía estamos usando scripts para construir y ejecutar todas las pruebas unitarias, porque es más práctico. Visual Studio requirió unos minutos para comenzar a ejecutar las pruebas (el tiempo se mide después de la compilación hasta que comienza la primera prueba). Probablemente lo solucionen con una actualización y esto podría ser un problema específico de nuestro proyecto. Sin embargo, Resharper es mucho más rápido cuando ejecuta las mismas pruebas.

Conclusión : al menos en combinación con Resharper, MS Test es útil. Y espero que finalmente descubran cómo se debe escribir el ejecutor de pruebas y no harán este tipo de cambios importantes cuando actualicemos Visual Studio la próxima vez.

Stefan Steinegger
fuente
Recientemente comencé a ejecutarlos sin depurarlos, lo hace mucho más rápido y se parece mucho más a cómo se podría usar NUnit, pero sigue siendo una mierda. Parece que el bajo rendimiento está relacionado con que Visual Studio hace cosas raras al depurar. (Es decir, use "ctrl + F5" en lugar de solo "F5"; aún obtiene la agradable "integración" con VS)
Arafangion
Buena respuesta, me ahorré tiempo
FindOutIslamNow
18

NUnit se puede utilizar en combinación con Visual Studio. Es un marco, no un programa separado. Así que podría importarle y ver si le conviene :).

texto alternativo http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

"Después de instalar el complemento, encontrará un nuevo submenú en el menú de herramientas".

Consulte http://nunitit.codeplex.com/ para obtener más información sobre cómo importarlo.

Además, se pueden encontrar muchas cosas mediante la búsqueda de SO. Este tema enumera las ventajas de NUnit sobre las pruebas estándar de MS, por ejemplo.

bastijn
fuente
3

NUnit funciona con la edición estándar de VS.

Por Erik Stendahl
fuente
1
No olvide las versiones express de Visual Studios.
chobo2
Paso posterior a la construcción en el proyecto de ensamblaje de prueba de unidad: \ ruta \ a \ nUnidad $ (TargetFileName)
Steve Gilham
1

No estoy seguro de otros, pero NUnit proporciona una buena interfaz gráfica de usuario y una consola para ejecutar sus pruebas unitarias y también puede generar un informe del resultado de la ejecución de la prueba NUnit que daría el detalle de si la prueba falló o pasó y también a qué hora lo hizo. tomar para su prueba unitaria

Vinay Pandey
fuente
1

NUnit es un marco de pruebas unitarias, que también es compatible con resharper. Creo que está utilizando el marco de pruebas unitarias de Microsoft, por lo que NUnit es solo una alternativa al producto de Microsoft;)

Aquí está el enlace a la página de inicio de NUnit: http://nunit.org

Oliver Hanappi
fuente
¿Quiere decir que nunit no trae nada más que el marco de prueba unitario de Microsoft?
Tim
Lo hace, vea mi enlace, por ejemplo, en mi publicación (arriba).
bastijn
Estoy usando NUnit y realmente no conozco el marco de pruebas unitarias de Microsoft, así que no puedo decir qué es mejor. Creo que es muy probable que encuentre algún tema sobre las diferencias aquí en SO.
Oliver Hanappi
Proporciona algunas construcciones útiles como [TestCase] ​​para ejecutar un método de prueba con diferentes argumentos, [Theory] - para construir especificaciones más elaboradas y otras. También es compatible con una sintaxis fluida muy agradable para las afirmaciones. Y, por último, pero no menos importante, se usa mucho más que MSTest, por lo que tendrá más posibilidades de obtener soporte / información si se mete en problemas.
elder_george
0

En NUnit , las pruebas no se ejecutan en paralelo. Más bien, parece que todas las pruebas se ejecutan en un solo hilo. En MSTest, cada prueba se instancia en un subproceso separado, esto hace que las ejecuciones se intercalen. Por lo tanto, si la prueba A depende de la prueba B para su éxito, es probable que falle, ya que la prueba B probablemente comenzará a ejecutarse mientras se ejecuta la prueba A.

Mourad Samy
fuente
-12

Si está usando Visual Studio, debe usar NUnit para realizar la prueba unitaria, y si está ejecutando java (Netbeans), debe usar JUnit para la prueba unitaria.

Aquí hay un ejemplo de una prueba unitaria de calculadora simple

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}
Nipuna Prashan
fuente
4
Por supuesto que no tienes que usar NUnit, es solo un marco, nadie te obliga a usarlo. Incluso podría escribir uno propio si está aburrido.
HimBromBeere