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

सैद्धांतिक न्यूनतम
Xcode के लिए एक नया टूल बनाने के लिए, आपको दो सैद्धांतिक ब्लॉकों की समझ की आवश्यकता है। उन लोगों के लिए जो इसे अपने दम पर समझाना चाहते हैं, हम तुरंत आवश्यक लिंक देंगे:
बाकी के लिए - नीचे आवश्यक विषयों का एक संक्षिप्त सारांश है।
पहले फ़ाइल -> नया -> प्रोजेक्ट -> macOS श्रेणी -> उपकरण पैकेज चुनें। बनाई गई परियोजना में एक्सटेंशन .instrpkg के साथ एक फ़ाइल शामिल है, जिसमें xml प्रारूप में एक नया उपकरण घोषित किया गया है। चलो मार्कअप तत्वों से परिचित होते हैं:
क्या | गुण | विवरण
|
डेटा स्कीमा
| अंतराल-स्कीमा, बिंदु-स्कीमा, आदि।
| एसक्यूएल योजनाओं जैसी तालिका के रूप में डेटा संरचना का वर्णन करता है। मॉडल के इनपुट और आउटपुट में डेटा के प्रकार को निर्धारित करने के लिए अन्य मार्कअप तत्वों में योजनाओं का उपयोग किया जाता है, उदाहरण के लिए, मैपिंग (यूआई) का वर्णन करते समय।
|
डेटा स्कीमा आयात करें
| आयात स्कीमा
| तैयार योजनाओं को आयात करें। यह आपको ऐप्पल द्वारा परिभाषित डेटा संरचनाओं का उपयोग करने की अनुमति देता है।
|
टूल मॉडल
| नमूना बनानेवाला
| उपकरण को एक .clp फ़ाइल के साथ संबद्ध करता है, जिसमें उपकरण का तर्क परिभाषित होता है, और मॉडल के इनपुट और आउटपुट पर अपेक्षित डेटा योजना की घोषणा करता है।
|
उपकरण का विवरण
| साधन
| डेटा मॉडल का वर्णन करता है और यह निर्धारित करता है कि UI में घटनाओं को कैसे प्रदर्शित किया जाएगा। डेटा मॉडल का वर्णन विशेषताओं के निर्माण तालिका, बनाने-पैरामीटर, आदि का उपयोग करके किया जाता है। टूल चार्ट को ग्राफ विशेषताओं द्वारा परिभाषित किया जाता है, और भागों की तालिका सूची, कथा, आदि द्वारा परिभाषित की जाती है।
|
यदि हम नए टूल के तर्क को पूरक करना चाहते हैं, तो CLIPS कोड के साथ एक .clp फ़ाइल बनाएं। मूल भाषा इकाइयाँ:
- "तथ्य" एस्टर कमांड का उपयोग करके सिस्टम में पंजीकृत एक निश्चित घटना है;
- "नियम" एक विशेष खंड के साथ एक अगर-ब्लॉक है जिसमें एक शर्त होती है जिसके तहत कार्यों का एक सेट किया जाता है।
कौन से नियम और किस क्रम में सक्रिय होंगे, इसका निर्धारण CLIPS खुद आने वाले तथ्यों, नियमों की प्राथमिकताओं और संघर्ष समाधान तंत्र के आधार पर करता है।
भाषा आदिम, तार्किक और तार्किक कार्यों के उपयोग के आधार पर डेटा प्रकारों के निर्माण का समर्थन करती है। कक्षाओं की परिभाषा के साथ-साथ संदेश भेजने, एकाधिक विरासत भेजने के साथ-साथ पूर्ण-उन्मुख ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP)।
किसी भाषा के मूल सिंटैक्स पर विचार करें जो आपको कस्टम टूल के लिए तर्क बनाने की अनुमति देता है।
1. एक
fact
बनाने के लिए,
assert
निर्माण का उपयोग करें:
CLIPS> (assert (duck))
इस प्रकार, हमें फैक्ट टेबल में
duck
एंट्री मिलती है, जिसे
facts
कमांड का उपयोग करके देखा जा सकता है:
CLIPS> (facts)
इस तथ्य को दूर करने के लिए,
retract
कमांड का उपयोग करें:
(retract duck)
2. एक
rule
बनाने के लिए,
defrule
निर्माण का उपयोग करें:
CLIPS> (defrule duck) — duck (animal-is duck)</i> — animal-is duck => (assert (sound-is quack))) — sound-is quack
3. चर बनाने और उपयोग करने के लिए, निम्नलिखित वाक्यविन्यास का उपयोग किया जाता है (चर नाम से पहले एक अनिवार्य संकेत है "?")?
?<variable-name>
4. आप उपयोग करके नए डेटा प्रकार बना सकते हैं:
CLIPS> (deftemplate prospect (slot name (type STRING) (default ?DERIVE)) (slot assets (type SYMBOL) (default rich)) (slot age (type NUMBER) (default 80)))
इसलिए, हमने नाम की संरचना और तीन विशेषताओं के नाम, संपत्ति और संबंधित प्रकार की आयु और एक डिफ़ॉल्ट मान के साथ एक संरचना को परिभाषित किया।
5. अंकगणित और तार्किक संचालन में उपसर्ग सिंटैक्स होता है। अर्थात्, 2 और 3 को जोड़ने के लिए, आपको निम्नलिखित निर्माण का उपयोग करना होगा:
CLIPS> (+ 2 3)
या दो चर x और y की तुलना करने के लिए:
CLIPS> (> ?x ?y)
व्यावहारिक उदाहरण
हमारी परियोजना में, हम स्टब ऑब्जेक्ट बनाने के लिए
OCMock लाइब्रेरी का उपयोग करते हैं। हालांकि, ऐसी परिस्थितियां हैं जब एक मॉक उस परीक्षण से अधिक समय तक रहता है जिसके लिए इसे बनाया गया था, और अन्य परीक्षणों के अलगाव को प्रभावित करता है। परिणामस्वरूप, यह यूनिट परीक्षणों के "ब्लिंकिंग" (अस्थिरता) की ओर जाता है। परीक्षण और मॉक के जीवनकाल को ट्रैक करने के लिए, हम अपना टूल बनाएंगे। निम्नलिखित क्रियाओं का एक एल्गोरिथ्म है।
चरण 1. साइनपोस्ट घटनाओं के लिए मार्कअप बनाना
समस्याग्रस्त मोक्स का पता लगाने के लिए, अंतराल घटनाओं की दो श्रेणियों की आवश्यकता होती है - मोक्सा के निर्माण और विनाश का समय, परीक्षण का प्रारंभ और अंत समय। इन घटनाओं को प्राप्त करने के लिए,
OCMock
लाइब्रेरी पर जाएं और उन्हें
init
में
signpost
साथ
signpost
और
stopMocking
तरीकों को
stopMocking
।


अगला, अध्ययन के तहत प्रोजेक्ट पर जाएं, यूनिट टेस्ट,
setUp
और
tearDown
में मार्कअप करें:

चरण 2. इंस्ट्रूमेंट पैकेज टेम्पलेट से एक नया टूल बनाएं

सबसे पहले, हम इनपुट के डेटा प्रकार का निर्धारण करते हैं। ऐसा करने के लिए,
.instrpkg
signpost
योजना को
signpost
में आयात करते हैं। अब
signpost
द्वारा बनाई गई घटनाएं उपकरण में आ जाएंगी:

अगला, हम आउटपुट में डेटा का प्रकार निर्धारित करते हैं। इस उदाहरण में, हम एक साथ घटनाओं का उत्पादन करेंगे। प्रत्येक घटना का एक समय और विवरण होगा। ऐसा करने के लिए, इस योजना की घोषणा करें:

चरण 3. हम उपकरण के तर्क का वर्णन करते हैं
हम एक्सटेंशन
.clp
साथ एक अलग फ़ाइल
.clp
, जिसमें हम
.clp
भाषा का उपयोग करके नियम निर्धारित करते हैं। नए उपकरण को यह बताने के लिए कि किस फाइल में तर्क परिभाषित है,
modeler
ब्लॉक जोड़ें:

