clojure.test.check से गुण-आधारित परीक्षण
`clojure.test.check` का उपयोग करके विभिन्न इनपुट पर अपने कोड के गुणों का सत्यापन करने वाले सुदृढ़ परीक्षण लिखना सीखें
clojure.test.check से गुण-आधारित परीक्षण, CoddyKit पर Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
साधारण परीक्षणों से आगे
Property-Based Testing (PBT) में आपका स्वागत है! पारंपरिक यूनिट परीक्षण यह जाँचने के लिए विशिष्ट उदाहरणों का उपयोग करते हैं कि आपका कोड सही ढंग से काम करता है या नहीं। PBT एक अलग दृष्टिकोण अपनाता है।
उदाहरणों के बजाय, आप ऐसी गुणधर्मों को परिभाषित करते हैं जिन्हें आपका कोड इनपुट चाहे जो भी हो, हमेशा बनाए रखे। फिर, PBT उपकरण इन गुणधर्मों को तोड़ने का प्रयास करने के लिए अनेक विविध इनपुट तैयार करता है।
PBT बनाम उदाहरण-आधारित परीक्षण
इसे इस तरह समझिए:
- उदाहरण-आधारित परीक्षण (जैसे
clojure.test): "क्या(my-add 2 3)का परिणाम5आता है?" इनपुट आप चुनते हैं। - गुणधर्म-आधारित परीक्षण (
clojure.test.checkके साथ): "क्या किसी भी पूर्णांकaऔरbके लिए(my-add a b)हमेशा(my-add b a)के बराबर होता है?" उपकरणaऔरbतैयार करता है।
PBT उन सीमांत स्थितियों को खोजने में बहुत अच्छा है जिनके बारे में आप स्वयं शायद न सोच पाएँ।
for-all से गुणधर्म परिभाषित करना
clojure.test.check में आप for-all मैक्रो का उपयोग करके किसी गुणधर्म को परिभाषित करते हैं। इसमें बाइंडिंग का एक वेक्टर (जेनरेटर से जुड़े हुए चर) और एक प्रेडिकेट (ऐसा फ़ंक्शन, जो गुणधर्म सही होने पर true लौटाए) दिया जाता है।
इस सरल गुणधर्म को चलाकर देखें, जो जाँचता है कि तैयार किया गया मान वास्तव में एक पूर्णांक है।
(ns my-project.core
(:require [clojure.test.check :as tc]
[clojure.test.check.properties :refer [for-all]]
[clojure.test.check.generators :as gen]))
(defn run-int-property-check []
(let [result (tc/quick-check 100
(for-all [x gen/int]
(<= x (inc x))))] ; Property: x is always <= x+1
(println "Property check result:" result)))
(defn -main [& args]
(run-int-property-check))जेनरेटर से निर्माण
जेनरेटर (clojure.test.check.generators से, जिसे आमतौर पर gen के उपनाम से उपयोग किया जाता है) ऐसे फ़ंक्शन हैं जो किसी विशिष्ट प्रकार का यादृच्छिक डेटा तैयार करते हैं। वे PBT इनपुट का मुख्य आधार हैं।
सामान्य जेनरेटर में gen/int, gen/boolean, gen/string और कई अन्य शामिल हैं। आप इन्हें आपस में जोड़ भी सकते हैं!
(ns my-project.core
(:require [clojure.test.check.generators :as gen]))
(defn generate-and-print []
(println "Random int:" (gen/generate gen/int))
(println "Random boolean:" (gen/generate gen/boolean))
(println "Random string:" (gen/generate gen/string {:max-size 10}))) ; Limit string size for display
(defn -main [& args]
(generate-and-print))गुणधर्म जाँच चलाना
for-all से गुणधर्म परिभाषित करने के बाद, आपको उसे चलाना होता है। clojure.test.check इसके लिए quick-check और check जैसे फ़ंक्शन उपलब्ध कराता है।
tc/quick-check N property: गुणधर्म कोNबार चलाता है और सारांश लौटाता है।tc/check property: अधिक विस्तृत परिणाम देता है, विशेषकर तब जब कोई गुणधर्म विफल हो।
यहाँ हम जाँचते हैं कि जोड़ क्रमविनिमेय है (a + b = b + a)।
(ns my-project.core
(:require [clojure.test.check :as tc]
[clojure.test.check.properties :refer [for-all]]
[clojure.test.check.generators :as gen]))
(defn check-sum-property []
(let [sum-property (for-all [a gen/int b gen/int]
(= (+ a b) (+ b a)))] ; Addition is commutative
(println "Checking sum property...")
(let [result (tc/quick-check 100 sum-property)]
(println "Result:" result))))
(defn -main [& args]
(check-sum-property))व्यावहारिक गुणधर्म: उलटनीयता
जाँचने के लिए एक सामान्य और शक्तिशाली गुणधर्म उलटनीयता है। यदि आप कोई क्रिया लागू करने के बाद उसकी उलटी क्रिया लागू करते हैं, तो आपको मूल इनपुट वापस मिलना चाहिए।
आइए सरल encode और decode फ़ंक्शन परिभाषित करें (जो केवल स्ट्रिंग को उलटते हैं) और जाँचें कि (decode (encode s)) हमेशा s देता है या नहीं।
(ns my-project.core
(:require [clojure.test.check :as tc]
[clojure.test.check.properties :refer [for-all]]
[clojure.test.check.generators :as gen]))
(defn encode [s] (apply str (reverse s))) ; Simple reverse string
(defn decode [s] (apply str (reverse s)))
(defn check-encode-decode-property []
(let [prop (for-all [s (gen/string-alphanumeric 0 20)] ; Limit string size
(= s (decode (encode s))))]
(println "Checking encode/decode property...")
(let [result (tc/quick-check 100 prop)]
(println "Result:" result))))
(defn -main [& args]
(check-encode-decode-property))न्यूनतम विफलताएँ खोजना (छोटा करना)
clojure.test.check की सबसे उपयोगी सुविधाओं में से एक छोटा करना है। जब कोई गुणधर्म विफल होता है, तो यह आपको केवल पहली विफल इनपुट नहीं देता। इसके बजाय, यह ऐसा सबसे छोटा संभव इनपुट खोजने का प्रयास करता है जो फिर भी विफलता उत्पन्न करता हो।
इससे आपको किसी बग के मूल कारण का शीघ्र पता लगाने में सहायता मिलती है। यह उदाहरण चलाएँ: my-buggy-function में इनपुट 0 होने पर एक सूक्ष्म बग है।
(ns my-project.core
(:require [clojure.test.check :as tc]
[clojure.test.check.properties :refer [for-all]]
[clojure.test.check.generators :as gen]))
(defn my-buggy-function [x]
(if (= x 0) 100 x)) ; Bug: returns 100 if input is 0
(defn check-buggy-property []
(let [prop (for-all [x gen/int]
(> (my-buggy-function x) 0))] ; Property: result is always > 0
(println "Checking buggy property (expecting failure)...")
(let [result (tc/quick-check 100 prop)]
(println "Result (look for 'smallest' failing input):" result))))
(defn -main [& args]
(check-buggy-property))कस्टम जेनरेटर बनाना
आप केवल मूल जेनरेटर तक सीमित नहीं हैं। gen/fmap और gen/such-that जैसे फ़ंक्शन का उपयोग करके अधिक विशिष्ट डेटा प्रकारों के लिए जेनरेटर बनाने हेतु आप उन्हें संयोजित कर सकते हैं या उनके आउटपुट को बदल सकते हैं।
gen/fmap (फंक्टर मैप) किसी अन्य जेनरेटर से तैयार किए गए मान पर एक फ़ंक्शन लागू करता है। यहाँ हम धनात्मक पूर्णांकों के लिए एक जेनरेटर बनाते हैं।
(ns my-project.core
(:require [clojure.test.check :as tc]
[clojure.test.check.properties :refer [for-all]]
[clojure.test.check.generators :as gen]))
(def gen-positive-int
(gen/fmap #(inc %) gen/nat)) ; gen/nat produces non-negative numbers, inc makes them positive
(defn check-positive-property []
(let [prop (for-all [x gen-positive-int]
(> x 0))] ; Property: x is always greater than 0
(println "Checking positive integer property...")
(let [result (tc/quick-check 100 prop)]
(println "Result:" result))))
(defn -main [& args]
(check-positive-property))जेनरेटरों का संयोजन
जटिल डेटा संरचनाओं के लिए आप कई जेनरेटरों को मिला सकते हैं। gen/vector तैयार की गई वस्तुओं का एक वेक्टर बनाता है, gen/tuple निश्चित आकार का अनुक्रम बनाता है, और gen/hash-map तैयार की गई कुंजियों और मानों वाले मानचित्र बनाता है।
यहाँ सरल 'व्यक्ति' डेटा तैयार करने का एक उदाहरण है।
(ns my-project.core
(:require [clojure.test.check.generators :as gen]))
(def gen-person
(gen/hash-map :name (gen/string-alphanumeric 3 10)
:age (gen/choose 1 100)))
(defn generate-people []
(println "Generating 3 people:")
(dotimes [n 3]
(println " " (gen/generate gen-person))))
(defn -main [& args]
(generate-people))अपनी समझ जाँचें
गुणधर्म-आधारित परीक्षण मूल रूप से यह बदल देता है कि हम परीक्षण इनपुट के बारे में कैसे सोचते हैं।
पुनरावलोकन: PBT के साथ सुदृढ़ परीक्षण
इस पाठ में हमने clojure.test.check के साथ गुणधर्म-आधारित परीक्षण का अध्ययन किया।
- आपने
for-allका उपयोग करके गुणधर्म परिभाषित करना सीखा। - हमने देखा कि जेनरेटर (
gen/int,gen/stringआदि) किस तरह विविध इनपुट तैयार करते हैं। - आपने अपने गुणधर्म चलाने के लिए
quick-checkका उपयोग किया। - हमने न्यूनतम विफल मामलों को खोजने के लिए छोटा करने की उपयोगिता पर चर्चा की।
- अंत में, आपने जटिल डेटा के लिए कस्टम जेनरेटर बनाना और उनका संयोजन करना सीखा।
इनपुट की अनंत सीमा में व्यवहारों का परीक्षण करके अधिक सुदृढ़ और विश्वसनीय Clojure अनुप्रयोग लिखने के लिए PBT एक शक्तिशाली उपकरण है!
एआई शिक्षक के साथ Clojure सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 12
- पाठ
- 48
अक्सर पूछे जाने वाले प्रश्न
क्या “clojure.test.check से गुण-आधारित परीक्षण” पाठ निःशुल्क है?
हाँ—“clojure.test.check से गुण-आधारित परीक्षण” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“clojure.test.check से गुण-आधारित परीक्षण” में मैं क्या सीखूँगा?
`clojure.test.check` का उपयोग करके विभिन्न इनपुट पर अपने कोड के गुणों का सत्यापन करने वाले सुदृढ़ परीक्षण लिखना सीखें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“clojure.test.check से गुण-आधारित परीक्षण” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Clojure में कार्यात्मक प्रोग्रामिंग और JVM बैकएंड विकास पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- कुशल संसाधन-प्रसंस्करण के लिए ट्रांसड्यूसर
- मोनाड और फ़ंक्शनल अमूर्तन
- clojure.test.check से गुण-आधारित परीक्षण
- आलसी अनुक्रम और अनंत स्ट्रीम