बेज़ेल के साथ कोड कवरेज

किसी समस्या की शिकायत करें स्रोत देखें

Bazel में रिपॉज़िटरी के बारे में कोड कवरेज रिपोर्ट बनाने के लिए, coverage सब-कमांड की सुविधा है. इसे bazel coverage के साथ टेस्ट किया जा सकता है. अलग-अलग भाषा नेटवर्क के अलग-अलग सिद्धांतों की वजह से, किसी प्रोजेक्ट पर काम करना आसान नहीं होता.

इस पेज पर कवरेज रिपोर्ट को बनाने और देखने के लिए, सामान्य प्रोसेस के बारे में बताया गया है. साथ ही, इस पेज पर उन भाषाओं के लिए भाषा के हिसाब से खास नोट भी दिए गए हैं जिनका कॉन्फ़िगरेशन मशहूर है. सबसे पहले इसे सामान्य सेक्शन में पढ़ें. इसके बाद, किसी खास भाषा से जुड़ी ज़रूरी शर्तों को पढ़ें. रिमोट एक्ज़ीक्यूशन सेक्शन भी देखें, जिसके लिए कुछ और बातों की ज़रूरत होती है.

हालांकि, इसमें कई कस्टमाइज़ेशन किए जा सकते हैं, लेकिन इस दस्तावेज़ में lcov रिपोर्ट बनाने और उनका इस्तेमाल करने पर फ़ोकस किया गया है. फ़िलहाल, इस रिपोर्ट में सबसे अच्छी तरह से रिपोर्ट किया जा सकता है.

कवरेज रिपोर्ट बनाना

तैयारी

कवरेज रिपोर्ट बनाने के बुनियादी वर्कफ़्लो के लिए ये बातें ज़रूरी हैं:

  • टेस्ट टारगेट वाला बेसिक रिपॉज़िटरी (डेटा स्टोर करने की जगह)
  • भाषा-विशिष्ट कोड कवरेज टूल के साथ एक टूलचेन
  • सही "इंस्ट्रक्शन" कॉन्फ़िगरेशन

पहले के दो वर्शन, भाषा के हिसाब से हैं और ज़्यादातर सीधे तौर पर हैं. हालांकि, मुश्किल वाले प्रोजेक्ट के लिए मुश्किल हो सकती है.

इस मामले में "इंस्ट्रक्शन" का मतलब उन कवरेज टूल से है जिनका इस्तेमाल किसी खास टारगेट के लिए किया जाता है. Bazel, फ़ाइलों के किसी खास सबसेट के लिए, इसे चालू करने की अनुमति देता है. इसके लिए, --instrumentation_filter फ़्लैग का इस्तेमाल किया जाता है. इसमें, उन टारगेट के लिए फ़िल्टर लगाया जाता है जिनका इस्तेमाल, इंस्ट्रुमेंटेशन के साथ किया जाता है. टेस्ट की सुविधा चालू करने के लिए, --instrument_test_targets फ़्लैग ज़रूरी है.

डिफ़ॉल्ट रूप से, बेज़ल टारगेट पैकेज से मेल खाने की कोशिश करता है और काम के फ़िल्टर को INFO मैसेज के तौर पर प्रिंट करता है.

चल रही कवरेज

कवरेज रिपोर्ट बनाने के लिए, bazel coverage --combined_report=lcov [target] का इस्तेमाल करें. यह टारगेट के लिए टेस्ट करता है, जिससे हर फ़ाइल के लिए एलसीओवी फ़ॉर्मैट में कवरेज रिपोर्ट जनरेट होती हैं.

प्रोसेस पूरी होने के बाद, बेज़ल एक कार्रवाई करता है. इस कार्रवाई में, बनाई गई कवरेज फ़ाइलों को इकट्ठा करके एक किया जाता है. इसके बाद, यह फ़ाइल $(bazel info output_path)/_coverage/_coverage_report.dat में बनाई जाती है.

टेस्ट न होने पर भी कवरेज रिपोर्ट बनाई जाती हैं. हालांकि, ध्यान रखें कि इसमें फ़ेल हो चुके टेस्ट शामिल नहीं हैं - सिर्फ़ पास होने वाले टेस्ट की रिपोर्ट दी जाती है.

