Pytest یک framework تست در Python است که نوشتن تستهای کوچک و خوانا را ساده میکند و برای تستهای عملکردی پیچیده در اپلیکیشنها و کتابخانهها هم قابل گسترش است. در این آموزش، میبینیم چطور نتایج تولیدشده از یک test run خودکار Pytest را در TestRail با استفاده از TestRail CLI. به این ترتیب میتوانید نتایج تستهای خودکار را در یک جا متمرکز کنید و از قابلیتهای تحلیل و گزارشدهی TestRail استفاده کنید.
نمای کلی #
در این آموزش از یک project نمونه استفاده میکنیم تا قدمبهقدم نشان دهیم چطور یک project تست خودکار Pytest سازگار با TestRail CLI را راهاندازی کنید و نتایج تست تولیدشده را upload کنید.
بعد از مطالعه این آموزش، میتوانید:
- تستها را از یک project Pytest اجرا کنید
- TestRail CLI را نصب کنید
- محیط TestRail خود را پیکربندی کنید
- CLI را اجرا کنید
- test caseها و نتایج تست خود را در TestRail ببینید
پیشنیازها #
برای نصب و اجرای یک project ساده Pytest، برای شروع فقط به Python نیاز دارید. از آنجا که TestRail CLI که برای import کردن نتایج تست استفاده میشود هم با Python توسعه داده شده، با همین پیشنیاز میتوانید آن را هم نصب و اجرا کنید.
| پیشنیاز | توضیحات |
|---|---|
| Python 3.10.4 |
نسخه مناسب سیستمعامل خود را دانلود کنید و مراحل راهنمای نصب را دنبال کنید. برای اینکه مطمئن شوید نصب درست انجام شده، دستورهای |
نصب project نمونه #
ابتدا کد project نمونه را دریافت میکنیم و dependencyهای لازم را نصب میکنیم.
- project نمونه را clone یا دانلود کنید
- command prompt را در پوشه root پروژه باز کنید و دستور زیر را اجرا کنید.
$ pip install -r "requirements.txt"
| نیازمندی | توضیحات |
|---|---|
| pytest |
Pytest – framework تست عملکردی برای Python |
بررسی project نمونه #
project نمونه را با IDE دلخواه خود باز کنید و فایلهای تست را بررسی کنید. کد تستهای خودکار را ساده نگه داشتهایم تا تمرکز این آموزش روی نحوه import کردن نتایج اجرا بماند. این تستها فقط یک صفحه را با استفاده از Selenium در مرورگر باز میکنند و چند action و validation انجام میدهند، مانند نمونه زیر.
import pytest
def test_sum_two_numbers():
assert 1 + 1 == 2
def test_sum_two_decimals(record_property):
record_property("testrail_attachment", "sample_reports/testrail.jpg")
assert 0.8 + 0.3 == 1.2
@pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6)])
def test_sum_multiple_numbers(test_input, expected):
assert eval(test_input) == expected
پیوست کردن فایلها به گزارش #
TestRail CLI به شما امکان میدهد با استفاده از testrail_attachment property و مسیر فایلی که میخواهید upload کنید، فایلها را همراه نتایج تست به گزارش اضافه کنید. برای افزودن این property به گزارش JUnit، میتوانید از method مربوط به Pytest استفاده کنید؛ record_property کافی است کلید testrail_attachment و مسیر فایل را بهعنوان مقدار ارسال کنید، مشابه چیزی که در test_sum_two_decimals test موجود در code snippet بالا میبینید. توجه کنید برای اینکه بتوانید آن را فراخوانی کنید، باید record_property method را در آرگومانهای test تزریق کنید.
اجرای پروژه نمونه #
در همان command prompt، دستور زیر را اجرا کنید تا تستهای Pytest در project اجرا شوند و نتایج با فرمت JUnit XML ذخیره شوند.
$ pytest --junitxml "junit-report.xml" "./tests"
اگر دستور درست اجرا شده باشد، باید فایلی با نام junit-report.xml در پوشه reports ایجاد شده باشد؛ همانطور که در گزینههای command line مشخص کردهایم، این فایل نتایج تست را با فرمت JUnit XML دارد. در مرحله بعد، TestRail CLI این فایل را parse میکند تا test run را بسازد و نتایج تستهای شما را در TestRail آپلود کند.
<?xml version="1.0" encoding="utf-8"?>
<testsuites>
<testsuite name="pytest" errors="0" failures="1" skipped="0" tests="5" time="0.063"
timestamp="2022-07-22T11:51:34.060104" hostname="LAPTOP-09USROG2">
<testcase classname="tests.test_subtraction" name="test_subtract_two_numbers" file="tests\test_subtraction.py"
line="0" time="0.001"/>
<testcase classname="tests.test_sum" name="test_sum_two_numbers" file="tests\test_sum.py" line="3"
time="0.000"/>
<testcase classname="tests.test_sum" name="test_sum_two_decimals" file="tests\test_sum.py" line="7"
time="0.000">
<properties>
<property name="testrail_attachment" value="sample_reports/testrail.jpg"/>
</properties>
<failure message="assert (0.8 + 0.3) == 1.2">def test_sum_two_decimals():
> assert 0.8 + 0.3 == 1.2
E assert (0.8 + 0.3) == 1.2
tests\test_sum.py:9: AssertionError
</failure>
</testcase>
<testcase classname="tests.test_sum" name="test_sum_multiple_numbers[3+5-8]" file="tests\test_sum.py" line="11"
time="0.001"/>
<testcase classname="tests.test_sum" name="test_sum_multiple_numbers[2+4-6]" file="tests\test_sum.py" line="11"
time="0.000"/>
</testsuite>
</testsuites>
وارد کردن نتایج به TestRail #
بعد از اجرای تستها و ایجاد فایل junit-report.xml میتوانید با استفاده از TestRail CLI، نتایج تستهای خود و حتی test caseها را بهراحتی به TestRail وارد کنید. با این کار test runهای خودکار شما در TestRail قابل مشاهده میشوند و میتوانید تصویر کلیتری از وضعیت تست کردن اپلیکیشن خود داشته باشید.
نصب TestRail CLI #
اگر Python از قبل روی سیستم شما نصب باشد، نصب TestRail CLI بهسادگی با اجرای دستور زیر در command line انجام میشود.
$ pip install trcli
پیکربندی TestRail #
در مرحله بعد، باید instance TestRail خود را طبق دستورهای زیر پیکربندی کنید.
- فعال کنید TestRail API با رفتن به Admin > Site Settings ، روی تب API کلیک کنید و گزینه Enable API را انتخاب کنید.
- ایجاد کنید Custom Field تا کد test caseهای خودکار شما به caseهای واقعی در TestRail map شود. برای این کار به Admin > Customizations بروید و روی Add Field کلیک کنید. بعد از رسیدن به صفحه ایجاد فیلد، این custom field باید دو شرط زیر را داشته باشد:
- مقدار System Name باید این باشد: automation_id
- مقدار Type باید این باشد: Text
ارسال نتایج به TestRail #
پس از نصب TestRail CLI و تکمیل تنظیمات instance در TestRail، میتوانید نتایج تستها را بهسادگی با یک دستور یکخطی مانند نمونه زیر آپلود کنید.
$ trcli -y \
> -h https://INSERT-INSTANCE-NAME.testrail.io \
> --project "My Project" \
> --username INSERT-EMAIL \
> --password INSERT-PASSWORD \
> parse_junit \
> --title "Pytest Automated Test Run" \
> -f junit-report.xml
توجه داشته باشید که نام فایل بعد از -f option باید با مسیر فایل گزارش شما یکی باشد، مخصوصا اگر محل پیشفرض آن را تغییر داده باشید. سایر optionها هم باید مطابق instance و project شما در TestRail تنظیم شوند. برای دیدن optionهای دیگر command line، میتوانید فایل README.md در repository پروژه، مقاله مستندات TRCLI، یا راهنمای داخلی CLI را با دستورهای زیر بررسی کنید.
$ trcli --help
$ trcli parse_junit --help
مشاهده نتایج در TestRail #
حالا اگر در project خود در TestRail به صفحه Test Cases بروید، میبینید که TestRail CLI بهصورت خودکار test caseهایی را که در گزارش نتایج تست شما بودهاند ایجاد کرده است. همچنین میبینید که با ترکیب classname و name attributeهای هر test در گزارش JUnit، یک Automation ID یکتا اضافه شده است. از این Automation ID برای map کردن testهای موجود در codebase اتوماسیون شما به test caseهای TestRail استفاده میشود. یعنی هر بار که TestRail CLI را اجرا میکنید، ابتدا تلاش میکند یک test case موجود در TestRail را پیدا و match کند و فقط زمانی test case جدید میسازد که هیچ test caseای با آن Automation ID وجود نداشته باشد.
#
اگر نام testها، نام فایل، یا محل فایل را تغییر دهید، Automation ID آن testها هم تغییر میکند و دیگر به test caseهای موجود در TestRail map نمیشوند.

