تست نویسی در پایتون با pytest
آموزش پروژهمحور تستنویسی خودکار با pytest در پایتون، از صفر و در قالب ساخت یک پروژه مدیریت کیف پول دیجیتال و تراکنشها (Digital Wallet)
14
درس
- آشنایی با تستنویسی در توسعه نرمافزار یک برنامهنویس در طول روز دهها تصمیم کوچک میگیرد. یک تابع اضافه میکند، یک شرط تغییر میدهد، یک باگ رفع میکند. هر بار هم نگران یک چیز است: «آیا این تغییر، جای دیگری از کد را خراب کرد؟»تستنویسی دقیقاً جواب همین نگرانی است.تست در توسعه نرمافزار یعنی نوشتن کدی که صحت کد دیگری را بررسی میکند. این تعریف ساده است، اما اثرش عمیق. وقتی برای پروژهات مجموعهای از تستها داری، هر تغییر در کد را میتوانی با خیال آسوده اعمال کنی؛ چون در کمتر از چند ثانیه مطمئن میشوی همهچیز درست کار میکند. تست دستی در برابر تست خودکار اکثر برنامهنویسان تازهکار بدون اینکه بدانند، تست مینویسند. برنامه را اجرا میکنند، یک مقدار وارد میکنند و خروجی را با چشم چک میکنند. به این روش تست دستی میگویند. تا وقتی پروژه کوچک است، این روش جواب میدهد.مشکل از جایی شروع میشود که پروژه بزرگتر میشود. اگر ۵۰ تابع داشته باشی و یکی را تغییر دهی، باید ۴۹ تابع دیگر را هم دستی چک کنی که خراب نشده باشند. این کار نه فقط وقتگیر است، بلکه مغز انسان توانایی دیدن همه خطاها را ندارد و اشتباه میکند.تست خودکار این مشکل را حل میکند. یک بار کد تست را مینویسی، بعد هر وقت خواستی با یک دستور ساده، پایتون همه چیز را در کسری از ثانیه بررسی میکند. انواع تست در توسعه نرمافزار سه نوع تست اصلی وجود دارد که باید بشناسی: تست واحد (Unit Test) کوچکترین واحد کد را جداگانه بررسی میکند. مثلاً فقط یک تابع. سریع است و پیدا کردن مشکل در آن آسان است. در این دوره بیشتر با همین نوع کار میکنیم. تست یکپارچگی (Integration Test) بررسی میکند که چند بخش مختلف برنامه در کنار هم درست کار میکنند یا نه. مثلاً آیا تابع ثبتنام کاربر با پایگاه داده درست ارتباط برقرار میکند؟ تست سرتاسری (End-to-End Test) کل مسیر را از ابتدا تا انتها شبیهسازی میکند؛ مثل اینکه یک کاربر واقعی وارد سایت شود، خرید کند و پیام تأیید دریافت کند. pytest؛ ابزار استاندارد تستنویسی در پایتون پایتون چند ابزار برای تستنویسی دارد. قدیمیترین آنها unittest است که از سال ۲۰۰۱ همراه پایتون بوده. اما امروز اکثر توسعهدهندگان حرفهای از pytest استفاده میکنند.دلیلش ساده است: pytest کد کمتری نیاز دارد، خطاها را شفافتر نشان میدهد و قابلیتهای پیشرفتهتری دارد. طبق آمار سایت JetBrains در گزارش سال ۲۰۲۴، بیش از ۷۰٪ توسعهدهندگان پایتون که تست مینویسند، از pytest استفاده میکنند. جایگاه تستنویسی در بازار کار تستنویسی دیگر یک مهارت جانبی نیست. در اکثر آگهیهای استخدام توسعهدهنده پایتون، آشنایی با pytest یا تستنویسی به صورت مستقیم ذکر شده است. شرکتهایی مثل Google، Mozilla و Dropbox از pytest در پروژههای اصلیشان استفاده میکنند.در این دوره با یک پروژه واقعی شروع میکنیم: یک سیستم کیف پول دیجیتال میسازیم و قدم به قدم یاد میگیریم چطور با pytest مطمئن شویم که هر بخش آن درست کار میکند.
- چرا تست خودکار؟ (سناریوی پروژه) تصور کنید یک روز با دهها پیام اعتراض از سوی کاربران سایت مواجه میشوید که همگی از ناپدید شدن موجودی حساب خود پس از واریز وجه شاکی هستند. در این وضعیت، احتمالاً مجبور خواهید شد ساعتها وقت بگذارید و به صورت دستی، فرم واریز را بارها پر کنید تا منشأ خطا را پیدا کنید. این سناریو، یک چالش جدی برای هر برنامهنویسی است که هنوز از تست خودکار استفاده نمیکند. در درس اول، دقیقاً وارد همین چالش کاربردی میشویم. با هم یک سیستم مدیریت کیف پول دیجیتال (Digital Wallet) طراحی میکنیم که وظایفی مانند افزایش موجودی، برداشت وجه و انتقال پول را انجام میدهد. اما برای درک بهتر اهمیت موضوع، عمداً یک خطای محاسباتی پنهان در کدهای آن قرار میدهیم تا ببینیم چگونه یک اشتباه کوچک، حسابکتاب کاربران را مختل میکند. هدف این است که تفاوت زمانبر بودن تست دستی را با سرعت بینظیر تست خودکار مقایسه کنید؛ جایی که پایتون با اجرای چند خط تست، در کمتر از یک ثانیه خطای کد را شناسایی میکند. پس از پایان این درس، رویکرد شما به توسعه نرمافزار تغییر خواهد کرد و دیگر هیچ کدی را بدون داشتن تست، به محیط واقعی منتقل نخواهید کرد. توسعه پروژه را از همین نقطه آغاز میکنیم.
- نصب ابزارها و راهاندازی ساختار پروژه برای شروع تستنویسی، ابتدا باید محیط کاربری و ابزارهای مورد نیازمان را آماده کنیم. در این درس، فریمورک pytest را روی سیستم نصب میکنیم و ساختار استاندارد فایلهای پروژه را میچینیم تا پایتون دقیقاً بداند کدهای اصلی کجا قرار دارند و فایلهای تست را چطور پیدا کند. یادگیری قوانین نامگذاری در pytest یکی از حیاتیترین بخشهای این درس است؛ زیرا این فریمورک بر پایه یک مکانیزم شناسایی خودکار (Test Discovery) کار میکند و اگر اصول نامگذاری پوشهها و توابع را رعایت نکنید، تستهای شما هرگز اجرا نخواهند شد. در ادامه، قدم به قدم ابزارهای لازم را پیکربندی میکنیم تا پروژه کیف پول دیجیتال ما ساختاری حرفهای و آماده برای توسعه پیدا کند. بدون اتلاف وقت، ترمینال خود را باز کنید تا وارد فاز عملیاتی شویم.
- نوشتن اولین تست با دستور assert تا اینجای کار ابزارها را چیدهایم و ویترین پروژه آماده است، اما هنوز هیچ منطق برنامه نویسی یا کد واقعی نداریم که بخواهیم سلامت آن را بسنجیم. در این درس، مستقیماً وارد فاز عملیاتی میشویم؛ قرار است اولین تابع واقعی پروژه، یعنی قابلیت افزایش موجودی در کیف پول دیجیتال را بنویسیم و بلافاصله با نوشتن اولین تست پایتون با دستور assert، مچ باگهای احتمالی آن را بگیریم. بسیاری از برنامهنویسان فکر میکنند ابزارهای ارزیابی نرمافزار پکیجهای پیچیدهای دارند، اما تمام جادوی فریمورک pytest روی یک کلمه کلیدی ساده و بومی در پایتون به نام assert میچرخد. با همین یک کلمه، شما به مفسر پایتون میگویید که خروجی تابع دقیقا باید چه عددی باشد؛ اگر محاسبات درست پیش برود، برنامه چراغ سبز میدهد و اگر حتی یک ریال جابهجا شود، ابزار خط فرمان با گزارش قرمز رنگ جلویتان را میگیرد. در این بخش یاد میگیرید که چطور سناریوی تست خود را به کدهای اصلی برنامه متصل کنید تا با هر تغییر در منطق کیف پول، نیازی به اجرای دستی و چک کردن با چشم نداشته باشید. ترمینال و ادیتور خود را آماده کنید تا اولین تست واقعی و هوشمند خودتان را بنویسید.
- تست سناریوهای تکراری با parametrize وقتی برای اولین بار یاد میگیرید که چطور کدهای اصلی برنامه را با ابزارهای تستنویسی پایتون ارزیابی کنید، همه چیز جذاب است. اما داستان از جایی فرسایشی میشود که مجبور باشید یک تابع را با ده کپی مختلف و مقادیر متفاوت بسنجید. فرض کنید میخواهیم متد برداشت وجه از کیف پول دیجیتال را با مبالغ مختلف، از اعداد خرد گرفته تا ارقام میلیونی و حتی عدد صفر، به چالش بکشیم؛ آیا منطقی است که برای هر کدام از این مقادیر، یک تابع تست مستقل و تکراری بنویسیم؟ قطعا خیر. نوشتن کدهای کپیپیست شده نه تنها حجم فایلهای پروژه را بیدلیل بالا میبرد، بلکه نگهداری و عیبیابی کدهای مالی را به یک کابوس تبدیل میکند. اینجاست که با جادوی تست سناریوهای تکراری در پایتون با parametrize آشنا میشوید. فریمورک pytest یک دکوراتور قدرتمند به نام @pytest.mark.parametrize در اختیارتان میگذارد که به شما اجازه میدهد فقط یک تابع تست هوشمند بنویسید، اما یک لیست کامل از ورودیها و خروجیهای مختلف را به آن تزریق کنید. در این درس، یاد میگیرید که چطور با این ابزار حرفهای، از شر نوشتن تستهای تکراری خلاص شوید و با یک چرخش قلم، ده سناریوی مختلف مالی را در کسری از ثانیه روی کلاس کیف پول دیجیتال خود اجرا کنید. ادیتور خود را باز کنید تا ساختار کدهای خود را به سطح برنامهنویسان ارشد برسانیم.
- تمیزکاری کدهای تست با Fixtures نگاهی به توابع تستی که تا اینجای کار برای پروژه کیف پول دیجیتال نوشتهاید بیندازید. یک الگوی تکراری و آزاردهنده در خطوط اولیه تمام آنها به چشم میخورد: نمونهسازی مداوم از کلاس اصلی. در شروع هر سناریو، مجبور بودهایم خطی مثل wallet = DigitalWallet() را بنویسیم تا یک آبجکت تازه با دارایی اولیه در اختیار داشته باشیم. این فرآیند راهاندازی تکراری، شاید در پروژههای کوچک به چشم نیاید، اما با بزرگ شدن پوشه تست، کدهای شما را سنگین، شلوغ و مستعد خطاهای ناخواسته میکند. توسعهدهندگان ارشد پایتون هرگز وقت خود را تلف نوشتن این کدهای تکراری برای آمادهسازی محیط ارزیابی نرمافزار نمیکنند. اینجاست که تکنیک تمیزکاری کدهای تست با Fixtures به عنوان یک راهکار نجاتبخش وارد بازی میشود. فریمورک یک مکانیزم بومی و فوقالعاده هوشمند به نام فیکسچرهای pytest در اختیارتان میگذارد که وظیفهاش مدیریت وابستگیها و تزریق خودکار نمونههای آماده به توابع ارزیابی است. فرض کنید یک دستیار هوشمند در پشت صحنه پروژه دارید؛ این دستیار قبل از اجرای هر تابع، یک آبجکت کیف پول تمیز، ایزوله و آماده به کار را روی میز کار شما میگذارد و به محض اتمام فرآیند عیبیابی، محیط را برای سناریوی بعدی پاکسازی میکند. در بخش اول این درس، یاد میگیرید که چطور با استفاده از دکوراتور @pytest.fixture از شر کدهای راهاندازی اضافه خلاص شوید، خوانایی پوشه تست خود را به اوج برسانید و یک زیرساخت مقیاسپذیر برای کدهای مالی خود بسازید. ادیتور خود را باز کنید تا فرآیند بهینهسازی کدهای پایتون را شروع کنیم.
- مدیریت طول عمر فیکسچرها (Fixture Scopes) تا اینجای کار آموختیم که فیکسچرهای pytest چطور با نمونهسازی مجدد، یک محیط آزمایشگاهی کاملاً ایزوله برای ارزیابی کدهای پایتون میسازند. اما در پروژههای بزرگتر، همیشه نیاز نداریم که دیتای ما در هر ثانیه بازنشانی شود. گاهی اوقات این تمیزکاریهای مداوم، سرعت اجرای کل فرآیند ارزیابی نرمافزار را به شدت پایین میآورد. فرض کنید در حال توسعه بخش مدیریت کاربران پروژه هستید و برای شروع تستها، باید اتصال به یک دیتابیس بزرگ یا وبسرویس خارجی برقرار شود. اگر ابزار تست مجبور باشد برای تکتک سناریوها این اتصال سنگین را قطع و وصل کند، زمان اجرای پروژه به شکل چشمگیری تلف میشود. راهکار منطقی این است که یک بار این فرآیند را انجام دهیم و دیتای آمادهشده را در چندین تست مختلف به اشتراک بگذاریم. کلید حل این چالش، درک عمیق مفهوم محدوده اجرای فیکسچر یا همان Fixture Scopes است. ما با تغییر این تنظیمات، به فریمورک دستور میدهیم که طول عمر نمونههای آماده چقدر باشد؛ آیا با پایان هر تابع از بین بروند، یا تا پایان اجرای کل پوشه تست در حافظه سیستم باقی بمانند. در ادامه این درس، با پیادهسازی گامبهگام یک بخش مدیریت کاربران واقعی، یاد میگیرید که چطور تعادل کاملی میان سرعت اجرا و امنیت ایزولهسازی کدهای خود برقرار کنید.
- تست فایل، JSON و دیتابیس با pytest تابعی که فقط دو عدد را جمع میکند تست راحتی است. ورودی میدهی، خروجی را چک میکنی، تمام. اما برنامههای واقعی اینطور ساده نیستند. کیف پول دیجیتالی که در این دوره ساختیم، باید موجودی کاربر را جایی نگه دارد. اگر برنامه بسته شود و دوباره باز شود، آن پول نباید ناپدید شود. اینجا پای فایل و دیتابیس به وسط میآید. سوال این است: چطور تابعی را تست کنیم که با دنیای بیرون از حافظه برنامه کار میکند؟ چرا تست فایل و دیتابیس فرق دارد؟ تست یک تابع ساده، اثری روی دنیای بیرون نمیگذارد. اما تابعی که فایل مینویسد یا رکورد در دیتابیس ثبت میکند، یک ردپا باقی میگذارد. این ردپا دو خطر دارد. خطر اول، آلودگی است. اگر تست یک فایل واقعی روی سیستم بسازد و پاک نکند، اجرای بعدی تست با باقیمانده اجرای قبلی تداخل پیدا میکند. خطر دوم، وابستگی است. تستی که به یک فایل خاص روی کامپیوتر شخصی وابسته باشد، روی کامپیوتر همکار یا سرور دیگر اصلاً اجرا نمیشود. راهحل pytest؛ فضای موقت ایزوله pytest یک فیکسچر داخلی به نام tmp_path ارائه میدهد که برای هر تست، یک پوشه موقت و یکتا میسازد. این پوشه یک شیء از نوع Path است؛ همان ابزار استاندارد پایتون برای کار با مسیر فایلها. نکته مهم این است که pytest پیش از شروع هر تست، این پوشه موقت را میسازد و بعد از پایان تست، خودش پاکسازی میکند. نیازی نیست نگران فراموش کردن حذف فایل باشی؛ این کار به صورت خودکار انجام میشود. نتیجه؟ هر تست در یک محیط تمیز و مستقل اجرا میشود. هیچ تستی روی تست دیگر اثر نمیگذارد. از فایل ساده تا JSON و دیتابیس منطق تست فایل متنی، JSON و دیتابیس یکی است: داده را در یک فضای موقت بنویس، تابع را روی همان فضا اجرا کن، نتیجه را بررسی کن.برای کیف پول دیجیتال، این یعنی میتوانیم موجودی کاربر را در یک فایل JSON موقت ذخیره کنیم، تابع save_balance را روی آن اجرا کنیم و مطمئن شویم داده درست نوشته شده. همین الگو برای یک پایگاه داده سبک مثل SQLite هم کار میکند. این درس چه چیزی به دوره اضافه میکند؟ تا اینجای دوره با مفاهیمی مثل فیکسچر، اسکوپ و conftest آشنا شدیم. در این درس، این ابزارها را روی یک سناریوی واقعیتر پیاده میکنیم: کدی که با دنیای بیرون از حافظه برنامه ارتباط دارد. این مهارت یکی از پرکاربردترین بخشهای تستنویسی حرفهای در پایتون است؛ چون اکثر برنامههای واقعی، دیر یا زود باید دادهای را جایی ذخیره کنند.
- اشتراکگذاری فیکسچرها و تست خطاها تا اینجای کار یاد گرفتیم که چطور با تنظیم محدوده عمر فیکسچرها، کنترل حافظه و سرعت اجرای تستها را به دست بگیریم. اما با بزرگتر شدن پروژه و افزایش تعداد فایلهای تست، با یک چالش جدید مواجه میشویم. اگر بخواهیم از یک فیکسچر مشترک در چندین فایل مجزا استفاده کنیم، مجبوریم آن کدها را در هر فایل کپی کنیم یا مدام درگیر ایمپورتهای طولانی و پیچیده پایتون شویم؛ روشی که ساختار پروژه را شلوغ و مدیریت آن را سخت میکند. در این درس یاد میگیرید که چطور با استفاده از یک فایل جادویی و مرکزی به نام conftest.py، تمام فیکسچرهای پروژه را یکجا جمع کنید و بدون نیاز به حتی یک خط ایمپورت، آنها را به صورت خودکار در تمام توابع تست به اشتراک بگذارید. این کار فرآیند تمیزکاری کدهای تست را به اوج سادگی و بهرهوری میرساند. اما داستان به همینجا ختم نمیشود. یک سیستم احراز هویت یا مدیریت مالی ایدهآل، علاوه بر بررسی رفتارهای درست، باید بتواند در برابر رفتارهای اشتباه و خطاها هم واکنش درستی نشان دهد. به همین دلیل در بخش دوم این درس، سراغ مدیریت استثناها میرویم و یاد میگیریم که چطور با ابزار pytest.raises تست خطاهای پیشرفته را بنویسیم تا مطمئن شویم سیستم در مواجهه با نام کاربری تکراری یا برداشتهای غیرمجاز، دقیقاً همان خطایی را پرتاب میکند که ما انتظارش را داریم.
- دستهبندی و فیلتر کردن تستها (Markers) وقتی تعداد فایلهای ارزیابی نرمافزار در پروژه شما از یک یا دو عدد فراتر میرود، با چالش زمان و مدیریت بهینهسازی فرآیند تست مواجه میشوید. فرض کنید سیستم مدیریت کاربران و کیف پول دیجیتال شما اکنون صاحب دهها سناریوی ارزیابی مختلف است. اجرای یکباره تمام این کدهای پایتون در زمان توسعه، نهتنها وقتگیر است، بلکه تمرکز شما را روی بخشی که در حال اصلاحش هستید، از بین میبرد. در این درس یاد میگیرید که چطور با استفاده از ابزار قدرتمند Markers یا همان نشانهگذارها در فریمورک pytest، تستهای خود را به صورت هوشمند دستهبندی کنید. این قابلیت به شما اجازه میدهد روی هر تابع تست یک برچسب یا تگ اختصاصی بچسبانید تا در زمان اجرای دستورات، کنترل کاملی روی فیلتر کردن آنها داشته باشید. با این تکنیک میتوانید به ابزار ارزیابی نرمافزار دستور دهید که در یک لحظه فقط کدهای بخش مالی را بررسی کند و بیخیال بخش ثبتنام کاربران شود. این شیوه از مدیریت زمان اجرای تستها در پروژههای بزرگ پایتون، سرعت توسعه و عیبیابی را چند برابر میکند و یکی از مهارتهای حیاتی برای ورود به دنیای پروژههای واقعی است.
- شبیهسازی دنیای بیرون با Mocking تا اینجای کار، تمام اجزای سیستم کیف پول ما در یک محیط بسته و تحت کنترل خودمان تست شدند. اما در دنیای واقعی، نرمافزارها منزوی نیستند و باید با سرویسهای بیرونی ارتباط برقرار کنند. فرض کنید میخواهیم قابلیت جدیدی به کیف پول اضافه کنیم تا قیمت لحظهای دلار را از یک API اینترنتی بگیرد و معادل ریالی موجودی کاربر را حساب کند. اینجاست که با یک چالش بزرگ مواجه میشویم. اگر موقع اجرای تستها اینترنت قطع باشد، چه اتفاقی میافتد؟ یا اگر سرور قیمت دلار کند باشد یا کلاً از دسترس خارج شود، تکلیف ارزیابی کدهای ما چیست؟ آیا درست است که صحت کارکرد کیف پول ما به عوامل بیرونی و غیرقابل پیشبینی گره بخورد؟ قطعاً خیر. تستهای واحد باید سریع، مستقل و تحت هر شرایطی تکرارپذیر باشند. پاسخ علمی و استاندارد مهندسی نرمافزار برای حل این مشکل، استفاده از تکنیکی به نام Mocking یا شبیهسازی است. ماک کردن به ما اجازه میدهد یک شیء یا تابع فرضی بسازیم که رفتار سرویس بیرونی را تقلید کند. با این روش، بدون اینکه واقعاً به اینترنت متصل شویم یا درخواستی بفرستیم، پاسخ فرضی سرور را بازسازی میکنیم. اصل حرف این است که با ابزار شبیهسازی در pytest، ما مرز کدهای خودمان را با جهان بیرون مشخص میکنیم. در این درس یاد میگیریم که چطور با استفاده از کتابخانههای استاندارد پایتون، جلوی خرابکاریهای احتمالی سرویسهای بیرونی را در فرآیند تستنویسی بگیریم و کدهایی پایدار خلق کنیم.
- سنجش پوشش تستها با Test Coverage وقتی برای پروژه کیف پول خود دهها تست مختلف مینویسید، شاید احساس کنید کار تمام شده و همهچیز زیر نظر است. اما از کجا مطمئن هستید که تستهای شما واقعاً تمام زوایای کدهای اصلی را لمس کردهاند؟ آیا خط یا بلاک خاصی در بدنه توابع وجود دارد که در طول اجرای تستها اصلاً اجرا نشده باشد؟ اینجاست که با مفهوم علمی و حیاتی پوشش کد یا همان Code Coverage روبرو میشویم. پوشش تست مثل یک نورافکن قوی عمل میکند که روی کدهای اصلی پروژه میتابد. این ابزار دقیقاً نشان میدهد چند درصد از خطوط کدهایی که نوشتهاید، حداقل یکبار توسط تستها بیدار و اجرا شدهاند. اگر بخشی از کد در تاریکی بماند و تستی برایش اجرا نشود، یعنی آنجا پناهگاهی امن برای باگهای مخفی است. در اکوسیستم پایتون و فریمورک pytest، استانداردترین روش برای سنجش این معیار، استفاده از ابزاری به نام pytest-cov است. این ابزار در پایان فرآیند ارزیابی نرمافزار، یک گزارش ریاضی و دقیق به شما تحویل میدهد. این گزارش مشخص میکند که کدهای مدیریت کیف پول چقدر به امنیت ۱۰۰ درصدی نزدیک شدهاند. خلاصه کلام اینکه تعداد بالای تستها بهتنهایی تضمینی برای کیفیت نیست، بلکه میزان پوشش مؤثر آنها روی کدهای اصلی اهمیت دارد. در این درس یاد میگیریم چطور این ابزار سنجش را راهاندازی کنیم، نقاط تاریک و تستنشده پروژه را بکشیم بیرون و با عدد و رقم از سلامت نرمافزار خود دفاع کنیم.
- ریفکتور کردن پروژه یک توسعهدهنده باتجربه را تصور کنید که شش ماه پیش کدی نوشته. حالا میخواهد آن را بهتر کند. ساختارش را تمیزتر کند، یک تابع طولانی را به چند تابع کوچکتر تبدیل کند، یک متغیر با نام مبهم را تغییر دهد. اما یک سوال آرام در ذهنش هست: «اگر این تغییر چیزی را خراب کند چطور؟» این سوال، بدون تست، جواب مشخصی ندارد. ریفکتورینگ چیست؟ ریفکتورینگ یعنی بهبود ساختار داخلی کد، بدون تغییر رفتار بیرونی آن. برنامه قبل و بعد از ریفکتور، دقیقاً همان کار را میکند. فقط کد تمیزتر، خواناتر و نگهداری آن آسانتر شده. این تعریف ساده است. اما اجرایش بدون یک مجموعه تست قابل اعتماد، همیشه با نگرانی همراه است. چرا تستها ریفکتورینگ را امن میکنند؟ وقتی مجموعهای از تستهای خودکار دارید، هر تغییر در کد یک تأییدیه فوری دارد. تستها را اجرا میکنید. اگر سبز ماندند، رفتار برنامه تغییر نکرده. اگر قرمز شدند، دقیقاً میدانید کدام بخش آسیب دیده. این همان «خیال راحت» است که در عنوان این درس آمده. نه یک احساس، بلکه یک اطمینان فنی مبتنی بر شواهد. در این درس چه چیزی یاد میگیرید؟ پروژه کیف پول دیجیتال را که از درس اول با آن کار کردید، در این درس ریفکتور میکنیم. چند تابع را بازنویسی میکنیم، ساختار بعضی بخشها را بهبود میدهیم و بعد از هر تغییر، تستها را اجرا میکنیم تا ببینیم چراغ سبز میماند یا نه. این فرآیند نشان میدهد که تستهایی که در درسهای قبل نوشتید، دقیقاً چه نقشی در توسعه واقعی دارند. نه فقط برای پیدا کردن باگ، بلکه برای اینکه بتوانید با اطمینان کد را تغییر دهید.
- جمع بندی و نقشه راه بعدی در درس های قبلی، با یک سوال ساده شروع کردیم: چطور مطمئن شویم کدی که نوشتیم درست کار میکند؟آن سوال، مسیر کاملی را باز کرد.از تفاوت تست دستی و خودکار گذشتیم. یاد گرفتیم چطور با pytest اولین تست را بنویسیم، چطور با parametrize دهها سناریو را با چند خط پوشش دهیم، و چطور با فیکسچر، کد تکراری را از تستها بیرون بکشیم. دیدیم که conftest.py چطور فیکسچرها را بین فایلهای مختلف به اشتراک میگذارد، با مارکرها تستها را دستهبندی کردیم، با Mocking دنیای بیرون را شبیهسازی کردیم، پوشش کد را با pytest-cov اندازه گرفتیم، و یاد گرفتیم توابعی که با فایل، JSON و دیتابیس کار میکنند را هم ایزوله تست کنیم. این مجموعه مهارتها، پایهای است که اکثر توسعهدهندگان پایتون در کار روزمره به آن نیاز دارند. در این درس چه چیزی برای ارائه داریم؟ یادگیری pytest در اینجا تمام نمیشود. تمام شدن یک دوره مقدماتی، نقطه پایان نیست؛ نقطهای است که مسیر بعدی از آن شروع میشود.در این درس، ابتدا نگاهی به تستهایی میاندازیم که در طول دوره نوشتیم و تصویر کلی مهارتهای کسبشده را میبینیم. بعد یاد میگیریم همین تستها را روی GitHub Actions اجرا کنیم تا هر بار که کد تغییر میکند، بهصورت خودکار بررسی شوند. در ادامه چند ابزار مکمل pytest را معرفی میکنیم که در پروژههای واقعی کاربرد مستقیم دارند. و در پایان، نقشه راه مشخصی برای ادامه یادگیری ارائه میشود.پروژه کیف پول دیجیتال که از درس اول همراه ما بود، امروز یک مجموعه تست کامل دارد. این تستها دیگر فقط روی کامپیوتر شخصی اجرا نمیشوند؛ آمادهاند که روی هر سرور و در هر محیطی کار کنند.