कवरेज देखना

कवरेज रिपोर्ट सिर्फ़ ऐसे फ़ॉर्मैट में उपलब्ध होती है जिसे इंसान पढ़ नहीं सकते lcov फ़ॉर्मैट कर सकते हैं. इससे, हम genhtml उपयोगिता (lcov प्रोजेक्ट का हिस्सा) का इस्तेमाल करके ऐसी रिपोर्ट बना सकते हैं जिसे वेब ब्राउज़र पर देखा जा सके:

genhtml --branch-coverage --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"

ध्यान दें कि genhtml, सोर्स कोड भी पढ़ता है. इससे, इन फ़ाइलों के कवरेज के बारे में जानकारी मिलती है. इस तरीके के काम करने के लिए, यह उम्मीद की जाती है कि genhtml बेज़ल प्रोजेक्ट के रूट में लागू होगा.

नतीजा देखने के लिए, किसी भी वेब ब्राउज़र में genhtml डायरेक्ट्री में बनी index.html फ़ाइल खोलें.

genhtml टूल या lcov कवरेज फ़ॉर्मैट से जुड़ी ज़्यादा मदद और जानकारी पाने के लिए, lcov प्रोजेक्ट देखें.

रिमोट तरीके से पासवर्ड बदलें

फ़िलहाल, रिमोट टेस्टिंग से एक्ज़ीक्यूशन करने के दौरान आपको कुछ चेतावनियां मिल सकती हैं:

  • रिपोर्ट के कॉम्बिनेशन ऐक्शन अभी रिमोट तरीके से नहीं चलाए जा सकते. ऐसा है, क्योंकि बेज़ल कवरेज आउटपुट फ़ाइलों को अपने ग्राफ़ के हिस्से के तौर पर नहीं देखता है (यह समस्या देखें) और इसलिए वे इस कार्रवाई को सही तरीके से इनपुट के तौर पर इस्तेमाल नहीं कर सकते. इस पर काम करने के लिए, --strategy=CoverageReport=local का इस्तेमाल करें.
    • ध्यान दें: अगर बैजल, रणनीतियों को कैसे हल करते हैं, तो बज़ेल को local,remote आज़माने के लिए --strategy=CoverageReport=local,remote जैसा कुछ बताना पड़ सकता है.
  • --remote_download_minimal और इसी तरह के फ़्लैग भी इस्तेमाल नहीं किए जा सकते.
  • अगर टेस्ट को पहले ही कैश मेमोरी में सेव किया जा चुका है, तो फ़िलहाल कवरेज कवरेज की जानकारी तैयार नहीं कर पाएगा. इस पर काम करने के लिए, --nocache_test_results को खास तौर पर कवरेज रन के लिए सेट किया जा सकता है, हालांकि, टेस्टिंग के समय के हिसाब से यह शुल्क बहुत ज़्यादा होता है.
  • --experimental_split_coverage_postprocessing और --experimental_fetch_all_coverage_outputs
    • आम तौर पर, कवरेज को टेस्ट कार्रवाई के हिस्से के तौर पर चलाया जाता है. इसलिए, डिफ़ॉल्ट रूप से, हमें डिफ़ॉल्ट रूप से रिमोट कवरेज के आउटपुट के तौर पर सभी कवरेज वापस नहीं मिलते हैं. ये फ़्लैग डिफ़ॉल्ट सेटिंग को बदल देते हैं और कवरेज का डेटा हासिल कर लेते हैं. ज़्यादा जानकारी के लिए यह समस्या देखें.

भाषा के हिसाब से कॉन्फ़िगरेशन

Java

Java, डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ आउट-ऑफ़-द-बॉक्स काम करेगा. बेज़ल टूल चेन में, रिमोट एक्ज़ीक्यूशन के लिए ज़रूरी सभी सुविधाएं मिलती हैं. साथ ही, JUnit भी शामिल है.

Python

Python में कवरेज की सुविधा चालू करने के लिए, ज़रूरी rules_python कवरेज दस्तावेज़ देखें.