एफ # विकास और इकाई परीक्षण?


107

मुझे बस F # से शुरुआत करनी थी, जो कि मेरी पहली कार्यात्मक भाषा है। मैं अर्ध-विशेष रूप से C # के साथ काम कर रहा हूं, और बहुत आनंद लेता हूं कि F # मुझे फिर से सोचने के लिए प्रेरित करता है कि मैं कोड कैसे लिखता हूं। एक पहलू मुझे थोड़ा भटका हुआ लगता है वह है कोड लिखने की प्रक्रिया में बदलाव। मैं सी # में अब सालों से टीडीडी का उपयोग कर रहा हूं, और वास्तव में यूनिट टेस्ट की सराहना करता हूं कि मैं कहां हूं।

अब तक, एफ # के साथ मेरी प्रक्रिया कुछ कार्यों को लिखने के लिए हुई है, उनके साथ इंटरैक्टिव कंसोल के साथ खेलते हैं जब तक कि मैं "यथोचित" नहीं हूं, सुनिश्चित करें कि वे काम करते हैं, और गठबंधन और गठबंधन करते हैं। यह यूलर प्रोजेक्ट जैसे छोटे स्तर की समस्याओं पर अच्छा काम करता है, लेकिन मैं इस तरह से कुछ बड़ा बनाने की कल्पना नहीं कर सकता।

लोग F # प्रोग्राम के लिए यूनिट टेस्टिंग और टेस्ट सूट बनाने के लिए कैसे संपर्क करते हैं? क्या TDD के बराबर है? किसी भी संकेत या विचार की सराहना की जाती है।


1
expert-fsharp.com/CodeSamples/Forms/… F # के साथ NUnit का उपयोग करने का एक सरल उदाहरण दिखाता है।
itowlson


संबंधित: stackoverflow.com/questions/5667372/… (Unquote एक फुटनोट / टिप्पणी से कहीं अधिक है क्योंकि यह इस पृष्ठ पर उत्तरपुस्तिका के भीतर है)
रूबेन बार्टेलिंक

इन उत्तरों में एक चीज़ गायब है, Foq, AutoFixture.AutoFoq और AutoFixture.xUnit का एक उचित उदाहरण है F # के प्रकार का अनुमान। एक taster के लिए trelford.com/blog/post/test5.aspx और trelford.com/blog/post/fstestlang.aspx देखें और किसी दिन मैं यहां एक उचित उत्तर
लिखूंगा

जवाबों:


77

परीक्षण-संचालित डेवलपर्स को एफ # जैसे कार्यात्मक भाषाओं में घर पर सही महसूस करना चाहिए: छोटे कार्य जो नियतात्मक रूप से दोहराए जाने वाले परिणाम देते हैं, खुद को इकाई परीक्षणों के लिए पूरी तरह से उधार देते हैं। एफ # भाषा में भी क्षमताएं हैं जो परीक्षण लिखने की सुविधा प्रदान करती हैं। उदाहरण के लिए, ऑब्जेक्ट एक्सप्रेशन लें । आप फ़ंक्शंस के लिए बहुत आसानी से फेक लिख सकते हैं जो उनके इनपुट को एक इंटरफ़ेस प्रकार के रूप में लेते हैं।

यदि कुछ भी, F # एक प्रथम श्रेणी की ऑब्जेक्ट-ओरिएंटेड भाषा है और आप उसी टूल और ट्रिक्स का उपयोग कर सकते हैं, जिसका उपयोग आप C # में TDD करते समय करते हैं। इसमें कुछ परीक्षण उपकरण भी लिखे गए हैं या विशेष रूप से एफ # के लिए:

मैथ्यू पॉडवॉस्की ने कार्यात्मक भाषाओं में इकाई परीक्षण पर एक महान श्रृंखला लिखी । अंकल बॉब भी एक विचार लेख उत्तेजक लिखा था यहां


