تست واحد
تست واحد در سیپلاسپلاس یک روش برای اعتبارسنجی عملکرد مستقل توابع، کلاسها یا ماژولهای کوچک کد است. اهمیت آن در توسعه نرمافزارهای پایدار و قابل اطمینان بسیار زیاد است، زیرا این تستها به شناسایی خطاها در مراحل اولیه کمک میکنند، نگهداری کد را آسانتر میکنند و کیفیت کلی سیستم را افزایش میدهند.
در توسعه سیپلاسپلاس، تست واحد باید از ابتدا در طراحی توابع و کلاسها اعمال شود و بهویژه در زمان بازنویسی یا بهبود ماژولها کاربرد دارد. این تستها با اصول برنامهنویسی شیءگرا، استفاده صحیح از ساختارهای داده، الگوریتمهای بهینه و مدیریت حافظه ترکیب میشوند. این آموزش نشان میدهد چگونه تستهای پایه و پیشرفته در سیپلاسپلاس ایجاد و در چرخه توسعه نرمافزار بهصورت عملی پیادهسازی شوند.
با دنبال کردن این آموزش، شما خواهید توانست توابع ساده را تست کنید، رفتار کلاسهای پیچیده را اعتبارسنجی کنید، با استثناها کار کنید، از نشت حافظه جلوگیری نمایید و الگوهای طراحی استاندارد را برای کدنویسی ایمن و قابل نگهداری دنبال کنید. تست واحد در سیپلاسپلاس همچنین برای یکپارچهسازی با فریمورکهای تست و توسعه رویکردهای TDD (Test-Driven Development) اهمیت دارد.
مثال پایه
text\#include <iostream>
\#include <vector>
\#include <cassert>
int جمع_وکتور(const std::vector<int>& اعداد) {
int جمع = 0;
for (int عدد : اعداد) {
جمع += عدد;
}
return جمع;
}
void تست_جمع_وکتور() {
std::vector<int> تست1 {1, 2, 3, 4, 5};
assert(جمع_وکتور(تست1) == 15);
std::vector<int> تست2 {-1, -2, -3};
assert(جمع_وکتور(تست2) == -6);
std::vector<int> تست3 {};
assert(جمع_وکتور(تست3) == 0);
std::cout << "تمام تستهای پایه با موفقیت گذشت!" << std::endl;
}
int main() {
تست_جمع_وکتور();
return 0;
}
در این مثال، تابع جمع_وکتور
مجموع عناصر یک وکتور را محاسبه میکند. تابع تست تست_جمع_وکتور
سناریوهای مختلف شامل اعداد مثبت، منفی و وکتور خالی را بررسی میکند. استفاده از assert
باعث میشود در صورت شکست تست، برنامه فوراً متوقف شود و خطا را اعلام کند.
استفاده از ارجاع ثابت (const std::vector<int>&
) از کپیهای غیرضروری جلوگیری کرده و کارایی برنامه را افزایش میدهد. حلقه range-based نیز کد را خواناتر میکند. این الگو برای تست توابع به صورت مستقل مناسب است و باعث افزایش مدولاریتی و قابلیت نگهداری کد میشود.
مثال کاربردی
text\#include <iostream>
\#include <stdexcept>
\#include <cassert>
class حساب_بانکی {
private:
std::string صاحب;
double موجودی;
public:
حساب_بانکی(const std::string& نام, double موجودی_اولیه) : صاحب(نام), موجودی(موجودی_اولیه) {
if (موجودی_اولیه < 0) throw std::invalid_argument("موجودی اولیه نمیتواند منفی باشد");
}
void واریز(double مقدار) {
if (مقدار <= 0) throw std::invalid_argument("مقدار واریز باید مثبت باشد");
موجودی += مقدار;
}
void برداشت(double مقدار) {
if (مقدار > موجودی) throw std::runtime_error("موجودی کافی نیست");
موجودی -= مقدار;
}
double دریافت_موجودی() const { return موجودی; }
};
void تست_حساب_بانکی() {
حساب_بانکی حساب("علی", 100.0);
حساب.واریز(50.0);
assert(حساب.دریافت_موجودی() == 150.0);
حساب.برداشت(30.0);
assert(حساب.دریافت_موجودی() == 120.0);
try {
حساب.برداشت(200.0);
assert(false);
} catch (const std::runtime_error&) {
assert(true);
}
try {
حساب_بانکی حساب_نامعتبر("رضا", -10.0);
assert(false);
} catch (const std::invalid_argument&) {
assert(true);
}
std::cout << "تمام تستهای پیشرفته با موفقیت گذشت!" << std::endl;
}
int main() {
تست_حساب_بانکی();
return 0;
}
این مثال کلاس حساب_بانکی
را با پوشش عملیات عادی و مدیریت استثناها تست میکند. استفاده از بلوکهای try-catch برای بررسی رفتار صحیح برنامه در مواجهه با خطاها ضروری است. ترکیب ارجاعهای ثابت، مدیریت استثنا و assertها باعث افزایش استحکام و ایمنی کد میشود. این الگوها برای اعتبارسنجی ماژولهای پیچیده و حفظ صحت عملیات حیاتی در پروژههای واقعی کاربردی هستند.
بهترین شیوهها و اشتباهات رایج در تست واحد سیپلاسپلاس:
- استفاده از ارجاع ثابت (
const &
) برای جلوگیری از کپی غیرضروری. - نگه داشتن تستها مستقل و قطعی.
- بررسی مقادیر حدی و استثناها.
- استفاده از smart pointerها برای جلوگیری از نشت حافظه.
-
پیروی از استانداردهای نامگذاری و سبک کدنویسی.
اشتباهات رایج: -
استفاده از pointerهای خام به جای smart pointer.
- وابستگی بین تستها.
- الگوریتمهای ناکارآمد در دادههای بزرگ.
- نادیده گرفتن مدیریت استثنا.
- ترکیب کد تست و تولید در یک بخش.
📊 جدول مرجع
سیپلاسپلاس Element/Concept | Description | Usage Example |
---|---|---|
تابع جمع_وکتور | محاسبه مجموع عناصر وکتور | int نتیجه = جمع_وکتور({1,2,3}); |
ماکرو assert | اعتبارسنجی شرایط | assert(نتیجه == 6); |
کلاس حساب_بانکی | مدیریت عملیات حساب | حساب_بانکی حساب("علی", 100.0); |
بلوک try-catch | تست و مدیریت استثناها | try { حساب.برداشت(200); } catch(...) {} |
ارجاع ثابت const | جلوگیری از کپی و محافظت داده | void واریز(const double& مقدار); |
تست واحد در سیپلاسپلاس قابلیت اطمینان و پیشبینیپذیری کد را افزایش میدهد، امکان شناسایی سریع خطاها و پیادهسازی TDD را فراهم میکند. توصیه میشود پس از این آموزش، با فریمورکهایی مانند Google Test و Catch2 آشنا شوید، تستها را در فرآیند build ادغام کنید و ماژولها را در سیستمهای بزرگتر اعتبارسنجی کنید تا عملکرد مستقل و ترکیبی آنها تضمین شود.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود