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



Я только начал с F#, который является моим первым функциональным языком. Я работал квази-исключительно с C#, и мне очень нравится, как F# заставляет меня переосмыслить, как я пишу код. Один аспект, который я нахожу немного дезориентирующим, - это изменение в процессе написания кода. Я использую TDD в течение многих лет в C# сейчас, и очень ценю, чтобы иметь модульные тесты, чтобы знать, где я нахожусь.



до сих пор мой процесс с F# состоял в том, чтобы написать некоторые функции, играть с ними с помощью интерактивного консоль, пока я не" разумно " уверен, что они работают, и настроить и объединить. Это хорошо работает с мелкомасштабными проблемами, такими как проект Эйлера, но я не могу себе представить, чтобы построить что-то большое таким образом.



Как люди подходят к модульному тестированию и созданию набора тестов для программы F#? Есть ли эквивалент TDD? Любые указатели или мысли приветствуются.

579   6  

6 ответов:

разработчики, управляемые тестами, должны чувствовать себя как дома на функциональных языках, таких как F#: небольшие функции, которые дают детерминированно повторяемые результаты, идеально подходят для модульных тестов. Есть также функции в языке F#, которые облегчают написание тестов. Возьмем, к примеру,Выражения Объекта. Вы можете очень легко написать подделки для функций, которые принимают в качестве входных данных тип интерфейса.

во всяком случае, F# является первоклассным объектно-ориентированным языком и вы можете использовать те же инструменты и приемы, которые вы используете при выполнении TDD в C#. Есть также некоторые инструменты тестирования, написанные в Или специально для F#:

Матвей Подвысоцкий написал отличный серия о модульном тестировании на функциональных языках. Дядя Боб также написал статью, заставляющую задуматься здесь.

Я использую NUnit, и мне не кажется, что это трудно читать или обременительно писать:

open NUnit.Framework

[<TestFixture>]
type myFixture() = class

    [<Test>]
    member self.myTest() =
       //test code

end

посмотреть FsCheck, автоматический инструмент испытания для F#, по существу a быстрая проверка порта Хаскелл. Она позволяет вам обеспечить спецификацию программа, в виде свойств, которые должны иметь функции или методы удовлетворяйте, и FsCheck проверяет, что свойства хранятся в большом количестве случайно сгенерированные случаи.

FsCheck CodePlex Page

FsCheck Страница Автора

как dglaubman предлагает вы можете использовать NUnit. xUnit.net также обеспечивает поддержку для этого и хорошо работает с TestDriven.net. код похож на тесты NUnit, но без требования обернуть тест в содержащий тип.

#light

// Supply a module name here not a combination of module and namespace, otherwise
// F# cannot resolve individual tests nfrom the UI.
module NBody.DomainModel.FSharp.Tests

open System
open Xunit

open Internal

[<Fact>]
let CreateOctantBoundaryReordersMinMax() =
    let Max = VectorFloat(1.0, 1.0, 1.0)
    let Min = VectorFloat(-1.0, -1.0, -1.0)

    let result = OctantBoundary.create Min Max

    Assert.Equal(Min, result.Min)     
    Assert.Equal(Max, result.Max) 

Я думаю, что это очень интересный вопрос, о котором я сам много думал. Мои мысли пока только мысли, так что принимайте их такими, какие они есть.

Я думаю, что сеть безопасности автоматизированного набора тестов является слишком ценным активом, чтобы отпустить, однако заманчиво, что интерактивная консоль может быть, поэтому я планирую продолжать писать модульные тесты, как я всегда делал.

одной из основных сильных сторон .NET является кросс-языковые возможности. Я знаю, что буду ... написание производственного кода F# скоро, но мой план состоит в том, чтобы написать модульные тесты на C#, чтобы облегчить мой путь в то, что для меня новый язык. Таким образом, я также могу проверить, что то, что я пишу в F#, будет совместимо с C# (и другими языками .NET).

при таком подходе я понимаю, что есть определенные функции F#, которые я могу использовать только внутри моего кода F#, но не раскрывать как часть моего публичного API, но я приму это, так же как я принимаю сегодня, что есть определенные вещи, которые C# позволяет мне выразить (как uint), которые не соответствуют CLS, и поэтому я воздерживаюсь от их использования.

вы могли бы взглянуть на FSUnit - хотя я еще не использовал его, это может стоить попробовать. Конечно, лучше, чем использовать, например, (родной) NUnit в F#.

Comments

    Ничего не найдено.