در صفحه Test Runs & Results میبینیم که یک test run با نام Pytest Automated Test Run ایجاد شده است. با باز کردن آن، میتوانیم جزئیات هر نتیجه تست خودکار را دقیقتر بررسی کنیم و در سطح کلی بفهمیم چرا یک test شکست خورده است؛ چون پیام خطایی که framework اتوماسیون تست ارائه کرده نیز در test result ثبت میشود، همانطور که در تصویر زیر میبینید.

بعد از این چه کار کنیم؟ #
حالا که نتایج تستهای خود را در TestRail متمرکز کردهاید، علاوه بر مشاهده نتایج test runهای خودکار و پیام خطای testهای ناموفق، میتوانید فعالیتهای تست دستی و خودکار را در گزارشهایی تجمیع کنید که پوشش کامل تستهای مربوط به app شما را نشان میدهند و حتی روند پیشرفت test automation را دنبال میکنند. همچنین میتوانید مثل نتایج تست دستی، bug را مستقیما از نتیجه تست خودکار به issue tracker دلخواه خود گزارش کنید.
برای آشنایی بیشتر با ویدئوی TestRail’s Reports and Test Metrics و اینکه چطور میتوانید از قابلیتهای گزارشدهی TestRail استفاده کنید، آن را ببینید.