इस ब्लॉक में,
production-system
विशेषता का उपयोग करके, तर्क के साथ फ़ाइल के सापेक्ष पथ निर्दिष्ट करें। विशेषताओं
output
और
required-input
क्रमशः इनपुट और आउटपुट के लिए डेटा योजनाओं को परिभाषित करते हैं।

चरण 4. हम उपकरण (यूआई) की प्रस्तुति की बारीकियों का वर्णन करते हैं
.instrpkg
फ़ाइल में,
.instrpkg
उपकरण का वर्णन करने के लिए बना रहता है,
.instrpkg
, परिणाम प्रदर्शित करता है।
schema-ref
विशेषता में पहले
detected-mocks-narrative
schema-ref
का उपयोग करके
create-table
विशेषता में डेटा के लिए एक तालिका बनाएं। और सूचना आउटपुट के प्रकार को सेट करें - कथा (वर्णनात्मक):

चरण 5. हम तर्क कोड लिखते हैं
आइए
.clp
फ़ाइल पर
.clp
हैं, जिसमें विशेषज्ञ प्रणाली के तर्क को परिभाषित किया गया है। तर्क निम्नानुसार होगा: यदि परीक्षण का प्रारंभ समय मोका के जीवन के अंतराल को अवरुद्ध करता है, तो हम मानते हैं कि यह मोक एक और परीक्षण से आया था - जो वर्तमान इकाई-परीक्षण के अलगाव का उल्लंघन करता है। अंततः ब्याज की जानकारी के साथ एक घटना बनाने के लिए, आपको निम्न चरणों को करने की आवश्यकता है:
1. खेतों के साथ मॉक और यूनिटटेस्ट संरचनाओं को परिभाषित करें - घटना का समय, घटना पहचानकर्ता, परीक्षण का नाम और मोक का वर्ग।

2. हम नियमों को परिभाषित करते हैं जो
signpost
की आने वाली घटनाओं के आधार पर प्रकार के
mock
और
unitTest
साथ तथ्य बनाएंगे:

इन नियमों को निम्नानुसार पढ़ा जा सकता है: यदि इनपुट पर हमें वांछित
subsystem
,
category
,
name
और
event-type
साथ ओएस-साइनपोस्ट प्रकार का एक तथ्य मिलता है, तो उस प्रकार के साथ एक नया तथ्य बनाएं जो ऊपर परिभाषित किया गया था (यूनिटटेस्ट या मॉक, और इसे मानों के साथ भरें। यहां यह याद रखना महत्वपूर्ण है - CLIPS एक केस-संवेदी भाषा है और सबसिस्टम, श्रेणी, नाम और घटना-प्रकार के मूल्यों का अध्ययन के तहत परियोजना के कोड में क्या उपयोग किया गया था, यह मेल खाना चाहिए।

साइनपोस्ट घटनाओं से चर इस प्रकार से पारित किए जाते हैं:

3. हम उन नियमों को परिभाषित करते हैं जो पूर्ण घटनाओं को जारी करते हैं (वे निरर्थक हैं, क्योंकि वे परिणाम को प्रभावित नहीं करते हैं)।

चरण 6. नियम को परिभाषित करें जो परिणाम उत्पन्न करेगा।
आप नियम को इस तरह पढ़ सकते हैं।
अगर1) यूनिटटेस्ट और मॉक है;
2) इस मामले में, परीक्षण की शुरुआत मौजूदा मोके की तुलना में बाद में होती है;
3) पता लगाए गए-नकली-कथा स्कीमा के साथ परिणाम संग्रहीत करने के लिए एक तालिका है;
4) एक नया रिकॉर्ड बनाएं;
5) समय के साथ भरें;
6) ... और एक विवरण।

परिणामस्वरूप, हम नए टूल का उपयोग करते समय निम्न चित्र देखते हैं:

कस्टम साधन के लिए स्रोत कोड और साधन का उपयोग करने के लिए एक नमूना परियोजना
को GitHub पर देखा जा सकता
है ।
उपकरण डिबगिंग
डीबगर का उपयोग कस्टम टूल को डीबग करने के लिए किया जाता है।

वह अनुमति देता है
1. instrpkg में विवरण के आधार पर संकलित कोड देखें।
2. रनटाइम के टूल के बारे में विस्तृत जानकारी देखें।

3. सिस्टम डेटा योजनाओं की एक पूरी सूची और विवरण प्रदर्शित करें जिन्हें नए टूल में इनपुट के रूप में उपयोग किया जा सकता है।

4. कंसोल में मनमानी कमांड निष्पादित करें। उदाहरण के लिए, सूची-डिफ्यूल्स कमांड या तथ्यों के साथ नियमों की एक सूची प्रदर्शित करें

CI सर्वर पर सेटअप
आप कमांड लाइन से उपकरण चला सकते हैं - यूनिट के निष्पादन के दौरान एप्लिकेशन को प्रोफाइल करने के लिए- या सीआई-सर्वर पर यूआई-टेस्ट। यह, उदाहरण के लिए, स्मृति रिसाव को जल्द से जल्द पकड़ने की अनुमति देगा। पाइपलाइन में परीक्षणों को प्रोफाइल करने के लिए, निम्नलिखित आदेशों का उपयोग करें:
1. विशेषताओं के साथ उपकरण चलाना:
xcrun instruments -t <template_name> -l <average_duration_ms> -w <device_udid>
- जहाँ
template_name
उपकरण या टेम्पलेट के नाम के साथ टेम्पलेट का मार्ग है। आप कमांड xcrun instruments -s
प्राप्त कर सकते हैं xcrun instruments -s
; average_duration_ms
- मिलीसेकंड में रिकॉर्डिंग समय, परीक्षण चलाने के समय से अधिक या बराबर होना चाहिए;device_udid
- सिम्युलेटर पहचानकर्ता। आप कमांड xcrun इंस्ट्रूमेंट्स -s प्राप्त कर सकते हैं। सिम्युलेटर के पहचानकर्ता से मेल खाना चाहिए, जिस पर परीक्षण चलाए जाएंगे।
2. कमांड के साथ एक ही सिम्युलेटर पर परीक्षण चल रहा है:
xcodebuild -workspace <path_to_workspace>-scheme <scheme_with_tests> -destination <device> test-without-building
- जहाँ
path_to_workspace
Xcode कार्यस्थान का पथ है; scheme_with_tests
- परीक्षण के साथ योजना;device
- सिम्युलेटर पहचानकर्ता।
नतीजतन, विस्तार के साथ एक रिपोर्ट .trace वर्किंग डायरेक्टरी में बनाई जाएगी, जिसे इंस्ट्रूमेंट्स एप्लिकेशन द्वारा या फाइल पर राइट-क्लिक करके और शो पैकेज कंटेंट का चयन करके खोला जा सकता है।
निष्कर्ष
हमने साइन-अप को एक पूर्ण टूल में अपग्रेड करने के एक उदाहरण को देखा और बताया कि सीआई सर्वर के "रन" पर इसे स्वचालित रूप से कैसे लागू किया जाए और "ब्लिंकिंग" (अस्थिर) परीक्षणों की समस्या को हल करने में इसका उपयोग किया जाए।
जैसा कि आप कस्टम इंस्ट्रूमेंट की संभावनाओं में गोता लगाते हैं, आप बेहतर तरीके से समझ पाएंगे कि आप किन अन्य उपकरणों का उपयोग कर सकते हैं। उदाहरण के लिए, वे हमें मल्टीथ्रेडिंग की समस्याओं को समझने में भी मदद करते हैं - जहां और जब थ्रेड-सुरक्षित डेटा एक्सेस का उपयोग करना है।
एक नया टूल बनाना काफी सरल था। लेकिन मुख्य बात यह है कि आज इसे बनाने के लिए कई दिनों तक यांत्रिकी और प्रलेखन का अध्ययन करने के बाद, आप कीड़े को ठीक करने के प्रयासों में कई रातों की नींद से बचने में सक्षम होंगे।
सूत्रों का कहना है
लेख @regno , एंटोन Vlasov, एक iOS डेवलपर के साथ लिखा गया था।