2009-09-23 17 views
14

¿Cómo se crean pruebas unitarias en F #? Normalmente utilizo la porción UnitTest de Visual Studio con los atributos [TestClass] y [TestMethod] y uso la Vista de prueba para ejecutarlos. Sé que puedo crear un archivo de script y ejecutar estos, pero me gusta la forma en que se maneja actualmente.¿Cómo se manejan las pruebas unitarias en F #?

+0

[Este reciente artículo mío] (http://fsharpnews.blogspot.com/2011/01/testing-behaviour-driven-development.html) describió esto y mucho más (pruebas BDD de F #). –

+0

Aquí hay un lugar para comenzar: http://bit.ly/1JhEbA7 –

Respuesta

9

prefiero usar FsUnit o FsTest para escribir pruebas en F #, se siente más natural que las pruebas de estilo OO xUnit.

EDIT 2014: Ahora considero que FsUnit/FsTest es azúcar de sintaxis principalmente inútil. Y "más natural que OO" no significa absolutamente nada. Hace unos meses escribí mis pensamientos actuales sobre las pruebas here (recomiendo leer todo el hilo).

10

Consulte fscheck. Es un puerto de Haskell's Quickcheck. Fscheck le permite especificar las propiedades que debe cumplir una función que luego verificará frente a una "gran cantidad de casos generados aleatoriamente".

Es algo que no se puede hacer fácilmente con un lenguaje imperativo como C#.

+0

Eche un vistazo a Pex: http://research.microsoft.com/en-us/projects/Pex/ –

+0

@Mauricio: Estoy de acuerdo en que es posible hacer lo que hace FsCheck (generar casos de prueba de forma aleatoria) en una configuración de OO (otro ejemplo: RANDOOP). Tal vez algún día tengamos un lenguaje de especificación (que se ve mucho mejor en una configuración funcional en mi opinión muy sesgada) que puede generar casos generados aleatoriamente y cubrir casos como Pex. –

+0

Ahora FsCheck tiene una interfaz C# para que pueda usar las funciones más importantes de FsCheck en C# también. –

1

Trate XUnit.net

+0

De acuerdo. (¿solo?) xUnit.NET puede ejecutar casos de prueba en métodos estáticos, por lo que si desea permanecer en los marcos de prueba de la unidad .NET comunes, es el que menos esfuerzo requiere. –

+0

MbUnit puede hacer esto también –

1

A partir de la versión 2.5, NUnit le permite usar static members as tests. Además, el TestFixtureAttribute de nivel de clase es only necessary for generic or classes with non-default constructors. NUnit también tiene un backward-compatible convention que un miembro de prueba puede comenzar con la palabra "prueba" en lugar de usar TestAttribute, por lo que casi puede escribir F # idiomático con NUnit> 2.5.

actualización Se puede ver algunos ejemplos de prueba sin el TestFixtureAttribute en el Cashel library. Continué usando TestAttribute ya que parece que pocos corredores de prueba recogen las pruebas correctamente cuando no están presentes, por lo que parte de la publicación de NUnit puede ser incorrecta o al menos engañosa.

+0

Ryan, ¿le gustaría elaborar con un ejemplo de prueba en F #? ¿O un enlace a un sitio que muestra las pruebas de unidad F # sin TestAttribute o TestFixtureAtrribute? –

+0

@David He agregado un enlace a mis pruebas para Cashel. –

2

Es posible que desee intentar NaturalSpec. Es un F-UnitTest-Framework además de NUnit.

3

que utilizan una combinación de xUnit.net, TestDriven.Net (Visual Studio Add-in para la ejecución de pruebas, libre para "estudiantes, desarrolladores de código abierto y los usuarios de ensayo"), y la biblioteca de mi propia fuente abierta Unquote (que también trabaja con NUnit y cualquier otro marco de aserciones basado en excepciones). Esto ha funcionado muy bien y empezar es muy fácil:

  1. Descargar e instalar TestDriven.Net
  2. Descargar xUnit.net, descomprimir a cualquier lugar y ejecutar xunit.installer.exe para integrarse con TestDriven.Net
  3. Descargar Fin de la cita, descomprima en cualquier lugar
  4. Crear un proyecto dentro de su solución para pruebas unitarias
  5. agregar referencias a xunit.dll y Unquote.dll (de descargas descomprimidos) en su proyecto de prueba de unidad
  6. El siguiente es un ejemplo simple de un archivo .fs en el proyecto de prueba de unidad que contiene pruebas de unidad de estilo xUnit.net/Unquote.

    module Tests 
    open Swensen.Unquote 
    open Xunit 
    
    [<Fact>] 
    let ``description of first unit test``() = 
        test <@ (11 + 3)/2 = String.length ("hello world".Substring(4, 5)) @> 
    
    [<Fact>] 
    let ``description of second unit test``() = 
        let x = List.rev [1;2;3;4] 
        x =? [4;3;1;2] 
    
  7. ejecutar todas las pruebas unitarias en el proyecto haciendo clic derecho en el proyecto en el explorador de soluciones y selección de prueba (s) Ejecutar.Tanto de las pruebas ejemplo anterior fallará con el siguiente impreso a la ventana de Visual Studio Output:

    ------ Test started: Assembly: Tests.dll ------ 
    
    Test 'Tests.description of second unit test' failed: 
    
    [4; 3; 2; 1] = [4; 3; 1; 2] 
    false 
    
        C:\Solution\Project\Tests.fs(12,0): at Tests.description of second unit test() 
    
    Test 'Tests.description of first unit test' failed: 
    
    (11 + 3)/2 = String.length ("hello world".Substring(4, 5)) 
    14/2 = String.length "o wor" 
    7 = 5 
    false 
    
        C:\Solution\Project\Tests.fs(7,0): at Tests.description of first unit test() 
    
    0 passed, 2 failed, 0 skipped, took 1.09 seconds (xUnit.net 1.7.0 build 1540). 
    
7

En VS2013 puede utilizar el siguiente.

open Microsoft.VisualStudio.TestTools.UnitTesting 
[<TestClass>] 
type testrun() = 
    [<TestInitialize>] 
    member x.setup() = 
     //your setup code 

    [<TestMethod>] 
    member x.yourTestName() = 
     //your test code 

Sugerencia: Si está buscando pruebas de unidad de interfaz de usuario, puede utilizar esta configuración con Canopy.

+1

Esta debería ser la respuesta aceptada. Esto usa la funcionalidad de prueba unitaria incorporada. Además (y no obviamente), este enfoque requiere agregar una referencia a Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll. – wizulus

+0

@alancnet solo está incorporado si está usando Visual Studio. – Yawar

Cuestiones relacionadas