Как обрабатывать модульные тесты в F #?

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

В 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.

Ответ 4

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

  • Загрузите и установите TestDriven.Net
  • Загрузите xUnit.net, распакуйте в любое место и запустите xunit.installer.exe для интеграции с TestDriven.Net.
  • Загрузите Unquote, распакуйте в любое место
  • Создайте проект в своем решении для модульных тестов
  • Добавьте ссылки на xunit.dll и Unquote.dll(из распакованных загрузок) в проекте unit test
  • Ниже приведен простой пример файла .fs в проекте unit test, содержащем тесты модульного стиля 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]
    
  • Запустите все модульные тесты в проекте, щелкнув правой кнопкой мыши проект в проводнике решений и выбрав Run Test (s). Оба теста предыдущего примера не будут распечатаны в окне вывода Visual Studio:

    ------ 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).
    

Ответ 5

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

Ответ 6

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

Ответ 7

Начиная с версии 2.5, NUnit позволяет использовать статические члены в качестве тестов. Кроме того, класс TestFixtureAttribute на уровне класса необходим только для родовых или классов с конструкторами, не использующими по умолчанию. NUnit также имеет совместимость с обратной связью, которую участник теста может начинать со слова "тест" вместо использования TestAttribute, поэтому вы можете почти написать идиоматический F # с NUnit > 2.5.

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