2010-01-01 11 views
100

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

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

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

+1

http://www.expert-fsharp.com/CodeSamples/Forms/AllItems.aspx?RootFolder=%2fCodeSamples%2fChapter18%2fExample06 एफ # के साथ NUnit का उपयोग करने का एक सरल उदाहरण दिखाता है। – itowlson

+0

देखें http://stackoverflow.com/questions/1468772/how-to-handle-unit-tests-in-f –

+0

संबंधित: http://stackoverflow.com/questions/5667372/what-unit-testing-frameworks- उपलब्ध हैं- f/5669263 # 5669263 (Unquote एक फुटनोट/टिप्पणी से कहीं अधिक है क्योंकि यह इस पृष्ठ के उत्तर में है) –

उत्तर

71

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

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

मैथ्यू Podwysocki कार्यात्मक भाषाओं में इकाई परीक्षण पर एक बड़ा series लिखा था । चाचा बॉब ने एक विचार उत्तेजक लेख here भी लिखा था।

+9

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

+0

[Pex] (http://www.pexforfun.com/) भी है, हालांकि यह ग्रोक करने के लिए थोड़ा और मुश्किल है। – Benjol

+0

अंकल बॉब लिंक मृत लगता है – bump

6

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

+1

ShdNx, क्यों क्या आप नुनीत के खिलाफ सिफारिश करेंगे? डॉन सिमे की एफ # पुस्तक परीक्षण के लिए एनयूनीट दिखाती है और यह सी # में एनयूनीट का उपयोग करने के समान ही दिखती है। एफएसयूनीट डीएसएल अच्छा लग रहा है, लेकिन लोगों के लिए पहले से ही एनयूनीट से परिचित लोगों के लिए (माथीस "वर्षों से टीडीडी का उपयोग कर रहा है") क्या यह आपका अनुभव है कि एफ # के साथ एनयूनीट का उपयोग सी # या वीबी के मुकाबले अधिक समस्याग्रस्त है? – itowlson

+0

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

+1

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

10

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

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

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

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

+1

आपकी योजना कैसी चल रही थी? सी # कोड के साथ एफ # कोड का परीक्षण करना आसान था? मैंने f # सीखना शुरू किया और मेरी योजना f # में मेरी प्रोजेक्ट का कुछ हिस्सा लिखना है और मेरे पास एक ही विचार है: एफ # के लिए सी # में इकाई परीक्षण लिखना। –

+0

@Mark कोई अपडेट? मुझे एफडी के साथ टीडीडी का उपयोग करके प्रवाह में मुश्किल हो रही है। –

+1

@ स्कॉटनिमरोड कुछ अपडेट्स: चार [मेरे प्लुरसाइट कोर्स] (http://bit.ly/ploehralsight) परीक्षण के बारे में हैं या एफ # के साथ टीडीडी हैं। आपको [मेरी Lanyrd प्रोफ़ाइल] (http://lanyrd.com/profile/ploeh) पर सम्मेलन वार्ता के बहुत सारे मुफ्त रिकॉर्डिंग भी मिलेंगे।अंत में, [मेरा ब्लॉग] है (http://blog.ploeh.dk)। –

14

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

FsCheck CodePlex Page

FsCheck Author Page

+0

हां, मुझे लगता है कि एफएस चेक पारंपरिक यूनिट परीक्षण फ्रेमवर्क जैसे एनयूनीट इत्यादि से बहुत अधिक प्रदान करता है – Robert

21

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

open NUnit.Framework 

[<TestFixture>] 
type myFixture() = class 

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

end 

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

+4

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

10

जैसा कि 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) 
+0

1.9.1 के रूप में Xunit के नए अधिभार मेरे एफ # के साथ विनाश का कारण बन रहा है। –

+0

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

संबंधित मुद्दे