9
मैंने भी विकसित किया है (और सक्रिय रूप से विकास कर रहा हूं) एक F # विशिष्ट इकाई परीक्षण पुस्तकालय जिसे Unquote: code.google.com/p/unquote कहा जाता है । यह आपको सादे, स्टेटिकली जाँचे गए F # बूलियन एक्सप्रेशंस को F # Quotations का उपयोग करते हुए टेस्ट असेसरीज लिखने की अनुमति देता है और स्वचालित रूप से अच्छे टेस्ट फेल मैसेज का उत्पादन करता है। यह xUnit.net और NUnit दोनों के लिए विशेष समर्थन के साथ विन्यास-मुक्त काम करता है और आम तौर पर किसी भी अपवाद आधारित इकाई परीक्षण ढांचे का समर्थन करता है। यह एफएसआई सत्रों के भीतर भी काम करता है जो इंटरैक्टिव परीक्षण से औपचारिक परीक्षण सूटों तक सहज प्रवास की अनुमति देता है।
स्टीफन स्वेंसन

नहीं है Pex भी, कि हालांकि थोड़ा अधिक कठिन grok की है।
बेंजोल

1
चाचा बॉब लिंक मर गया लगता है
आगी

22

मैं NUnit का उपयोग करता हूं, और यह मुझे पढ़ने या लिखने के लिए कठिन के रूप में हड़ताल नहीं करता है:

open NUnit.Framework

[<TestFixture>]
type myFixture() = class

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

end

चूँकि मेरा कोड F # और अन्य .Net भाषाओं का मिश्रण है, मुझे यह तथ्य पसंद है कि मैं मूल रूप से एक ही फैशन में इकाई परीक्षण लिखता हूँ और F # और C # दोनों में समान वाक्यविन्यास के साथ।


4
यहां अन्य प्रतिक्रियाओं को पढ़ने के बाद, मैंने एफएसयूनिट को एक कोशिश दी, और मुझे लगता है कि यह बहुत अच्छा है। यह TestDriven.Net (जैसा कि NUnit करता है) के साथ अच्छी तरह से काम करता है, स्व-दस्तावेजी परीक्षण लिखने की एक तरल शैली को प्रोत्साहित करता है और, रे राज्यों के रूप में, "एफ # भाषाओं में घर पर अधिक" है। कोड की 21 लाइनों के लिए बुरा नहीं है! (और लेआउट / नामकरण सिफारिशों की एक जोड़ी)। दो त्वरित नोट: 1. पूर्वनिर्धारित FSUnit DLL ने मेरे लिए काम नहीं किया। स्रोत से बिल्डिंग (FsUnit.NUnit-0.9.0.fs) ने समस्या को ठीक किया। 2. TestDriven.Net TextFixture नामों को नहीं पहचानता है जो दिखते हैं `like this`। डबल-टिक फॉर्म का उपयोग करके टेस्ट नामों को मान्यता दी गई है।
डेविड ग्लोबमैन

15

एफ # चेक पर एक नज़र डालें , एफ # के लिए एक स्वचालित परीक्षण उपकरण, मूल रूप से हास्केल के क्विकचेक का एक बंदरगाह है। यह आपको कार्यक्रम के विनिर्देश प्रदान करने की अनुमति देता है, गुणों के रूप में जिन्हें फ़ंक्शन या विधियों को संतुष्ट करना चाहिए, और FsCheck परीक्षण करता है कि गुण बड़ी संख्या में यादृच्छिक रूप से उत्पन्न मामलों में पकड़ रखते हैं।

FsCheck कोडपलेक्स पेज

FsCheck लेखक पृष्ठ


हां, मुझे लगता है कि FsCheck पारंपरिक यूनिट टेस्टिंग फ्रेमवर्क जैसे NUnit आदि की तुलना में बहुत अधिक प्रदान करता है
रॉबर्ट

11

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) 

1.9.1 के रूप में Xunit के नए अधिभार मेरे F # के साथ कहर पैदा कर रहे हैं।
रिक मिनेरिच

@RickMinerich मैंने वही अनुभव किया है जो मेरे कोड में हो रहा है। मैंने केवल स्पष्ट प्रकार के एनोटेशन को जोड़ना समाप्त किया ताकि सही अधिभार चुना जाए। बहरहाल, यह है दुर्भाग्य से अपने कोड में अधिक शोर जोड़ें।
एरिक शियरबॉम

