آشنایی با Test Coverage در گولنگ و نحوه تست آن

توسط mrbardia72
زمان خواندن ~1 دقیقه
آشنایی با Test Coverage در گولنگ و نحوه تست آن

واسه شروع  این مقاله  تعاریف زیر رو اول بخونید

🎯 مفهوم Branch Coverage و Path Coverage در تست نرم‌افزار 

🔹مفهومBranch Coverage: آیا هر شاخه (branch) موجود در هر ساختار کنترلی (control structure)، مانند if، در مجموعه آزمون مورد نظر، اجرا شده است یا خیر؟ یعنی اگر عبارت if ای داشته باشیم، باید با اجرای مجموعه آزمون مورد نظر، هر یک از حالتهای (شاخه) true و false آن، حداقل یک بار، اجرا شوند.

🔹مفهوم Path Coverage: آیا تمام مسیرهای ممکن در برنامه اجرا شده است یا خیر؟ تمام مسیرهای ممکن در برنامه: تمام شاخه های موجود در تمام ساختارهای کنترلی، فراخوانی ها (call) و بازگشت های (return) توابع و ... . بدیهتا Path Coverage ِ کامل برای یک ماژول نسبتا بزرگ، غیرعملی است (مثلا در صورت داشتن حلقه، تعداد مسیرها ممکن است بی نهایت شود؛ و با افزایش تعداد دستورات کنترلی موجود، تعداد مسیرهای ممکن با مرتبه نمایی رشد میکند). (راه حل: استفاده از Prime Path Coverage)

🔹بنابراین در Branch Coverage فقط به دستورهای کنترلی کار داریم ولی در Path Coverage به تمام مسیرهای ممکن (Branch Coverage زیرمجموعه ای از Path Coverage است؛ یعنی مجموعه آزمونی که Path Coverage کنند، حتما Branch Coverage نیز خواهند کرد).

🎯 تفاوت Code Coverage vs Test Coverage  

🔹گفتن تفاوت این دو مفهوم خیلی سخته ولی میشه گفت Code coverage مقیاسی است که مشخص می کند چه مقدار از خطوط کد توسط test case ها پوشش داده شده و مورد تست قرار گرفته است و Test coverage مقیاسی است که مشخص می کند چه تعداد test case وجود دارد و آیا این test case ها تمام functionality سیستم را مورد تست قرار می دهند به عبارت دیگر چند درصد از functionality سیستم توسط test case ها مورد تست قرار گرفته است.

🎯 آشنایی با تفاوت های Code Coverage و  Test Coverage

در ادامه به چهار مورد از مهم ترین تفاوت های Code Coverage و Test Coverage پرداخته ایم.

🔹درواقع Code Coverage میزان اجرای کد برنامه هنگام اجرای برنامه را توضیح می دهد اما Test coverage موارد آزمون را که در هر مدرک نوشته و ذکر شده است ، توصیف می کند.

🔹درواقعCode coverage بخشی از آزمایش white-box است که در آن کد مورد آزمایش قرار می گیرد در حالی که Test coverage بخشی از آزمایش black-box است که در آن عملکرد مطابق اسناد مورد نیاز آزمایش می شود. اندازه گیری Code coverage دقیقاً روی کد برنامه مورد استفاده قرار می گیرد.

🔹درواقعTest coverage بیشتر موارد تست را که با ساختن سند مورد نیاز به عنوان پایه ایجاد می شوند ، پوشش می دهد و هنگام Test coverage نیازی ندارید که کد را بررسی کنید.

🔹درواقعCode coverage یک فرایند ساده است که به دنبال بهبود پوشش کدهای مورد آزمایش و یافتن نقایص آن است؛ از طرف دیگر ، Code coverage یک روش آزمایش black-box است که روش آزمایش باید مطابق با الزامات مشخص شده تراز شود.

🔹درواقعTest coverage به راحتی تنظیم می شود و به پیدا کردن اشکالات در جریان برنامه کمک می کند اما Test coverage عملکردها را آزمایش کرده و ویژگیهای نرم افزار را آزمایش می کند.

🔹درواقعCode Coverage و Test Coverage هر دو برای اندازه گیری کیفیت برنامه کاربردی ساخته شده اند اما یکی جنبه کد نویسی را پوشش می دهد و دیگری جنبه الزامات را.

را Code Coverage توصیف می کند که کد برنامه کاربردی اجرا شده است و Test Coverage توصیف می کند که چه مواردی تحت پوشش قرار گرفته است. در هنگام آزمایش یک برنامه، هر دو به روش های خاص خود دارای اهمیت هستند و به ارائه محصول با کیفیت کمک می کنند.

خوب بریم سروقت تست عملی

Checking Test Coverage🔵

مقیاسی است که مشخص می کند چه تعداد test case وجود دارد و آیا این test case ها تمام functionality سیستم را مورد تست قرار می دهند به عبارت دیگر چند درصد از functionality سیستم توسط test case ها مورد تست قرار گرفته است

کد اصلی:

package main

import (
    "testing"
)

func TestCalculate(t *testing.T) {
    if Calculate(2) != 4 {
        t.Error("Expected 2 + 2 to equal 4")
    }
}


کد تست:

func TestTableCalculate(t *testing.T) {
    var tests = []struct {
        i    int
        e int
    }{
        {2, 4},
        {-1, 1},
        {0, 2},
        {-5, -3},
        {99999, 100001},
    }

    for _, test := range tests {
        if output := Calculate(test.i); output != test.e {
            t.Error("TestFailed: {} i, {} e, recv: {}", test.i, test.e, output)
        }
    }
}

 Using the -cover flag 🔵

🟡 خوب برای اجرا دستور زیر را وارد کنید:👇🏻

 go test -cover 🟢 

🟡 خروجی👇🏻

PASS

coverage: 66.7% of statements

ok      github.com/mrbardia72/covtes       0.006s

🟡 این ۶۶ درصد بیانگر این هست که 66.7٪  درصد کد مارو پوشش قرار داده توسط test case ها

🟡 در حالی که این مقدار 66.7٪ می تواند به ما بگوید که چه مقدار از کد خود را آزمایش کرده ایم ، اما به ما دقیقاً نشان نمی دهد که در کد مسیرهایی را داریم یا آزمایش نکرده ایم.

 Visualizing Coverage 🔵

🟡 خوب برای این که خروجی کار روی توی مرورگر 

🟡 ببینیم دستور زیر رو اول بزنید

go test -coverprofile=all.out 🟢

🟡 بعدش دستور زیر

go tool cover -html=coverage.out 🟢

🟡زمانی که دستور فوق رو میزنید با تصویر پایین روبه رو می شوید