پوشش کد با بازل

Bazel دارای یک فرمان فرعی coverage برای تولید گزارش های پوشش کد در مخازن است که می تواند با bazel coverage آزمایش شود. به دلیل ویژگی‌های خاص اکوسیستم‌های زبانی مختلف، ساختن این کار برای یک پروژه خاص همیشه بی‌اهمیت نیست.

این صفحه روند کلی ایجاد و مشاهده گزارش‌های پوشش را مستند می‌کند، و همچنین دارای برخی یادداشت‌های خاص زبان برای زبان‌هایی است که پیکربندی آن‌ها به خوبی شناخته شده است. بهتر است ابتدا بخش عمومی را بخوانید و سپس در مورد الزامات یک زبان خاص بخوانید. همچنین به بخش اجرای از راه دور توجه کنید که به برخی ملاحظات اضافی نیاز دارد.

در حالی که سفارشی‌سازی زیادی امکان‌پذیر است، این سند بر تولید و مصرف گزارش‌های lcov تمرکز دارد که در حال حاضر به خوبی پشتیبانی می‌شود.

ایجاد گزارش پوشش

آماده سازی

گردش کار اصلی برای ایجاد گزارش پوشش به موارد زیر نیاز دارد:

  • یک مخزن اولیه با اهداف آزمایشی
  • یک زنجیره ابزار با ابزارهای پوشش کد مخصوص زبان نصب شده است
  • یک پیکربندی صحیح "ابزار"

دو مورد اول مختص زبان و عمدتاً ساده هستند، اما دومی برای پروژه های پیچیده می تواند دشوارتر باشد.

"ابزار" در این مورد به ابزارهای پوششی اطلاق می شود که برای یک هدف خاص استفاده می شود. Bazel اجازه می دهد تا این مورد را برای زیرمجموعه خاصی از فایل ها با استفاده از پرچم --instrumentation_filter روشن کنید، که فیلتری را برای اهدافی که با ابزار دقیق تست می شوند مشخص می کند. برای فعال کردن ابزار دقیق برای تست‌ها، پرچم --instrument_test_targets مورد نیاز است.

به طور پیش فرض، 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 در ریشه پروژه bazel اجرا شود.

برای مشاهده نتیجه، کافی است فایل index.html تولید شده در دایرکتوری genhtml را در هر مرورگر وب باز کنید.

برای راهنمایی و اطلاعات بیشتر در مورد ابزار genhtml یا قالب پوشش lcov ، به پروژه lcov مراجعه کنید.

اجرای از راه دور

اجرای آزمایش از راه دور در حال حاضر دارای چند نکته است:

  • عملکرد ترکیبی گزارش هنوز نمی تواند از راه دور اجرا شود. این به این دلیل است که Bazel فایل های خروجی پوشش را به عنوان بخشی از نمودار خود در نظر نمی گیرد (به این شماره مراجعه کنید)، و بنابراین نمی تواند به درستی آنها را به عنوان ورودی عملکرد ترکیبی در نظر بگیرد. برای حل این مشکل، از --strategy=CoverageReport=local استفاده کنید.
    • توجه: ممکن است لازم باشد چیزی مانند --strategy=CoverageReport=local,remote را مشخص کنید، اگر Bazel برای امتحان local,remote تنظیم شده باشد، به دلیل اینکه Bazel چگونه استراتژی ها را حل می کند.
  • --remote_download_minimal و پرچم های مشابه را نیز نمی توان به عنوان پیامد اولی مورد استفاده قرار داد.
  • Bazel در حال حاضر در ایجاد اطلاعات پوشش شکست خواهد خورد، اگر آزمایش‌ها قبلاً ذخیره شده باشند. برای حل این مشکل، می‌توان --nocache_test_results را به‌طور خاص برای اجراهای پوششی تنظیم کرد، اگرچه این البته هزینه‌های سنگینی را از نظر زمان تست متحمل می‌شود.
  • --experimental_split_coverage_postprocessing و --experimental_fetch_all_coverage_outputs
    • معمولا پوشش به عنوان بخشی از عمل آزمایشی اجرا می‌شود، و بنابراین به‌طور پیش‌فرض، ما به‌طور پیش‌فرض همه پوشش‌ها را به عنوان خروجی‌های اجرای از راه دور بر نمی‌گردانیم. این پرچم ها پیش فرض را لغو می کنند و داده های پوشش را به دست می آورند. برای جزئیات بیشتر به این شماره مراجعه کنید.

پیکربندی خاص زبان

جاوا

جاوا باید خارج از جعبه با پیکربندی پیش فرض کار کند. زنجیره‌های ابزار بازل شامل همه چیزهایی هستند که برای اجرای از راه دور لازم است، از جمله JUnit.

پایتون

پیش نیازها

اجرای پوشش با پایتون چند پیش نیاز دارد:

مصرف coverage.py اصلاح شده

راهی برای انجام این کار از طریق rules_python است، این امکان را فراهم می کند تا از یک فایل require.txt استفاده کنید، requirements.txt فهرست شده در فایل سپس به عنوان اهداف bazel با استفاده از قانون مخزن pip_install ایجاد می شوند.

requirements.txt .txt باید ورودی زیر را داشته باشد:

git+https://github.com/ulfjack/coveragepy.git@lcov-support

سپس rules_python ، pip_install ، و فایل requirements.txt باید در فایل WORKSPACE به صورت زیر استفاده شود:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_python",
    url = "https://github.com/bazelbuild/rules_python/releases/download/0.5.0/rules_python-0.5.0.tar.gz",
    sha256 = "cd6730ed53a002c56ce4e2f396ba3b3be262fd7cb68339f0377a45e8227fe332",
)

load("@rules_python//python:pip.bzl", "pip_install")

pip_install(
   name = "python_deps",
   requirements = "//:requirements.txt",
)

پس از آن می‌توان با تنظیم موارد زیر در فایل‌های BUILD ، نیازمندی coverage.py را توسط اهداف آزمایشی مصرف کرد:

load("@python_deps//:requirements.bzl", "entry_point")

alias(
    name = "python_coverage_tools",
    actual = entry_point("coverage"),
)

py_test(
    name = "test",
    srcs = ["test.py"],
    env = {
        "PYTHON_COVERAGE": "$(location :python_coverage_tools)",
    },
    deps = [
        ":main",
        ":python_coverage_tools",
    ],
)