Bazel में coverage
सब-कमांड होता है, जिसकी मदद से उन रिपॉज़िटरी के लिए कोड कवरेज की रिपोर्ट जनरेट की जा सकती हैं जिनकी जांच bazel coverage
से की जा सकती है. अलग-अलग भाषा के नेटवर्क की खास बातें होती हैं. इसलिए, किसी प्रोजेक्ट के लिए यह काम करना हमेशा आसान नहीं होता.
इस पेज पर कवरेज रिपोर्ट बनाने और देखने की सामान्य प्रक्रिया बताई गई है. साथ ही, इसमें उन भाषाओं के लिए कुछ खास भाषा के नोट भी हैं जिनका कॉन्फ़िगरेशन काफ़ी मशहूर है. इसे सबसे पहले सामान्य सेक्शन और फिर किसी खास भाषा की ज़रूरी शर्तों के बारे में पढ़कर पढ़ा जा सकता है. रिमोट तौर पर लागू करने वाले सेक्शन पर भी ध्यान दें. इसके लिए, कुछ और बातों का ध्यान रखना ज़रूरी है.
इस दस्तावेज़ में, lcov
रिपोर्ट बनाने और उनका इस्तेमाल करने पर फ़ोकस किया गया है. फ़िलहाल, यह सबसे सही तरीका है. हालांकि, इसमें ज़रूरत के हिसाब से कई बदलाव किए जा सकते हैं.
कवरेज रिपोर्ट बनाना
वीडियो की रणनीति
कवरेज रिपोर्ट बनाने के लिए बुनियादी वर्कफ़्लो के लिए ये ज़रूरी हैं:
- टेस्ट टारगेट वाला बुनियादी रिपॉज़िटरी
- भाषा के हिसाब से कोड कवरेज टूल इंस्टॉल करने वाला टूलचेन
- सही "इंस्ट्रूमेंटेशन" कॉन्फ़िगरेशन
पहले वाले दो तरीके, खास तौर पर भाषा के हिसाब से हैं और ज़्यादातर आसान हैं. हालांकि, बाद वाले प्रोजेक्ट जटिल प्रोजेक्ट के लिए ज़्यादा मुश्किल हो सकते हैं.
इस मामले में, "इंस्ट्रूमेंटेशन" का मतलब उन कवरेज टूल से है जिनका इस्तेमाल किसी खास टारगेट के लिए किया जाता है. Bazel, --instrumentation_filter
फ़्लैग का इस्तेमाल करके, फ़ाइलों के किसी खास सबसेट के लिए इसे चालू करने की अनुमति देता है. यह फ़्लैग, उन टारगेट के लिए फ़िल्टर तय करता है जिनकी जांच, इंस्ट्रूमेंटेशन चालू होने पर की जाती है. टेस्ट के लिए इंस्ट्रूमेंटेशन चालू करने के लिए, --instrument_test_targets
फ़्लैग ज़रूरी है.
डिफ़ॉल्ट रूप से, basel टारगेट पैकेज को मैच करने की कोशिश करता है और ज़रूरत के हिसाब से बने फ़िल्टर को INFO
मैसेज के तौर पर प्रिंट करता है.
रनिंग कवरेज
कवरेज रिपोर्ट बनाने के लिए, bazel coverage
--combined_report=lcov
[target]
का इस्तेमाल करें. यह टारगेट के लिए जांच करता है और हर फ़ाइल के लिए lcov फ़ॉर्मैट में कवरेज रिपोर्ट जनरेट करता है.
प्रोसेस पूरी होने के बाद, bazel एक कार्रवाई करता है. यह कार्रवाई, जनरेट की गई सभी कवरेज फ़ाइलों को इकट्ठा करके, उन्हें एक में मर्ज करता है. आखिर में, इसे $(bazel info
output_path)/_coverage/_coverage_report.dat
में बनाया जाता है.
टेस्ट पास न होने पर भी कवरेज रिपोर्ट जनरेट होती हैं. हालांकि, ध्यान दें कि यह उन टेस्ट पर लागू नहीं होता जो पास नहीं हुए हैं. सिर्फ़ पास हुए टेस्ट की ही रिपोर्ट जनरेट होती है.
कवरेज देखना
कवरेज रिपोर्ट सिर्फ़ ऐसे lcov
फ़ॉर्मैट में होती है जिसे इंसान पढ़ सकते हैं. इससे, हम genhtml
यूटिलिटी (lcov प्रोजेक्ट का हिस्सा) का इस्तेमाल करके, ऐसी रिपोर्ट तैयार कर सकते हैं जिसे वेब ब्राउज़र में देखा जा सकता है:
genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
ध्यान दें कि genhtml
, सोर्स कोड को भी पढ़ता है, ताकि इन फ़ाइलों में मौजूद कोड को एनोटेट किया जा सके. यह काम करे, इसके लिए उम्मीद है कि
genhtml
को बेज़ल प्रोजेक्ट के रूट में चलाया जा रहा है.
नतीजा देखने के लिए, किसी भी वेब ब्राउज़र में genhtml
डायरेक्ट्री में बनाई गई index.html
फ़ाइल खोलें.
genhtml
टूल या lcov
कवरेज फ़ॉर्मैट के बारे में ज़्यादा मदद पाने और ज़्यादा जानकारी पाने के लिए, lcov प्रोजेक्ट देखें.
रिमोट तरीके से एक्ज़ीक्यूट करें
फ़िलहाल, रिमोट टेस्ट एक्सीक्यूशन की सुविधा का इस्तेमाल करने में कुछ सावधानियां बरतनी पड़ती हैं:
- रिपोर्ट के कॉम्बिनेशन की कार्रवाई, अभी तक रिमोट तौर पर नहीं चलाई जा सकती. ऐसा इसलिए होता है, क्योंकि Basel, कवरेज आउटपुट फ़ाइलों को अपने ग्राफ़ (यह समस्या देखें) का हिस्सा नहीं मानता. इसलिए, वे कॉम्बिनेशन ऐक्शन के लिए उन्हें इनपुट के तौर पर सही तरीके से इस्तेमाल नहीं कर सकते. इस समस्या को हल करने के लिए,
--strategy=CoverageReport=local
का इस्तेमाल करें.- ध्यान दें: अगर Bazel को
local,remote
आज़माने के लिए सेट अप किया गया है, तो हो सकता है कि इसके बजाय--strategy=CoverageReport=local,remote
जैसा कुछ बताना ज़रूरी हो. ऐसा इसलिए, क्योंकि Bazel रणनीतियों को हल करने का तरीका अपनाता है.
- ध्यान दें: अगर Bazel को
--remote_download_minimal
और मिलते-जुलते फ़्लैग का इस्तेमाल भी नहीं किया जा सकता.- अगर टेस्ट को पहले से कैश मेमोरी में सेव किया गया है, तो फ़िलहाल Bazel, कवरेज की जानकारी नहीं बना पाएगा. इससे बचने के लिए,
--nocache_test_results
को खास तौर पर, कवरेज चलाने के लिए सेट किया जा सकता है. हालांकि, जांच में लगने वाले समय के हिसाब से, इस सुविधा के लिए आपको भारी शुल्क देना पड़ता है. --experimental_split_coverage_postprocessing
और--experimental_fetch_all_coverage_outputs
- आम तौर पर, कवरेज को टेस्ट ऐक्शन के हिस्से के तौर पर चलाया जाता है. इसलिए, डिफ़ॉल्ट रूप से, हमें रिमोट रन के आउटपुट के तौर पर सारा कवरेज वापस नहीं मिलता. ये फ़्लैग, डिफ़ॉल्ट सेटिंग को बदल देते हैं और कवरेज का डेटा हासिल करते हैं. ज़्यादा जानकारी के लिए, यह समस्या देखें.
भाषा के हिसाब से कॉन्फ़िगरेशन
Java
Java को डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ सबसे बेहतर काम करना चाहिए. bazel टूलचेन में, रिमोट तौर पर प्रोग्राम चलाने के लिए ज़रूरी सभी चीज़ें मौजूद होती हैं. इनमें JUnit भी शामिल है.
Python
Python में कवरेज की सुविधा चालू करने के लिए, rules_python
कवरेज के दस्तावेज़ देखें.