11

मुझे लगता है कि यह एक बहुत ही दिलचस्प सवाल है जिसे मैंने खुद बहुत सोचा है। अब तक के मेरे विचार केवल विचार हैं, इसलिए उन्हें वही लें जो वे हैं।

मुझे लगता है कि एक स्वचालित परीक्षण सूट का सुरक्षा जाल भी जाने के लिए एक मूल्यवान संपत्ति है, हालांकि यह बताते हुए कि इंटरैक्टिव कंसोल हो सकता है, इसलिए मेरी योजना है कि मैं हमेशा किए गए यूनिट परीक्षणों को लिखना जारी रखूं।

.NET की मुख्य ताकत में से एक क्रॉस-लैंग्वेज क्षमताएं हैं। मुझे पता है कि मैं जल्द ही एफ # प्रोडक्शन कोड लिखने जा रहा हूं, लेकिन मेरी योजना सी # में यूनिट टेस्ट लिखने की है ताकि मेरे लिए एक नई भाषा में अपना रास्ता आसान हो सके। इस तरह, मुझे यह भी परखना है कि मैं F # में जो लिखता हूं वह C # (और अन्य .NET भाषाओं) के साथ संगत होगा।

इस दृष्टिकोण के साथ, मैं समझता हूं कि एफ # की कुछ विशेषताएं हैं जिन्हें मैं केवल अपने एफ # कोड में आंतरिक रूप से उपयोग कर सकता हूं, लेकिन अपने सार्वजनिक एपीआई के हिस्से के रूप में उजागर नहीं करता हूं, लेकिन मैं इसे स्वीकार करूंगा, जैसे मैं आज स्वीकार करता हूं कि कुछ चीजें हैं सी # मुझे व्यक्त करने की अनुमति देता है (जैसे uint) सीएलएस अनुरूप नहीं हैं, और इसलिए मैं उनका उपयोग करने से बचता हूं।


2
आपकी योजना कैसी रही? F # कोड को c # कोड के साथ टेस्ट करना आसान था? मैंने f # सीखना शुरू किया और मेरी योजना अपने प्रोजेक्ट के कुछ भाग को f # में लिखने की है और मेरा भी यही विचार है: f # के लिए भी c # में यूनिट टेस्ट लिखना है।
पीटर पोर्फी

@ कोई अपडेट? मुझे F # के साथ TDD का उपयोग करके प्रवाह में मुश्किल समय आ रहा है।
स्कॉट निमरोड 20

1
@ScottNimrod कुछ अपडेट्स: मेरे चार प्लुरलिट कोर्स F # के साथ परीक्षण या TDD के बारे में हैं। तुम भी मेरे Lanyrd प्रोफ़ाइल पर सम्मेलन वार्ता की मुफ्त रिकॉर्डिंग मिल जाएगा । अंत में, वहाँ अपने ब्लॉग
मार्क सीमैन

3
@ScottNimrod मैं मार्क के पीएस पाठ्यक्रमों के पूर्ण सेट को देखने के लिए समय और / या पैसे का भुगतान करने की अनुशंसा नहीं कर सकता - यह अधिकतम दक्षता के साथ आपके सिर में एक साथ यह सब स्नैप करेगा। हालांकि यह आपकी विशिष्ट आवश्यकताओं पर लागू हो सकता है या नहीं भी हो सकता है, लेकिन "ए फंक्शनल आर्किटेक्चर इन एफ #" बहुत सारे डॉट्स को जोड़ता है और इस पर दृढ़ता से विचार भी किया जाना चाहिए।
रूबेन बार्टलिंक

7

आप FSUnit पर एक नज़र डाल सकते हैं - हालांकि मैंने अभी तक इसका उपयोग नहीं किया है, यह एक कोशिश के काबिल हो सकता है। निश्चित रूप से उदाहरण के लिए उपयोग करने से बेहतर (देशी) एफ # में NUnit।


