F# разработка и модульное тестирование?
Я только начал с F#, который является моим первым функциональным языком. Я работал квази-исключительно с C#, и мне очень нравится, как F# заставляет меня переосмыслить, как я пишу код. Один аспект, который я нахожу немного дезориентирующим, - это изменение в процессе написания кода. Я использую TDD в течение многих лет в C# сейчас, и очень ценю, чтобы иметь модульные тесты, чтобы знать, где я нахожусь.
до сих пор мой процесс с F# состоял в том, чтобы написать некоторые функции, играть с ними с помощью интерактивного консоль, пока я не" разумно " уверен, что они работают, и настроить и объединить. Это хорошо работает с мелкомасштабными проблемами, такими как проект Эйлера, но я не могу себе представить, чтобы построить что-то большое таким образом.
Как люди подходят к модульному тестированию и созданию набора тестов для программы F#? Есть ли эквивалент TDD? Любые указатели или мысли приветствуются.
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 проверяет, что свойства хранятся в большом количестве случайно сгенерированные случаи.
как 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