2009-09-23 3 views
14

Как вы создаете модульные тесты в F #? Обычно я использую часть UnitTest Visual Studio с атрибутами [TestClass] и [TestMethod] и использую Test View для их запуска. Я знаю, что могу просто создать файл сценария и запустить его, но мне нравится, как он обрабатывается в настоящий момент.Как обрабатывать модульные тесты в F #?

+0

[Эта недавняя моя статья] (http://fsharpnews.blogspot.com/2011/01/testing-behaviour-driven-development.html) описала это и многое другое (тестирование BDD из F #). –

+0

Вот где начать: http://bit.ly/1JhEbA7 –

ответ

9

Я предпочел бы использовать FsUnit или FsTest писать тесты в F #, он чувствует себя более естественно, чем OO xUnit испытаний типа.

EDIT 2014: Теперь я считаю, что FsUnit/FsTest является в основном бесполезным синтаксическим сахаром. И «более естественный, чем OO» не означает абсолютно ничего. Несколько месяцев назад я написал свои текущие мысли по тестированию here (я рекомендую читать всю цепочку).

10

Отъезд fscheck. Это порт Quickcheck Хаскелла. Fscheck позволяет указать свойства, которые должна удовлетворять функция, которая затем будет проверяться на «большое количество случайных случаев».

Это то, что вы не можете легко сделать с императивным языком, как C#.

+0

Взгляните на Pex: http://research.microsoft.com/en-us/projects/Pex/ –

+0

@Mauricio: Я согласен с тем, что это возможно делать то, что делает FsCheck (случайно генерируя тестовые примеры) в настройке OO (еще один пример: RANDOOP). Возможно, в один прекрасный день у нас будет один язык спецификации (который выглядит намного лучше в функциональной настройке в моем очень предвзятом мнении), который может генерировать как случайно сгенерированные случаи, так и охватывать такие случаи, как Pex. –

+0

Теперь FsCheck имеет интерфейс C#, поэтому вы можете использовать наиболее важные функции FsCheck на C#. –

1

Попробуйте XUnit.net

+0

Согласен. (только?) xUnit.NET может запускать тестовые примеры в статических методах, поэтому, если вы хотите оставаться в основных платформах .NET-тестов, которые требуют минимальных усилий. –

+0

MbUnit может сделать это тоже –

1

Начиная с версии 2.5, NUnit позволяет использовать static members as tests. Кроме того, класс TestFixtureAttribute класса only necessary for generic or classes with non-default constructors. NUnit также имеет backward-compatible convention, что тестовый член может начинать со слова «тест» вместо использования TestAttribute, поэтому вы можете почти написать идиоматический F # с NUnit> 2.5.

Update Вы можете увидеть некоторые примеры тестов без TestFixtureAttribute в Cashel library. Я продолжал использовать TestAttribute, так как кажется, что несколько тестовых бегунов правильно подбирают тесты, когда их нет, так что часть сообщения NUnit может быть неправильной или, по крайней мере, вводить в заблуждение.

+0

Ryan, вы хотели бы разработать пример теста в F #? Или ссылка на сайт, который показывает модульные тесты F # без TestAttribute или TestFixtureAtrribute? –

+0

@David Я добавил ссылку на мои тесты для Cashel. – 2011-01-24 23:21:16

2

Возможно, вы захотите попробовать NaturalSpec. Это F # UnitTest-Framework поверх NUnit.

3

Я использую комбинацию xUnit.net, TestDriven.Net (Visual Studio надстройка для запуска тестов, бесплатно «студенты, разработчики с открытым исходным кодом и пользователей пробных»), и моей библиотекой собственного открытым источником Unquote (который также работает с NUnit и любая другая основанная на исключениях структура утверждения). Это удалось большой и начать работу очень просто:

  1. Скачать и установить TestDriven.Net
  2. Скачать xUnit.net, распаковать в любое место и запустить xunit.installer.exe для интеграции с TestDriven.Net
  3. Скачать Unquote, распакуйте в любое место
  4. Создать проект в рамках вашего решения для модульных тестов
  5. Добавить ссылки на xunit.dll и Unquote.dll (от распакованы загрузки) в тестовом проекте блока
  6. Ниже приведен простой пример файла .fs в модульном тестовом проекте, содержащем тесты модульного стиля 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. Выполнить все модульные тесты в проекте, щелкнув правой кнопкой мыши проект в обозревателе решений и выберите Run Test (ов).Оба предыдущих примера тестов потерпит неудачу со следующим напечатанный в окне 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

В VS2013 вы можете использовать ниже.

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

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

Подсказка: если вы ищете тестирование модуля UI, вы можете использовать эту настройку с Canopy.

+1

Это должен быть принятый ответ. Это использует встроенные функции тестирования модулей. Кроме того (и не очевидно), этот подход требует добавления ссылки на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll. – wizulus

+0

@alancnet это только встроенный, если вы используете Visual Studio. – Yawar

Смежные вопросы