1
ShdNx, आप NUnit के खिलाफ क्यों सिफारिश करेंगे? डॉन सिमे की F # पुस्तक परीक्षण के लिए NUnit को दर्शाती है और यह C # में NUnit का उपयोग करने के समान सुंदर लगती है। FSUnit DSL शांत दिखता है, लेकिन पहले से ही परिचित लोगों के लिए NUnit (Mathias "वर्षों से TDD का उपयोग कर रहा है") क्या यह आपका अनुभव है कि F # के साथ NUnit का उपयोग करना C # या VB की तुलना में अधिक समस्याग्रस्त है?
itowlson

मैं दूसरी इटालसन टिप्पणी, और प्रश्न। निश्चित रूप से एफ # में NUnit बहुत अजीब लग रहा है, लेकिन इसके अलावा, क्या आप विशिष्ट मुद्दों के बारे में जानते हैं जो इसे कुछ और उपयोग करने के लिए एक अच्छा विचार है?
मैथियास

1
मैं कहता हूँ कि "बहुत सुंदर लग रही है" आमतौर पर कुछ बेहतर खोजने के लिए एक सम्मोहक कारण है। विषम दिखने का मतलब पढ़ना मुश्किल है, और पढ़ना मुश्किल का मतलब बग है। (मैं मान रहा हूँ कि "विषम दिखना" "नई और / या अपरिचित दिखने की तुलना में" पूरी तरह से अलग है - अपरिचित परिचित हो जाएगा, अजीब अजीब रहेगा।)
जेम्स मूर

1
ईमानदार होने के लिए (जैसा कि मैंने अपनी प्रतिक्रिया में उल्लेख किया है), मैंने अभी तक FSUnit का उपयोग नहीं किया है, लेकिन मैंने पढ़ा है कि F # में NUnit का उपयोग करना बहुत दर्दनाक है। क्षमा करें यदि ऐसा नहीं है।
ShdNx

4
स्पष्ट होने के लिए, यदि आप FsUnit का उपयोग करते हैं, तो आपके पास अभी भी टेस्टफ़िक्स और टेस्ट सदस्य होंगे। आपके पास मानक Assert.X कॉल नहीं होंगे। FsUnit बस आपको NUnit के इस भाग के चारों ओर एक आवरण देता है जो इसे F # भाषा में घर पर अधिक बनाता है।
रे वर्नागस

1

पार्टी में थोड़ा लेट होने के बावजूद, मैं माथियास का F # में स्वागत करना चाहता हूं (पहले से कहीं ज्यादा देर से!)) और इसमें झंकार करना कि आपको मेरी यूनिट टेस्टिंग लाइब्रेरी, एक्सपेक्टो पसंद आ सकती है

Expecto में आपकी पसंद की कुछ विशेषताएं हैं:

  • एफ # सिंटैक्स भर में, मूल्यों के रूप में परीक्षण; परीक्षण बनाने के लिए सादा F # लिखें
  • बिल्ट-इन एक्सपेक्ट मॉड्यूल का उपयोग करें, या जोर के लिए बाहरी एक्वायर्ड लाइब
  • डिफ़ॉल्ट रूप से समानांतर परीक्षण
  • अपने होपैक कोड या अपने Async कोड का परीक्षण करें; Expecto भर में Async है
  • लॉजि़क फैकेड के माध्यम से प्लगेबल लॉगिंग और मैट्रिक्स; बिल्ड सिस्टम के लिए आसानी से एडेप्टर लिखें, या अपने परीक्षण के निष्पादन समय के एक InfluxDB + Grafana डैशबोर्ड के निर्माण के लिए समय तंत्र का उपयोग करें
  • बेंचमार्कडॉटनेट के समर्थन में बनाया गया
  • FsCheck के समर्थन में बनाएँ; आपके ऑब्जेक्ट के / अभिनेता के राज्य स्थान के उत्पन्न / यादृच्छिक डेटा या बिल्डिंग इनवेरिएंट-मॉडल के साथ परीक्षण बनाना आसान बनाता है

-

open Expecto

let tests =
  test "A simple test" {
    let subject = "Hello World"
    Expect.equal subject "Hello World" "The strings should equal"
  }

[<EntryPoint>]
let main args =
  runTestsWithArgs defaultConfig args tests

https://github.com/haf/expecto/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.