آزمایش واحد و اعتبارسنجی

Skip to content

این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!

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

چگونه می‌توانیم مطمئن باشیم که کد همانطور که باید کار می‌کند، اگر آن را تست نکنیم؟

واحد تستینگ چیست؟

واحد تستینگ یک روش برای تست خودکار و سیستماتیک بخش‌های کوچک کد ما است. در پایتون، ما از یک ماژول به نام pytest برای نوشتن و اجرای تست‌ها استفاده می‌کنیم. یک “واحد” کوچکترین بخش قابل تست یک برنامه، اغلب یک تابع یا متد واحد است. هنگام استفاده از pytest، مهم است که قراردادهای نام‌گذاری صحیح را دنبال کنیم تا pytest بتواند تست‌های ما را پیدا کند، مانند نام‌گذاری فایل‌های تست با test_ در ابتدا، و توابع تست با test_ در ابتدا.

مثال یک واحد تست:

def test_add():
    # Tester om addisjon fungerer som forventet.
    # تست می‌کند که جمع به درستی کار می‌کند.
    assert 0.3 + 0.3 + 0.3 == 0.9

اجرا با تایپ کردن pytest در ترمینال.

Fun fact

کد بالا با شکست مواجه خواهد شد، زیرا ۰.۳ + ۰.۳ + ۰.۳ در پایتون به ۰.۸۹۹۹۹۹۹۹۹۹ تبدیل می‌شود!

Easy وظیفه 1 - نصب pytest

pytest را در محیط مجازی خود نصب کنید. این کار را با اجرای دستور زیر در ترمینال انجام دهید:

pip install pytest
# Installer pytest - تست کردن pytest

Easy وظیفه 2 - ایجاد یک تست

یک فایل جدید در پوشه پروژه خود با نام test_data.py ایجاد کنید. در این فایل، باید یک تست برای کلاس Person که در ماژول قبلی ایجاد کردید، ایجاد کنید. این تست باید بررسی کند که آیا یک Person می‌تواند با مقادیر معتبر ایجاد شود یا خیر.

مثالی از نحوه ظاهر شدن تست:

from main import Person

def test_person_working():
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    # اطمینان حاصل کنید که نام درست است
    assert bob_kaare.name == "Bob Kåre"
    # اطمینان حاصل کنید که رنگ چشم درست است
    assert bob_kaare.eye_color == EyeColor.BLUE

این نوع تستینگ، “تست مسیر خوش” نامیده می‌شود، زیرا ما تست می‌کنیم که همه چیز همانطور که باید کار می‌کند وقتی مقادیر معتبر ارائه می‌دهیم، و خیلی مفید نیست.

Medium وظیفه 3 - تست اعتبارسنجی

تست‌های بیشتری در test_person.py ایجاد کنید که بررسی کنند اعتبارسنجی در Email و PhoneNumber همانطور که باید کار می‌کند. هم مقادیر معتبر و هم نامعتبر را تست کنید. در اینجا باید از تابعی در pytest به نام raises استفاده کنید که بررسی می‌کند آیا خطای خاصی پرتاب می‌شود یا خیر.

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # این یک KeyError را ایجاد می‌کند

Tip

شما می‌توانید به هر تعداد که بخواهید تابع ایجاد کنید، مادامی که نام تابع با test_ شروع شود.

Løsning: Eksempel på en test for ugyldig e-post
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

چرا این کار را انجام دهیم؟

با داشتن تست‌های خوب برای کد خود، می‌توانیم مطمئن باشیم که کد همانطور که باید کار می‌کند و می‌توانیم به راحتی بفهمیم که اگر تغییری در کد ایجاد کنیم، چه چیزی اشتباه رفته است. این به ویژه در پروژه‌های بزرگتر که بسیاری از توسعه‌دهندگان با هم کار می‌کنند و اشتباه کردن آسان است، مهم است.

با استفاده از نرم‌افزارهایی مانند Jest یا Selenium، می‌توان وب‌سایت‌ها را به طور خودکار تست کرد و بدین ترتیب اطمینان حاصل کرد که همه چیز پس از هر تغییری در کد همانطور که باید کار می‌کند. ما می‌خواهیم بدانیم که “ثبت‌نام کاربر”، “پرداخت” و “ورود به سیستم” همانطور که باید کار می‌کنند، درست است؟

Tenk over følgende scenarioer

چه اتفاقی می‌افتد (یا باید بیفتد) اگر..:

  • یک کاربر سعی کند با ایمیلی که قبلاً استفاده شده است ثبت نام کند؟
  • یک کاربر تاریخ تولد در آینده داشته باشد؟
  • یک کاربر نام “jOHN dOE” را وارد کند؟

A software tester walks into a bar...

Hard وظیفه 4 - تست خودکار (CI)

وقتی کد را در GitHub منتشر می‌کنیم، می‌توانیم چیزی به نام GitHub Actions را تنظیم کنیم که تست‌های ما را به طور خودکار هر بار که تغییری در کد ایجاد می‌کنیم، اجرا کند. به این Continuous Integration (CI) گفته می‌شود و به ما کمک می‌کند تا اطمینان حاصل کنیم که کد ما همیشه همانطور که باید کار می‌کند.

فایلی در پوشه پروژه خود ایجاد کنید که نام آن .github/workflows/pytest.yml باشد. در این فایل، کد زیر را اضافه کنید:

name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Install dependencies
      run: |

        python -m pip install --upgrade pip
        pip install pytest
        # نصب هر گونه وابستگی دیگری که پروژه شما نیاز دارد
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

اگر آن را به درستی تنظیم کرده‌اید، اکنون باید یک تب جدید در مخزن GitHub خود به نام “Actions” ببینید. در اینجا می‌توانید ببینید که تست‌های شما هر بار که تغییری در کد ایجاد می‌کنید به طور خودکار اجرا می‌شوند و در صورت شکست هر یک از تست‌ها (علامت ضربدر قرمز و از طریق ایمیل) به شما اطلاع داده می‌شود.

Merknad om filstruktur

ساختار فایل شما تعیین می‌کند که آیا GitHub Actions کار می‌کند یا نه. اطمینان حاصل کنید که پوشه .github در پوشه اصلی پروژه شما قرار دارد و یک پوشه tests نیز وجود دارد که فایل‌های آزمایشی شما در آن قرار دارند.

شما می‌توانید در صورت نیاز فایل pytest.yml را تغییر دهید تا به پوشه صحیح اشاره کند.

فایل‌های اکشن مشابه می‌توانند برای تست کد شما در نسخه‌های مختلف پایتون یا سیستم‌عامل‌ها نیز استفاده شوند، آن‌ها همچنین می‌توانند برای ساخت و انتشار خودکار نرم‌افزار شما استفاده شوند، به عنوان مثال، انتشار یک وب‌سایت، یا به‌روزرسانی یک اپلیکیشن در App Store یا Google Play.

Code Coverage

همچنین چیزی به نام “Code Coverage” وجود دارد که می‌تواند به شما کمک کند تا ببینید چه مقدار از کد شما واقعاً تست می‌شود. این می‌تواند برای فهمیدن اینکه آیا تست‌های کافی دارید یا خیر، یا اینکه آیا بخش‌هایی از کد شما اصلاً تست نمی‌شوند، مفید باشد.

برخی از محل‌های کار نیاز دارند که قبل از استقرار کد، درصد مشخصی از کد شما توسط تست‌ها پوشش داده شود، تا اطمینان حاصل شود که کد قوی و مطابق انتظار عمل می‌کند.

Unit Test Meme