व्यावहारिक क्विकचेक अंमलबजावणीसह प्रॉपर्टी-बेस्ड टेस्टिंगचा शोध घ्या. अधिक विश्वसनीय सॉफ्टवेअरसाठी मजबूत, स्वयंचलित तंत्रांसह आपल्या टेस्टिंग स्ट्रॅटेजीज सुधारा.
प्रॉपर्टी-बेस्ड टेस्टिंगमध्ये प्राविण्य: एक क्विकचेक अंमलबजावणी मार्गदर्शक
आजच्या गुंतागुंतीच्या सॉफ्टवेअर लँडस्केपमध्ये, पारंपारिक युनिट टेस्टिंग, जरी मौल्यवान असले तरी, अनेकदा सूक्ष्म बग्स आणि एज केसेस शोधण्यात अपयशी ठरते. प्रॉपर्टी-बेस्ड टेस्टिंग (PBT) एक शक्तिशाली पर्याय आणि पूरक तंत्र आहे, जे उदाहरण-आधारित चाचण्यांवरून लक्ष हटवून विविध प्रकारच्या इनपुटसाठी सत्य ठरणाऱ्या गुणधर्मांना परिभाषित करण्यावर केंद्रित करते. हे मार्गदर्शक प्रॉपर्टी-बेस्ड टेस्टिंगचा सखोल अभ्यास प्रदान करते, विशेषतः क्विकचेक-शैलीतील लायब्ररी वापरून व्यावहारिक अंमलबजावणीवर लक्ष केंद्रित करते.
प्रॉपर्टी-बेस्ड टेस्टिंग म्हणजे काय?
प्रॉपर्टी-बेस्ड टेस्टिंग (PBT), ज्याला जनरेटिव्ह टेस्टिंग असेही म्हणतात, हे एक सॉफ्टवेअर टेस्टिंग तंत्र आहे जिथे तुम्ही तुमचा कोड कोणत्या गुणधर्मांची पूर्तता करतो हे परिभाषित करता, ऐवजी विशिष्ट इनपुट-आउटपुट उदाहरणे देण्याऐवजी. त्यानंतर टेस्टिंग फ्रेमवर्क आपोआप मोठ्या संख्येने रँडम इनपुट तयार करते आणि हे गुणधर्म टिकून राहतात की नाही हे तपासते. जर एखादा गुणधर्म अयशस्वी झाला, तर फ्रेमवर्क अयशस्वी इनपुटला एका लहान, पुन्हा तयार करता येण्याजोग्या उदाहरणामध्ये कमी करण्याचा प्रयत्न करते.
याचा असा विचार करा: "जर मी फंक्शनला इनपुट 'X' दिले, तर मला आउटपुट 'Y' अपेक्षित आहे" असे म्हणण्याऐवजी, तुम्ही म्हणता "मी या फंक्शनला कोणतेही इनपुट दिले तरी (विशिष्ट मर्यादांमध्ये), खालील विधान (गुणधर्म) नेहमीच सत्य असले पाहिजे".
प्रॉपर्टी-बेस्ड टेस्टिंगचे फायदे:
- एज केसेस उघड करते: पीबीटी अनपेक्षित एज केसेस शोधण्यात उत्कृष्ट आहे जे पारंपारिक उदाहरण-आधारित चाचण्यांमध्ये सुटू शकतात. हे खूप व्यापक इनपुट स्पेस एक्सप्लोर करते.
- वाढलेला आत्मविश्वास: जेव्हा एखादा गुणधर्म हजारो रँडमली जनरेट केलेल्या इनपुटमध्ये टिकून राहतो, तेव्हा तुम्ही तुमच्या कोडच्या अचूकतेबद्दल अधिक आत्मविश्वास बाळगू शकता.
- सुधारित कोड डिझाइन: गुणधर्म परिभाषित करण्याच्या प्रक्रियेमुळे अनेकदा सिस्टमच्या वर्तनाबद्दल सखोल समज प्राप्त होते आणि चांगल्या कोड डिझाइनवर प्रभाव पडू शकतो.
- कमी टेस्ट मेंटेनन्स: गुणधर्म अनेकदा उदाहरण-आधारित चाचण्यांपेक्षा अधिक स्थिर असतात, ज्यामुळे कोड विकसित झाल्यावर कमी देखभालीची आवश्यकता असते. तेच गुणधर्म राखून अंमलबजावणी बदलल्याने चाचण्या अवैध ठरत नाहीत.
- ऑटोमेशन: टेस्ट जनरेशन आणि श्रिंकिंग प्रक्रिया पूर्णपणे स्वयंचलित आहेत, ज्यामुळे डेव्हलपर्सना अर्थपूर्ण गुणधर्म परिभाषित करण्यावर लक्ष केंद्रित करण्यास मोकळीक मिळते.
क्विकचेक: अग्रणी
क्विकचेक, मूळतः हॅस्केल प्रोग्रामिंग भाषेसाठी विकसित केलेले, सर्वात प्रसिद्ध आणि प्रभावी प्रॉपर्टी-बेस्ड टेस्टिंग लायब्ररी आहे. हे गुणधर्म परिभाषित करण्याचा एक घोषणात्मक मार्ग प्रदान करते आणि ते सत्यापित करण्यासाठी स्वयंचलितपणे टेस्ट डेटा तयार करते. क्विकचेकच्या यशामुळे इतर भाषांमध्ये अनेक अंमलबजावणीस प्रेरणा मिळाली आहे, ज्यात अनेकदा "क्विकचेक" नाव किंवा त्याची मुख्य तत्त्वे वापरली जातात.
क्विकचेक-शैलीतील अंमलबजावणीचे मुख्य घटक आहेत:
- गुणधर्माची व्याख्या: गुणधर्म म्हणजे एक विधान जे सर्व वैध इनपुटसाठी सत्य असले पाहिजे. हे सामान्यतः एका फंक्शनच्या रूपात व्यक्त केले जाते जे जनरेट केलेले इनपुट युक्तिवाद म्हणून घेते आणि बुलियन मूल्य (गुणधर्म टिकल्यास सत्य, अन्यथा असत्य) परत करते.
- जनरेटर: जनरेटर विशिष्ट प्रकारचा रँडम इनपुट तयार करण्यासाठी जबाबदार असतो. क्विकचेक लायब्ररी सामान्यतः इंटिजर, स्ट्रिंग आणि बुलियन यांसारख्या सामान्य प्रकारांसाठी अंगभूत जनरेटर प्रदान करतात आणि आपल्याला आपल्या स्वतःच्या डेटा प्रकारांसाठी सानुकूल जनरेटर परिभाषित करण्याची परवानगी देतात.
- श्रिंकर: श्रिंकर हे एक फंक्शन आहे जे अयशस्वी इनपुटला एका लहान, पुन्हा तयार करता येण्याजोग्या उदाहरणामध्ये सोपे करण्याचा प्रयत्न करते. हे डीबगिंगसाठी महत्त्वपूर्ण आहे, कारण ते तुम्हाला अयशस्वी होण्याचे मूळ कारण पटकन ओळखण्यास मदत करते.
- टेस्टिंग फ्रेमवर्क: टेस्टिंग फ्रेमवर्क इनपुट तयार करून, गुणधर्म चालवून आणि कोणत्याही अपयशाची तक्रार करून टेस्टिंग प्रक्रियेचे आयोजन करते.
एक व्यावहारिक क्विकचेक अंमलबजावणी (संकल्पनात्मक उदाहरण)
जरी संपूर्ण अंमलबजावणी या दस्तऐवजाच्या व्याप्तीच्या पलीकडे असली तरी, चला एका काल्पनिक पायथॉन-सारख्या सिंटॅक्सचा वापर करून सोप्या, संकल्पनात्मक उदाहरणाद्वारे मुख्य संकल्पना स्पष्ट करूया. आम्ही एका फंक्शनवर लक्ष केंद्रित करू जे सूची उलट करते.
१. चाचणी अंतर्गत फंक्शन परिभाषित करा
def reverse_list(lst):
return lst[::-1]
२. गुणधर्म परिभाषित करा
`reverse_list` ने कोणते गुणधर्म पूर्ण केले पाहिजेत? येथे काही आहेत:
- दोनदा उलट केल्यावर मूळ सूची परत येते: `reverse_list(reverse_list(lst)) == lst`
- उलटलेल्या सूचीची लांबी मूळ सूचीइतकीच असते: `len(reverse_list(lst)) == len(lst)`
- रिकामी सूची उलट केल्यावर रिकामी सूची परत येते: `reverse_list([]) == []`
३. जनरेटर परिभाषित करा (काल्पनिक)
आम्हाला रँडम सूची तयार करण्याचा एक मार्ग हवा आहे. समजा आपल्याकडे `generate_list` नावाचे एक फंक्शन आहे जे जास्तीत जास्त लांबी एक युक्तिवाद म्हणून घेते आणि रँडम इंटिजर्सची सूची परत करते.
# काल्पनिक जनरेटर फंक्शन
def generate_list(max_length):
length = random.randint(0, max_length)
return [random.randint(-100, 100) for _ in range(length)]
४. टेस्ट रनर परिभाषित करा (काल्पनिक)
# काल्पनिक टेस्ट रनर
def quickcheck(property, generator, num_tests=1000):
for _ in range(num_tests):
input_value = generator()
try:
result = property(input_value)
if not result:
print(f"Property failed for input: {input_value}")
# इनपुट कमी करण्याचा प्रयत्न (येथे अंमलात आणलेले नाही)
break # सोपेपणासाठी पहिल्या अपयशानंतर थांबा
except Exception as e:
print(f"Exception raised for input: {input_value}: {e}")
break
else:
print("Property passed all tests!")
५. चाचण्या लिहा
आता आपण आपल्या काल्पनिक फ्रेमवर्कचा वापर करून चाचण्या लिहू शकतो:
# गुणधर्म १: दोनदा उलट केल्यावर मूळ सूची परत येते
def property_reverse_twice(lst):
return reverse_list(reverse_list(lst)) == lst
# गुणधर्म २: उलटलेल्या सूचीची लांबी मूळ सूचीइतकीच असते
def property_length_preserved(lst):
return len(reverse_list(lst)) == len(lst)
# गुणधर्म ३: रिकामी सूची उलट केल्यावर रिकामी सूची परत येते
def property_empty_list(lst):
return reverse_list([]) == []
# चाचण्या चालवा
quickcheck(property_reverse_twice, lambda: generate_list(20))
quickcheck(property_length_preserved, lambda: generate_list(20))
quickcheck(property_empty_list, lambda: generate_list(0)) #नेहमी रिकामी सूची
महत्त्वाची नोंद: हे केवळ चित्रणासाठी एक अत्यंत सोपे उदाहरण आहे. वास्तविक क्विकचेक अंमलबजावणी अधिक अत्याधुनिक असते आणि श्रिंकिंग, अधिक प्रगत जनरेटर आणि उत्तम त्रुटी अहवाल यांसारखी वैशिष्ट्ये प्रदान करते.
विविध भाषांमधील क्विकचेक अंमलबजावणी
क्विकचेक संकल्पना अनेक प्रोग्रामिंग भाषांमध्ये पोर्ट केली गेली आहे. येथे काही लोकप्रिय अंमलबजावणी आहेत:
- Haskell: `QuickCheck` (मूळ)
- Erlang: `PropEr`
- Python: `Hypothesis`, `pytest-quickcheck`
- JavaScript: `jsverify`, `fast-check`
- Java: `JUnit Quickcheck`
- Kotlin: `kotest` (प्रॉपर्टी-बेस्ड टेस्टिंगला समर्थन देते)
- C#: `FsCheck`
- Scala: `ScalaCheck`
अंमलबजावणीची निवड आपल्या प्रोग्रामिंग भाषेवर आणि टेस्टिंग फ्रेमवर्कच्या पसंतींवर अवलंबून असते.
उदाहरण: हायपोथिसिस (Python) वापरणे
चला पायथॉनमधील हायपोथिसिस वापरून एक अधिक ठोस उदाहरण पाहू. हायपोथिसिस एक शक्तिशाली आणि लवचिक प्रॉपर्टी-बेस्ड टेस्टिंग लायब्ररी आहे.
from hypothesis import given
from hypothesis.strategies import lists, integers
def reverse_list(lst):
return lst[::-1]
@given(lists(integers()))
def test_reverse_twice(lst):
assert reverse_list(reverse_list(lst)) == lst
@given(lists(integers()))
def test_reverse_length(lst):
assert len(reverse_list(lst)) == len(lst)
@given(lists(integers()))
def test_reverse_empty(lst):
if not lst:
assert reverse_list(lst) == lst
#चाचण्या चालवण्यासाठी, pytest कार्यान्वित करा
#उदाहरण: pytest your_test_file.py
स्पष्टीकरण:
- `@given(lists(integers()))` हे एक डेकोरेटर आहे जे हायपोथिसिसला टेस्ट फंक्शनसाठी इनपुट म्हणून इंटिजर्सची सूची तयार करण्यास सांगते.
- `lists(integers())` ही एक स्ट्रॅटेजी आहे जी डेटा कसा तयार करायचा हे निर्दिष्ट करते. हायपोथिसिस विविध डेटा प्रकारांसाठी स्ट्रॅटेजी प्रदान करते आणि आपल्याला अधिक जटिल जनरेटर तयार करण्यासाठी त्यांना एकत्र करण्याची परवानगी देते.
- `assert` स्टेटमेंट गुणधर्म परिभाषित करतात जे सत्य असले पाहिजेत.
जेव्हा तुम्ही ही चाचणी `pytest` सह चालवता (हायपोथिसिस स्थापित केल्यानंतर), हायपोथिसिस आपोआप मोठ्या संख्येने रँडम सूची तयार करेल आणि गुणधर्म टिकून राहतात की नाही हे सत्यापित करेल. जर एखादा गुणधर्म अयशस्वी झाला, तर हायपोथिसिस अयशस्वी इनपुटला किमान उदाहरणामध्ये कमी करण्याचा प्रयत्न करेल.
प्रॉपर्टी-बेस्ड टेस्टिंगमधील प्रगत तंत्रे
मूलभूत गोष्टींच्या पलीकडे, अनेक प्रगत तंत्रे आपल्या प्रॉपर्टी-बेस्ड टेस्टिंग स्ट्रॅटेजीज आणखी वाढवू शकतात:
१. सानुकूल जनरेटर
जटिल डेटा प्रकार किंवा डोमेन-विशिष्ट आवश्यकतांसाठी, आपल्याला अनेकदा सानुकूल जनरेटर परिभाषित करण्याची आवश्यकता असेल. या जनरेटरनी आपल्या सिस्टमसाठी वैध आणि प्रातिनिधिक डेटा तयार केला पाहिजे. यासाठी आपल्या गुणधर्मांच्या विशिष्ट आवश्यकता पूर्ण करण्यासाठी आणि केवळ निरुपयोगी आणि अयशस्वी चाचणी प्रकरणे तयार करणे टाळण्यासाठी डेटा तयार करण्यासाठी अधिक जटिल अल्गोरिदम वापरणे समाविष्ट असू शकते.
उदाहरण: जर तुम्ही तारीख पार्सिंग फंक्शनची चाचणी घेत असाल, तर तुम्हाला कदाचित एका विशिष्ट श्रेणीतील वैध तारखा तयार करणार्या सानुकूल जनरेटरची आवश्यकता असेल.
२. गृहीतके
कधीकधी, गुणधर्म केवळ विशिष्ट परिस्थितीतच वैध असतात. तुम्ही गृहीतके वापरून टेस्टिंग फ्रेमवर्कला या अटींची पूर्तता न करणारे इनपुट टाकून देण्यास सांगू शकता. यामुळे संबंधित इनपुटवर चाचणी प्रयत्न केंद्रित करण्यास मदत होते.
उदाहरण: जर तुम्ही संख्यांच्या सूचीची सरासरी मोजणाऱ्या फंक्शनची चाचणी घेत असाल, तर तुम्ही गृहीत धरू शकता की सूची रिकामी नाही.
हायपोथिसिसमध्ये, गृहीतके `hypothesis.assume()` सह अंमलात आणली जातात:
from hypothesis import given, assume
from hypothesis.strategies import lists, integers
@given(lists(integers()))
def test_average(numbers):
assume(len(numbers) > 0)
average = sum(numbers) / len(numbers)
# सरासरीबद्दल काहीतरी सिद्ध करा
...
३. स्टेट मशीन्स
स्टेट मशीन्स वापरकर्ता इंटरफेस किंवा नेटवर्क प्रोटोकॉल यांसारख्या स्टेटफुल सिस्टमची चाचणी करण्यासाठी उपयुक्त आहेत. तुम्ही सिस्टमच्या संभाव्य स्थिती आणि संक्रमणे परिभाषित करता आणि टेस्टिंग फ्रेमवर्क क्रियेचे क्रम तयार करते जे सिस्टमला वेगवेगळ्या स्थितींमधून चालवते. त्यानंतर गुणधर्म प्रत्येक स्थितीत सिस्टम योग्यरित्या वागते की नाही हे सत्यापित करतात.
४. गुणधर्म एकत्र करणे
तुम्ही अधिक जटिल आवश्यकता व्यक्त करण्यासाठी एकाच चाचणीमध्ये अनेक गुणधर्म एकत्र करू शकता. यामुळे कोडची पुनरावृत्ती कमी होण्यास आणि एकूणच चाचणी कव्हरेज सुधारण्यास मदत होऊ शकते.
५. कव्हरेज-गाइडेड फझिंग
काही प्रॉपर्टी-बेस्ड टेस्टिंग साधने कव्हरेज-गाइडेड फझिंग तंत्रांसह समाकलित होतात. यामुळे टेस्टिंग फ्रेमवर्कला कोड कव्हरेज जास्तीत जास्त करण्यासाठी तयार केलेले इनपुट गतिशीलपणे समायोजित करण्याची परवानगी मिळते, ज्यामुळे संभाव्यतः सखोल बग्स उघड होतात.
प्रॉपर्टी-बेस्ड टेस्टिंग केव्हा वापरावे
प्रॉपर्टी-बेस्ड टेस्टिंग हे पारंपारिक युनिट टेस्टिंगची जागा घेत नाही, तर एक पूरक तंत्र आहे. हे विशेषतः यासाठी योग्य आहे:
- जटिल लॉजिक असलेली फंक्शन्स: जिथे सर्व संभाव्य इनपुट संयोजनांचा अंदाज लावणे कठीण असते.
- डेटा प्रोसेसिंग पाइपलाइन्स: जिथे तुम्हाला डेटा ट्रान्सफॉर्मेशन सुसंगत आणि अचूक असल्याची खात्री करणे आवश्यक आहे.
- स्टेटफुल सिस्टम्स: जिथे सिस्टमचे वर्तन त्याच्या अंतर्गत स्थितीवर अवलंबून असते.
- गणितीय अल्गोरिदम: जिथे तुम्ही इनपुट आणि आउटपुटमधील इनव्हेरियंट्स आणि संबंध व्यक्त करू शकता.
- API कॉन्ट्रॅक्ट्स: एपीआय विस्तृत इनपुटसाठी अपेक्षेप्रमाणे वागते की नाही हे सत्यापित करण्यासाठी.
तथापि, पीबीटी फक्त काही संभाव्य इनपुट असलेल्या अगदी सोप्या फंक्शन्ससाठी किंवा जेव्हा बाह्य सिस्टमसह संवाद जटिल आणि मॉक करणे कठीण असते तेव्हा सर्वोत्तम पर्याय असू शकत नाही.
सामान्य अडचणी आणि सर्वोत्तम पद्धती
जरी प्रॉपर्टी-बेस्ड टेस्टिंग महत्त्वपूर्ण फायदे देत असले तरी, संभाव्य अडचणींबद्दल जागरूक असणे आणि सर्वोत्तम पद्धतींचे पालन करणे महत्त्वाचे आहे:
- अयोग्यरित्या परिभाषित केलेले गुणधर्म: जर गुणधर्म व्यवस्थित परिभाषित केलेले नसतील किंवा सिस्टमच्या आवश्यकता अचूकपणे प्रतिबिंबित करत नसतील, तर चाचण्या निष्प्रभ असू शकतात. गुणधर्मांवर काळजीपूर्वक विचार करण्यासाठी वेळ द्या आणि ते व्यापक आणि अर्थपूर्ण असल्याची खात्री करा.
- अपुरे डेटा जनरेशन: जर जनरेटर विविध प्रकारच्या इनपुटची निर्मिती करत नसतील, तर चाचण्यांमध्ये महत्त्वाचे एज केसेस सुटू शकतात. जनरेटर विस्तृत मूल्ये आणि संयोजने कव्हर करतात याची खात्री करा. जनरेशन प्रक्रियेला मार्गदर्शन करण्यासाठी बाउंड्री व्हॅल्यू ॲनालिसिससारख्या तंत्रांचा वापर करण्याचा विचार करा.
- हळू चाचणी अंमलबजावणी: मोठ्या संख्येने इनपुटमुळे प्रॉपर्टी-बेस्ड चाचण्या उदाहरण-आधारित चाचण्यांपेक्षा हळू असू शकतात. चाचणी अंमलबजावणी वेळ कमी करण्यासाठी जनरेटर आणि गुणधर्म ऑप्टिमाइझ करा.
- यादृच्छिकतेवर (randomness) जास्त अवलंबून राहणे: जरी यादृच्छिकता पीबीटीचा एक महत्त्वाचा पैलू असला तरी, तयार केलेले इनपुट अजूनही संबंधित आणि अर्थपूर्ण असल्याची खात्री करणे महत्त्वाचे आहे. पूर्णपणे यादृच्छिक डेटा तयार करणे टाळा ज्यामुळे सिस्टममध्ये कोणतेही मनोरंजक वर्तन ट्रिगर होण्याची शक्यता नाही.
- श्रिंकिंगकडे दुर्लक्ष करणे: श्रिंकिंग प्रक्रिया अयशस्वी चाचण्या डीबग करण्यासाठी महत्त्वपूर्ण आहे. कमी केलेल्या उदाहरणांकडे लक्ष द्या आणि अपयशाचे मूळ कारण समजून घेण्यासाठी त्यांचा वापर करा. जर श्रिंकिंग प्रभावी नसेल, तर श्रिंकर किंवा जनरेटर सुधारण्याचा विचार करा.
- उदाहरण-आधारित चाचण्यांसह एकत्र न करणे: प्रॉपर्टी-बेस्ड टेस्टिंगने उदाहरण-आधारित चाचण्यांना पूरक असले पाहिजे, त्यांची जागा घेऊ नये. विशिष्ट परिस्थिती आणि एज केसेस कव्हर करण्यासाठी उदाहरण-आधारित चाचण्या वापरा, आणि व्यापक कव्हरेज प्रदान करण्यासाठी आणि अनपेक्षित समस्या उघड करण्यासाठी प्रॉपर्टी-बेस्ड चाचण्या वापरा.
निष्कर्ष
प्रॉपर्टी-बेस्ड टेस्टिंग, ज्याची मुळे क्विकचेकमध्ये आहेत, सॉफ्टवेअर टेस्टिंग पद्धतींमध्ये एक महत्त्वपूर्ण प्रगती दर्शवते. विशिष्ट उदाहरणांवरून सामान्य गुणधर्मांवर लक्ष केंद्रित करून, ते डेव्हलपर्सना छुपे बग्स शोधण्यासाठी, कोड डिझाइन सुधारण्यासाठी आणि त्यांच्या सॉफ्टवेअरच्या अचूकतेवर आत्मविश्वास वाढविण्यासाठी सक्षम करते. पीबीटीमध्ये प्राविण्य मिळवण्यासाठी मानसिकतेत बदल आणि सिस्टमच्या वर्तनाची सखोल समज आवश्यक असली तरी, सुधारित सॉफ्टवेअर गुणवत्ता आणि कमी देखभाल खर्चाच्या बाबतीत मिळणारे फायदे प्रयत्नांना योग्य आहेत.
तुम्ही एका जटिल अल्गोरिदमवर, डेटा प्रोसेसिंग पाइपलाइनवर किंवा स्टेटफुल सिस्टमवर काम करत असाल, तरीही आपल्या टेस्टिंग स्ट्रॅटेजीमध्ये प्रॉपर्टी-बेस्ड टेस्टिंगचा समावेश करण्याचा विचार करा. तुमच्या पसंतीच्या प्रोग्रामिंग भाषेत उपलब्ध असलेल्या क्विकचेक अंमलबजावणीचा शोध घ्या आणि तुमच्या कोडचे सार कॅप्चर करणारे गुणधर्म परिभाषित करण्यास सुरुवात करा. पीबीटी उघड करू शकणाऱ्या सूक्ष्म बग्स आणि एज केसेस पाहून तुम्हाला आश्चर्य वाटेल, ज्यामुळे अधिक मजबूत आणि विश्वसनीय सॉफ्टवेअर तयार होईल.
प्रॉपर्टी-बेस्ड टेस्टिंगचा स्वीकार करून, तुम्ही तुमचा कोड अपेक्षेप्रमाणे काम करतो की नाही हे तपासण्यापलीकडे जाऊन तो मोठ्या प्रमाणात शक्यतांमध्ये अचूकपणे काम करतो हे सिद्ध करण्याकडे वाटचाल करू शकता.