تست کد- چرخه توسعه نرم افزار نامرئی. توسعه دهندگان نوظهور اغلب نقش او را دست کم می گیرند و اثربخشی برنامه ها را به روش قدیمی تفسیر می کنند - "این کار می کند، خوب است." در اوایل، این استراتژی شکست می خورد و ردیاب اشکال شروع به غلبه بر ارتش درمان نشده تراکتورها می کند. برای جلوگیری از گم شدن در چنین خمیری، توصیه می کنم بارها و بارها با تفاوت های ظریف تست آشنا شوید جاوا اسکریپتکد

جاوا اسکریپت دیگر یکسان نیست

امروز جاوا اسکریپت- این فقط یک زبان برای جشن گرفتن ظاهر برنامه ها نیست. اگر از جاوا اسکریپت برای آشپزی یا تهیه منو استفاده می شد، ساعت ها به طور غیرقابل برگشتی می گذشت. اکنون یک زبان مستقل وجود دارد که با این حال هم روی کلاینت و هم روی سرور به خوبی کار می کند. نقش جاوا اسکریپت واقعاً تکامل یافته است، به این معنی که هنگام نوشتن کد لازم است به روش هایی متوسل نشوید که در سایر زبان های برنامه نویسی به خوبی کار کرده اند.

چه چیزی را برای اعمال و پارادایم ها رعایت می کنم؟ اول از همه، یک الگوی معماری MVC (کنترل کننده نمای مدل)و الگوهای سازماندهی کد. با پیروی از این ترفندهای ساده، می توانید کد واضحی بنویسید که نه تنها به راحتی قابل پیگیری است، بلکه امکان تست خودکار را نیز فراهم می کند.

تکمیل اکثر آزمایش کننده ها

بر کسی پوشیده نیست که محبوب ترین روش آزمایش همیشه آزمایش پیش پا افتاده چشم بوده است. ماهیت آن تا حد ناسازگاری ساده است - با نوشتن هزاران خط کد، حذف کار و راه اندازی مرورگر خود. پس از اتمام کار، کلیک کردن، و انجام همه چیز، می توانید آن را در سرور نبرد آپلود کنید. همه چیز بسیار ساده است و با احترام مناسب توسعه دهنده (در حالت ایده آل، شخصی که به عنوان "تستر" برچسب گذاری شده است)، می توانید به صحت برنامه رباتیک اعتماد کنید.

در عمل، همه چیز بسیار متفاوت است. چیزی به نام تستر دیوانه وجود ندارد. خود توسعه دهنده سعی می کند اثربخشی برنامه ها را تأیید کند و با ترتیب فنی توالی اقدامات پایان می یابد. جعل کدهای پیشرفته تر، تست یکپارچه سازی مشابه را با استفاده از سخنرانی های اضافی در پلت فرم سلنیوم خودکار می کند.

به این ترتیب برنامه نویس توانایی تشخیص مجازات های سخت را از دست می دهد. متأسفانه اقدامات "احمقانه" و "بی کفایت" تاجر و همچنین حرکات حیله گرانه در منطق تجارت در 99٪ موارد در پشت صحنه گم می شود.

کشف یک فرد پنهان در یک آزمایش کننده خاص نیز اغلب تا ساعتی دیگر مشکل دارد. با این حال، به محض اینکه احترام شکننده خود را به جزئیات بیاورید، با افزایش مکمل، شدت آزمایش شما به صفر می رسد. من یک مثال از تمرین برای شما می زنم.

به نظر می رسد که وظیفه توسعه یک برنامه کوچک به من داده شده است. برای کارایی پروژه به ساده ترین CRM فکر کردم که در کوتاه ترین مدت آن را پیاده سازی کردم. با جمع آوری شراب لازم از شهر، تمام خروجی را به معاونت تحویل دادم و ماه ها پروژه را فراموش کردم. سپس اتفاقات شروع شد. معاون تصمیم گرفت به طور جدی عملکرد برنامه را گسترش دهد و از من کمک خواست. به طور طبیعی، من شروع به کار کردم و روی یک تابع جدید کار کردم. در ابتدا کار سختی نبود، اما وقتی به نقطه ادغام کامل عملکرد رسید، انبوهی از اشکالات به پشتم هجوم آوردند. کد شروع به تضاد کرد و ساعت های زیادی باید صرف حل تعارضات می شد. "اما اگر دانشجو نیستید، چرا مکمل شما مشکل دارد؟" - لطفا خوانندگان عزیز. پس از راه‌اندازی، اما از طریق آن‌هایی که اضافه‌شده رشد کرده بود، وقت یا اعصابی برای اعتراض دسته جمعی به همه عملکردها نداشتم. من خمیر را هدر دادم و عملکردش را از دست دادم و سخاوتمندانه برای آن پرداختم. اخلاقیات داستان این است که "به تست کردن به عنوان بخش نامرئی یادگیری فکر کنید."

واحد تستی یاک سریبنا کولیا

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

پس از تکمیل توسعه یک تابع جدید (یک گزینه ممکن نوشتن تست ها قبل از شروع توسعه است)، توسعه دهنده کد خاصی را برای آزمایش کد خود می نویسد. برای تست کد، لازم است به موقعیت ها و مقادیر مختلفی که چرخانده شده اند توجه شود. به عنوان مثال، ما یک تابع برای برش پاکسازی (تریم) نوشتیم. برای اعتراض به این بیهودگی، باید تعدادی تست برای آزمایش آن تهیه کنیم:

  • هنگام انتقال ردیف "ردیف" در خروجی، "ردیف" را حذف می کنیم.
  • هنگام انتقال عبارت "ردیف 9"، "ردیف 9" را در خروجی حذف می کنیم.
  • همچنین می توانیم تست را به پارامترهای ورودی دیگر اضافه کنیم (به عنوان مثال، کاراکتر space را با یک زبانه جایگزین کنید). هرچه سریعتر کد را با آزمایش بپوشانیم و گزینه های منفی احتمالی بیشتری را منتقل کنیم، احتمال اینکه در لحظه بعد سه تار موی سر خود را از دست بدهید بیشتر می شود.

    در دنیا، تست های JS نیاز به استفاده از چارچوب های تخصصی اضافی دارند. آنها همه چیزهایی را که برای توصیف تست ها نیاز دارید و همچنین ابزارهای هوشمندانه ای برای سازماندهی گزارش های آزمایشی دارند.

    تست! = کد تماس

    توسعه دهندگانی که آزمایش واحد را دوست ندارند، دوست دارند تأیید کنند که تست واحد از نوشتن و پشتیبانی کد اضافی سود می برد. با این حال، اصطلاحات مورد استفاده در پروژه های واقعی بیشتر مورد استفاده قرار می گیرند و به سادگی امکان نوشتن کد اضافی وجود ندارد.

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

    اگر زمان کافی برای عذاب دادن رئیس خود ندارید، برای نوشتن تست الهام خواهید گرفت - در مورد آن فکر کنید. در این مورد، شاید بهتر باشد به جای اینکه مجبور شوید همه چیز را آزمایش کنید، فقط پیچیده ترین بخش های کد را با آزمایش پوشش دهید. از قبل فکر کنید، شاید در یک ماه برنامه شما به ابعاد بی سابقه ای برسد.

    هر کدی تست نمی شود

    چرا من اصرار دارم که قبل از نوشتن کد اصلی باید نگران آزمایش باشید؟ زیرا کدی که در ابتدا به واحد تست ها منتقل می شود با سبکی کاملا متفاوت نوشته شده است. هر کدی قابل اعتراض نیست. رمزی که در آن منطق و مظاهر با هم ترکیب شده اند، به طور عادی قابل اعتراض نیست. در اینجا، اول از همه، من از چند قانون ساده پیروی می کنم:

  • نیازی به نوشتن توابع عالی نیست. عملکرد پوست مسئول یک مشکل است نه 100500 موقعیت ممکن. به عنوان مثال، نیازی به درج کدی برای ارسال داده به سرور در تابع نیست، که نشان دهنده آماده سازی آن است.
  • تابعی که از بیش از 10 ردیف کد تشکیل شده است که بیش از یک تابع بد است.
  • منطق و مظاهر همیشه مقصر نیستند.
  • QUnit – یک کلاسیک از این سبک از سازندگان jQuery

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

    می توانید نسخه باقیمانده QUnit را از وب سایت رسمی - http://qunitjs.com/ دانلود کنید. این کتابخانه تنها با یک فایل JS و CSS ارائه می شود. این امکان وجود دارد که شما تمام اجزای لازم را داشته باشید، و اگر چنین است، وقت آن است که یک تست آزمایشی بنویسید. بیایید خیلی دور نرویم و سعی کنیم به تصور غلط تابع trim() اعتراض کنیم.

    برای نشان دادن تست ها، ساده ترین پروژه را با استفاده از سازنده رویکرد ایجاد کردم:

    Index.html – فایل اصلی که نتایج آزمون را نمایش می دهد. - qunit-1.12.0.js - فایل کتابخانه qunit. - example.js – فایلی حاوی کد برای آزمایش (این تابع trim() را توصیف می کند). - test.js - فایل با تست. - qunit-1.12.0.css – سبک هایی برای قالب بندی داده ها از تست ها.

    به جای فایل index.html و test.js، نماهایی در لیست های 1 و 2 وجود دارد. بهتر است لیست دیگری را نقل قول کنیم که شامل توابعی است که در حال آزمایش هستند (trim()) و کد تست برای تأیید. اثربخشی آن لطفاً توجه داشته باشید، اگر من آن را در لیست دیگری قرار دهم، فقط برای صرفه جویی در فضا در گزارش، خود تابع trim() می تواند گسترش یابد.

    حالا بیایید از خود تست ها شگفت زده شویم. برای بررسی مفید بودن کد ما Qunit.jsروش های کم را به ما می آموزد:

  • تست()- مشعل برای توصیف خمیر؛
  • خوب()- تأیید به شما امکان می دهد صحت پارامتر اول را تأیید کنید. در برنامه ما، من خروجی آن را به تابع trim() و یکسان سازی مقادیری که برای برش بررسی می کنم، ارسال می کنم. اگر ذهن درست باشد، آزمون قبول می شود.
  • برابر()- این روش به شما امکان می دهد سازگاری پارامترهای اول و دیگر را بررسی کنید. توجه به این نکته مهم است که این روش نیازی به تأیید دقیق ندارد و فقط برای مقادیر اسکالر مناسب است.
  • نا برابر()- پروتیل برابر (). مهمتر از دیگری در نظر گرفته می شود;
  • strictEqual()– مشابه برابر () با یک استثنا – تأیید دقیق را انجام می دهد (یعنی نوع داده دیگری را تأیید می کند).
  • notStrictEqual()– روش strictEqual();
  • deepEqual()- روشی برای جامدات بازگشتی که برای موارد اولیه، آرایه ها، اشیاء استفاده می شود.
  • notDeepEqual()– متد deepEqual()؛
  • افزایش می دهد()- تایید برای آزمایش عملکرد دروازه برای ایجاد خطا.
  • من فهرست دیگری را نشان دادم که دقیقاً چگونه می توان این روش ها را به صورت عملی پیاده سازی کرد. اگر سهام تست را به این ترتیب اجرا کنید، تمام تست ها با موفقیت پشت سر گذاشته می شوند (کوچولوی شگفت انگیز). برای افزایش تفاوت بین موفقیت آمیز بودن آزمون ها و پایان یافتن با خطا، کد یک آزمون را کمی تغییر دادم. ردیف خمیر برای کمک strictEqual()من یک نتیجه شیرین (کوچولوی شگفت انگیز) اضافه کردم.

    لیست 1. به جای فایل index.html

    آزمایش برای کمک اضافی QUnit

    لیست 2. فایل ها و تابع trim() را آزمایش کنید

    تابع trim(string) ( return (string || "").replace(/^\s+|\s+$/g, ""); ) test("Test function trim()", function() (ok(trim ("آزمون") == "تست"، "کاهش شکاف های شدید")؛ ok(Trim("1") == "1"، "تعداد زیادی شکاف در طرفین")؛ = "24"، " شکاف ها و زبانه ها از طرفین")؛ برابر (تریم ("")، ""، "ردیف خالی");

    ما یاد گرفته ایم که توابع ساده را آزمایش کنیم. لطفا مرا بپذیرید و چیزی اضافه نکنید. سپس باید کد واقعی را بگیرید و سعی کنید به تنهایی تست بنویسید. با کمال تعجب، این مشکل اغلب مقصر شناخته می شود جاوا اسکریپت-محققان - تست توابع ناهمزمان. این برنامه که با کد جاوا اسکریپت نوشته شده است، 99٪ با سمت سرور با استفاده از Ajax تعامل دارد. همچنین حذف این کد بدون تجدید نظر غیرممکن است، مگر اینکه تست ها کمی متفاوت نوشته شده باشند. بیایید نگاهی به باسن بیندازیم:

    AsyncTest("myAsyncFunc()"، function() ( setTimeout(function() (ok(myAsyncFunc() == true، "داده ها با موفقیت منتقل شدند"); start(); ), 500); ));

    مزیت اصلی این مثال این است که به جای رایتر ()test، به asyncTest() تبدیل می‌شود، بنابراین اعلام می‌کند که خود آزمایش باید تست ناهمزمان باشد. سپس یک ساعت خیساندن 500 میلی لیتر را شروع می کنم. ثانیه در طول این ساعت، تابع myAsyncFunc() باید داده ها را به سرور آزمایشی منتقل کند و همه چیز روی true تنظیم می شود. محور در اینجا به لحظه کامل می رسد. هنگامی که asyncTest() فراخوانی می شود، جریان تست متوقف می شود و تست باید به طور خودکار پس از اتمام اجرا شود. برای کنترل جریان ویسکوزیته واحدє متدهای start() و stop().

    تست توابع ناهمزمان با استفاده از یک کتابخانه اضافی واحدتموم کردنش راحته نمونه باقی مانده که می خواهم مرور کنم مربوط به آزمون کتبی است که نتیجه آن تعدادی بررسی ناهمزمان است. منبع اصلی غذا، همانطور که در مورد چنین کارخانه هایی وجود دارد، مکان بهینه برای شروع جریان Viconniya است. سند رسمی پیشنهاد می کند که در چنین شرایطی در حال حاضر راکد شوید:

    AsyncTest("myAsyncFunc()", function() ( expect(3); //در اینجا سه ​​بررسی وجود دارد ok(myAsyncFunc()، "نور بهتر از 1 است")؛ ok(myAsyncFunc()، "نور است بهتر از 2") ) ok(myAsyncFunc()، "نور Robimo روشنتر از 3 است"); setTimeout(function() (start(); ), 3000); ));

    تست برای اکشن koristuvach

    اول از همه، باید به خاطر داشته باشید که جاوا اسکریپت حتی بیشتر از هر رابط کاربری دیگری نوشته می شود. به عنوان مثال، مشتری روی یک پمپ کلیک می کند و ممکن است پاسخی به کلیک او نمایش داده شود. تعداد زیادی از این کدهای "رابط" در پروژه ها وجود دارد و همچنین باید با آزمایش پوشانده شود. بیایید ببینیم چگونه می توانید فشار یک کلید را شبیه سازی کنید و یک تست برای آن بنویسید. واضح است که ما تابعی داریم که فشار کلید را ثبت می کند. من این کد را به لیست سوم دادم:

    فهرست 3. ثبت کلیدهای فشرده شده

    تابع KeyLogger(هدف) (اگر (!(این نمونه از KeyLogger)) (بازگرداندن KeyLogger(هدف) جدید؛ ) this.target = target; this.log = ; var self = this; this.target.off("keydown") .on("keydown"، تابع(رویداد) (self.log.push(event.keyCode); ))؛ )

    حالا بیایید این عملکرد اعتراض را امتحان کنیم. اول از همه، در طول تست، باید کلید فشرده شده را فشار دهیم. ساده ترین راه کمک گرفتن از کتابخانه است جی کوئری، که به شما امکان می دهد تعدادی ردیف کد ایجاد کنید (بخش فهرست 4).

    لیست 4. کد تست برای KeyLogger

    test("Test key logging", function() ( var event, $doc = $(document), keys = KeyLogger($doc)؛ event = $.Event("keydown"); event.keyCode = 9; $doc .trigger(event);equal(keys.log.length, 1, "Key recorded");

    در صفحه اول آزمایش، من یک روش آماده برای شبیه سازی فشار دادن یک کلید - "keydown" آماده کردم. باید کلید Tab (کد 9) را فشار دهیم. سپس نمونه آماده شده را به متد trigger() می فرستم و پس از آن می توانیم به تست ادامه دهیم. اکنون تصویر پنهان را بررسی می کنیم - آیا کلید فشرده شده است یا نه، و سپس کد.

    DOM تحت حفاظت آزمایشات

    یک بار Qunit.jsبه شما امکان می دهد ابزارهای خود را آزمایش کنید، سپس نوشتن تست برای DOM هیچ مشکلی ایجاد نمی کند. این درست است و برای تایید حرفم به زیر اشاره می کنم. من در این مورد نظر نمی دهم، فقط به کد نگاه کنید و همه چیز واضح تر می شود:

    Test("افزودن یک عنصر div جدید"، function() ( var $fixture = $("#qunit-fixture"); $fixture.append("

    تقسیم قیمت
    ")؛ equal($("div", $fixture).length, 1, "New div با موفقیت اضافه شد!"); ));

    Phantom.JS – اجرای تست ها از کنسول

    برای کمک به کتابخانه اضافی تست هایی بنویسید Qunit.jsدستی و ساده است، اما برای خودکار کردن راه اندازی آزمایش و جمع آوری نتایج خیلی زود است و خیلی دیر است. به عنوان مثال، برای این منظور من یک ماشین مجازی DigitalOcean دارم که فقط با استفاده از یک کنسول اضافی می توانم این کار را انجام دهم.

    پروژه phantom.js به شما این امکان را می دهد که این مشکل را به زیبایی حل کنید. این یک چارچوب نوشتن مزخرف نیست تست های واحد، و یک نسخه کنسول کامل از موتور وب کیت. به بیان ساده، این برنامه از یک مرورگر استفاده می کند. با کمک phantom.js، خودکار کردن تأیید آزمایش‌های vikonanny واقعاً آسان نیست، اما همچنین رویارویی با یک کار غیرشخصی که برای رویارویی با توسعه‌دهنده خیلی زود و دیر است: استخراج نتایج از رندر صفحات در پرونده آسان نیست. (png، jpg)، عملکردهای مانیتور مرزی (سوئدی) براش وسواس، بهره وری مخفی و غیره) . د)، تقلید از عمل koristuvach سپس. توصیه می‌کنم که مدارک رسمی این پروژه را کوتاه نکنید و مطالعه کنید، مطمئناً آنچه را که برای خود نیاز دارید، خواهید فهمید.

    Phantom.jsقابل دانلود بر روی پلتفرم های مختلف (nix، mac OS X، ویندوز). اگر همه چیز را تحت ویندوز اجرا می کنید، مشکلات رایج زیادی وجود دارد - از شر باینری خلاص شوید و جلو بروید. اگر دو آداپتور ویدیویی نصب کرده باشید، یکی NVidia، ممکن است مشکلات جزئی در راه اندازی رخ دهد. در این شرایط باید به سرعت از هک استفاده کنید که در vrezanna توضیح خواهیم داد.

    بیایید سعی کنیم در عمل با phantom.js آشنا شویم. بگذار از آن عبور کند phantom.jsبرای تست تست های آماده شده در قسمت آخر و خروجی نتایج تست در کنسول، به یک اسکریپت لودر مخصوص – run-qunit.js نیاز داریم. کنسول را باز می کنیم (من از ویندوز استفاده می کنم، بنابراین از cmd استفاده کنید) و دستور را در قالب تایپ می کنیم:

    Phantom.exe<путь к run-qunit.js> <путь к странице с тестами>

    در مورد من، دستور راه اندازی به این صورت بود:

    E:\soft\phantomjs>phantomjs.exe E:\temp\testjsforx\qunit\run-qunit.js file:///E: /temp/testjsforx/qunit/index.html نتیجه: آزمایش‌ها در 2592 میلی‌ثانیه تکمیل شدند. 9 رتبه از 9 مورد قبولی، 0 رتبه بندی ناموفق.

    همه تست ها قبول شد

    قطعا پوشاندن کد با تست ضروری است و فرقی نمی کند برنامه ای که می سازید در چه مقیاسی باشد. به زودی به شما یادآوری خواهم کرد که کوچکترین برنامه ها در حال تبدیل شدن به هیولاهای سختی هستند که نیاز به پشتیبانی و افزودن عملکرد دارند. تست خوب کد تضمین موفقیت و درخشندگی است. بنابراین، فقط شروع به نوشتن کد برای تست های خودکار آسان نیست، اما باور کنید، این همه درد در آینده به میزان زیادی جواب خواهد داد. این تمام چیزی است که برای امروز دارم، موفق باشید!

    اگر وقت کافی برای تست ندارید

    تنها در چند روز، نوشتن تست‌هایی برای توابع ساده (همان trim() را از برنامه‌های آماری بگیرید)، یا بهتر بگوییم روی حیاتی‌ترین بخش‌های کد تمرکز کنید، منطقی نیست. هنگام نوشتن کدهایی که مرتباً تغییر می کنند از این قانون پیروی کنید. مشخصات فنی یک پروژه زنده اغلب تغییر می کند و ویژگی ها باید به طور مداوم به روز شوند. چنین تغییراتی می تواند لحظات ناخوشایندی ایجاد کند - با تغییرات جدید داده ها، کد بهتر کار می کند و کدهای قدیمی به صورت ارگانیک اصلاح نمی شوند. برای جلوگیری از ایجاد خرابی در اینجا، بهتر است فوراً چنین عملکردهایی را با آزمایش بپوشانید. یک قانون ساده را به خاطر بسپارید - زمان زیادی طول نمی کشد تا کل کد را با آزمایش پوشش دهید و مهمترین بخش را پوشش دهید.

    قوانین برای تست های خوب

  • آزمون ممکن است تا حد امکان بخشنده باشد. هرچه آزمون پیچیده تر باشد، در آزمایش جدید مطمئن تر خواهید بود.
  • تست ها باید در یک ماژول گروه بندی شوند تا به راحتی بتوان مزایا و توانایی تست قطعات آهنگ برنامه ها را پیدا کرد.
  • آزمایش پوست مانند سایر آزمایشات نیست.
  • اگر متوجه هر گونه اشکال پوستی شدید ابتدا یک آزمایش بنویسید.
  • مشکل با phantom.js در ویندوز

    این قبلاً اتفاق افتاده است، اما من همه برنامه‌ها را تا به اینجا نه در لینوکس، بلکه تحت ویندوز خوب قدیمی 7 آزمایش کردم. معلوم شد که phantom.js هنگام اجرا بر روی سیستم‌هایی که از تعدادی آداپتور ویدیویی استفاده می‌کنند، مشکلات جزئی دارد. در لپ تاپ من، علاوه بر تراشه ویدئویی یکپارچه، NVidia همچنان در حال اجرا است و از طریق phantom.js به طور قطعی باید به دستور ()phantom.exit پاسخ دهد. در نتیجه، پس از کشته شدن فیلمنامه، فرآیند phantom.js کار خود را کامل نکرد و همچنان در حافظه باقی ماند. پنجره ترمینال نیز باید به دستورات خروج پاسخ می داد (ctrl + c - بدون هیچ کمکی).

    اگر با مشکل مشابهی روبرو هستید و قصد ترک آن را دارید phantom.jsدر ویندوز، سپس برای یک هک تهاجمی آماده شوید. پنل Nvidia را باز کنید. مورد "تنظیمات سه بعدی" را در درخت پیدا کنید. شخص راست دست مقصر گزینه "آداپتور گرافیکی مهم" است. برای انتخاب، این مقادیر در "Avtovybor" تنظیم شده است. ما باید به یک پردازنده انویدیا با عملکرد بالا یا سخت افزار گرافیکی یکپارچه ارتقا دهیم. بعد از این ترفند ساده phantom.jsشروع به رفتار شایعه کرده است.

  • Cristian Johansen Test-Driven JavaScript Development یکی از معدود کتاب هایی است که به جاوا اسکریپت از منظر نوشتن تست نگاه می کند.
  • John Resing، Beer Beebo "Secrets of the JavaScript Ninja" کتابی عالی است که برای توسعه دهندگان JS متوسط ​​مفید است. این کتاب به طور مفصل تغذیه نوشتن کد بین مرورگر موثر، تفاوت های ظریف پردازش این و بسیاری از لذت های دیگر را بررسی می کند.
  • به نظر می رسد دوست من با ابراز علاقه به این واقعیت که از جاوا اسکریپت می توان برای نوشتن محصولات جدی شرکتی حتی بدون کامپایلر استفاده کرد. در واقع مهم ترین نقش در ایجاد کد صریح این واقعیت نیست که یک کامپایلر برای برنامه نویسی در دسترس است، بلکه انتخاب صحیح و تنظیم خوب فرآیند فنی ایجاد سیستم نرم افزاری است.

    این فرآیند ممکن است شامل مجموعه ای از ویژگی ها برای کنترل سرعت و کارایی کار برنامه باشد. این روش ها می توانند عبارتند از: تست ماژولار و یکپارچه سازی، ادغام پیوسته (Continuous Integration، CI)، جمع آوری و تجزیه و تحلیل معیارهای مختلف (به عنوان مثال، حتی روش های دیگر در nDepend)، بررسی سازگاری قابلیت های JsLint، FxCop و غیره.

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

    چابک، TDD و BDD

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

    همچنین تکنیک های برنامه نویسی وجود دارد که به شما کمک می کند منطق نوشتن یک آزمون واحد را کدنویسی کنید: توسعه تست محور (TDD) و توسعه رفتار محور (BDD). آنها اغلب در فرآیند Agile مورد سوء استفاده قرار می گیرند. بیایید نگاهی به ویژگی های آنها در گزارش بیاندازیم.

    توسعه تست محور

    توسعه از طریق آزمایش یک فرآیند تکراری برای نوشتن کد است که در آن مراحل مشابه تکرار می شود:

    کروک 1. ابتدا یک منطق جدید اضافه کنید، یک تست واحد برای آزمایش این منطق ایجاد کنید.

    کروک 2. تست را اجرا کنید و بررسی کنید تا متوجه شوید نهعبور؛

    کروک 3. ساده ترین کد را بنویسید تا آزمایش با موفقیت اجرا شود.

    کروک 4. کد را تا حد امکان دقیق ویرایش کنید، کد تکراری را حذف کنید و دوباره تبدیل کنید تا آزمون با موفقیت انجام شود.

    تست واحد کدی است که عملکرد یک جزء (ماژول) معین را در یک هسته جدا شده آزمایش می کند. تست یکپارچه سازی به کدی اشاره دارد که عملکرد کلی چندین مؤلفه را آزمایش می کند. برای آزمایش یک ماژول در وسط ایزوله، اگر در بین ماژول های دیگر قرار داشته باشد، از "تست دوبل" استفاده می شود.

    تست دوبل

    تقسیم بندی اشیاء اضافی که در طول تست واحد تست می شوند، در دسته بندی، از کتاب xUnit Test Patterns نوشته جرارد مسزاروس گرفته شده است. این دسته‌بندی‌ها به‌طور رسمی «دوبل آزمون» نامیده می‌شوند. انواع مختلفی از پشتیبان گیری وجود دارد:

    • جعلی؛
    • ساختگی.

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

    مسخره کردن- این یک شی اضافی است، رفتار - اخلاقآنچه در پس زمینه پرسیده می شود برای شناسایی رابط جزء قدیمی و بررسی درستی تست آن در طول آزمایش آزمایش می شود.

    جاسوس- این یک شی اضافی برای بازرسی متدها و پارامترهای فراخوانده شده است که در طول آزمایش به آنها ارسال می شود.

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

    ساختگی- این یک شی اضافی است، نشانه و انتقال هر گونه امضای مورد نیاز به روش یا هر قرارداد دیگری، اما معنای واقعی به هیچ وجه vikorystvayasya نیست.

    تفاوت بین Stub و Mock در نحوه تایید نتایج تست ربات نهفته است. در مورد Stub، در پایان تست وضعیت جسم بررسی می شود. در پایان آزمون آزمایشی، آزمایش تأیید می کند که شی به همان روشی که در هنگام ثبت نام توضیح داده شد، آزمایش می شود. جزئیات را می‌توان در یادداشت‌های Mocks Aren't Stubs اثر مارتین فاولر یافت، اما من فقط در اینجا به شما نشان می‌دهم.

    خرد مسخره کردن
    "test connect should start polling": function () ( this.client.url = "/my/url"; sinon.stub(ajax, "poll").returns()); this.client.connect(); sinon .assert.calledWith(ajax.poll, "/my/url");) "تست اتصال باید شروع به نظرسنجی کند": تابع () ( this.client.url = "/my/url"؛ var mock = sinon.mock(ajax) mock.expects("polll") .withArgs("/my/url ").returns(); this.client.connect(); mock.verify(); )

    توسعه رفتار محور

    یک رویکرد تکراری برای توسعه نرم‌افزار از طریق ویژگی‌های کاربردی، سبک آشنای توسعه از طریق آزمایش، نتیجه‌گرا است. فرآیند BDD دارای سه خط زیر است:

    کروک 1. اهمیت عملکرد بستگی به ماژولی دارد که در قالب آزمایش اجرا می شود.

    کروک 2. کدگذاری ماژول؛

    کروک 3. لطفاً توجه داشته باشید که کلیه وظایف یک معاون یا تحلیلگر تجاری () با تأیید نتایج آزمایشات در حال اجرا انجام می شود.

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

    چارچوبی برای تست واحد جاوا اسکریپت چیست؟

    یک ابزار کامل برای تست ماژولار و یکپارچه سازی جاوا اسکریپت از اجزای زیر تشکیل شده است:

    • کتابخانه ادعا (مجموعه ای از روش ها برای تأیید کیفیت یک جزء مانند آزمایش پوست)؛
    • کتابخانه ساختگی (ابزاری برای تولید اشیاء ساختگی و سایر موارد تکراری)؛
    • Test runner (ابزاری برای اجرای خودکار تست ها از طیف گسترده ای از مرورگرها، از جمله مرورگرهای iOS و Android)؛
    • بلوک اتصال به سیستم های یکپارچه سازی مداوم محبوب.

    استراتژی‌هایی برای تست واحد کد جاوا اسکریپت شما

    امروزه سه استراتژی برای تست واحد کد جاوا اسکریپت وجود دارد (گزارش در بخش سوم کتاب توسعه جاوا اسکریپت مبتنی بر تست توسط کریستین جوهانسن):

    • درون مرورگرآزمایش کردن؛
    • بی سرآزمایش کردن؛
    • تست دوز JsTestDriver.

    تست درون مرورگر راه‌اندازی همه ماژول‌ها و تست‌های یکپارچه‌سازی را از صفحه HTML منتقل می‌کند، که توسعه‌دهنده آن را به‌طور مستقل در مرورگرهای مورد نیاز باز می‌کند. این رویکرد ساده و به طور شهودی معقول است. با این حال، نقطه ضعف آن این است که توانایی گنجاندن چنین تست‌هایی را قبل از یکپارچگی مداوم ارائه نمی‌دهد. علاوه بر این، راه‌اندازی دستی یک صفحه HTML در ده مرورگر یا بیشتر و فشار دادن مداوم «F5» می‌تواند برای توسعه‌دهنده خسته‌کننده باشد.

    تست Headless به این معنی است که تمام کدهای جاوا اسکریپت بر روی یک شبیه ساز تست می شود که می تواند به زبان های جاوا، روبی، جاوا اسکریپت، سی پلاس پلاس و غیره نوشته شود. امروزه محبوب ترین شبیه ساز PhantomJS است که همان موتور است وب کیت، که از خط فرمان راه اندازی می شود. مزایای شبیه ساز شامل مواردی است که می تواند در یکپارچگی مداوم استفاده شود، و همچنین مواردی که به شما امکان می دهد راه اندازی تمام تست ها را از خط فرمان به طور خودکار انجام دهید. با این حال، این رویکرد دارای یک اشکال است - کد بر روی مرورگرهای واقعی آزمایش نمی شود، به این معنی که شما در خطر از دست دادن ترفندهای مرورگر هستید که در شبیه ساز اجرا نشده اند. قبل از ظهور JsTestDriver، اغلب می‌توانستید متوجه شوید که تست درون مرورگر با تست Headless ترکیب شده است که به طور معجزه آسایی به یکدیگر اضافه می‌شوند.

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

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

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

    2 رویکرد برای ایجاد سناریوهای آزمایشی وجود دارد:

    • جعبه سفیدآزمایش کردن- نوشتن تست ها بر اساس اجرای عملکرد است. توبتو. ما الگوریتم هایی را بررسی می کنیم که ماژول های ربات سیستم ما را کار می کنند. این رویکرد صحت سیستم رباتیک را تضمین نمی کند.
    • جعبه سیاهآزمایش کردن- ایجاد سناریوها بر اساس مشخصات و قابلیت های سیستم است. به این ترتیب می‌توانید صحت نتایج همه برنامه‌ها را تأیید کنید، اما چنین رویکردی به شما اجازه نمی‌دهد که خطاهای کوچک و نادری را پیدا کنید.

    چه چیزی را تست کنیم

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

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

    به این ترتیب، اگر vipravdana تست مدولار را انجام دهید، می توانید 3 نوع را فرموله کنید:

    1) اگر آزمایش ها این فرصت را می دهند که فواید را با وضوح بیشتری نشان دهند، نه لزوما جستجوی آنها.

    2) ساعت غذا را کاهش دهید

    3) اجازه آزمایش کدهایی که به طور مکرر تغییر می کنند را بدهید.

    سه جزء اصلی فرانت اند (HTML، CSS، جاوا اسکریپت) باید آزمایش شوند، شاید حتی کد جاوا اسکریپت. CSS به طور انحصاری با روش بصری بررسی می شود، زمانی که توسعه دهنده/تستر/بازبینی کننده به رابط گرافیکی در مرورگرهای مختلف نگاه می کند. نشانه گذاری HTML از این طریق تأیید می شود.

    یاک تستواتی

    در مورد سناریوهای آزمون روزانه، ردیابی با اصول زیر هدایت می شود:

    • پدرشوهرتان سعی می کنند تا حد امکان بخشنده باشند.سپس احتمال بیشتری وجود خواهد داشت که نتایج اجرای شما تحت تأثیر همان اشکالی باشد که سعی در تکرار آن دارید.
    • تست های ماژول های بزرگ را تجزیه کنید.بهتر است مکان خاص رحمت را بدانید.
    • تست ها را مستقل کنید.نتیجه یک آزمایش همیشه تابع نتایج آزمایشی دیگر نیست.
    • نتایج آزمایش ها ممکن است بسیار تکرارپذیر و سازگار باشد.مطمئناً اگر دوباره تست را اجرا کنید، نتیجه همان دفعه قبل خواهد بود.
    • به هر دلیلی، برنامه Wikonian می تواند اسکریپت های آزمایشی ایجاد کند.به این ترتیب متقاعد خواهید شد که اشکال اصلاح مؤثر در کوریستوواچ ها ظاهر نمی شود.

    چیم تستواتی

    برای تست واحد کد js تعدادی کتابخانه وجود دارد. شاید گسترده ترین آنها QUnit باشد. برای انجام تست‌های واحد با استفاده از کتابخانه، باید یک "sandbox" ایجاد کنیم - یک صفحه HTML ساده که شامل کتابخانه برای آزمایش، کدهایی است که باید آزمایش شود و خود آزمایش‌ها.

    توابع برای آزمایش:

    (function() window.stepen = function(int) (var result = 2; for (var i = 1; i)< int; i ++) { result = result * 2; } return result; } window.returnFunc = function() { return "ok"; } })();

    لیست تست ها:

    Test("stepen()"، function() ( برابر(stepen(2)، 4، "2^2 - متد برابر"); ok(stepen(3) === 8، "2^3 - روش ok" );deepEqual(stepen(5)، 32، "2^5 - روش deepEqual"); )); asyncTest("returnFunc()"، function() ( setTimeout(function() (qual(returnFunc()، "ok"، "Async Func Test"); start(); ), 1000); ));

    همانطور که می بینید، QUnit از 3 تابع برای یکسان سازی نتایج کد کامپایل شده پشتیبانی می کند:

    • خوب()– در صورتی که نتیجه = درست باشد، آزمون موفق تلقی می شود
    • برابر()- نتیجه را با پالایش برابر می کند
    • deepEqual()- نتیجه برابر با نتیجه است، بررسی نوع

    نتیجه Vikonanny:

    ظاهراً کتابخانه QUnit کد چندین مرورگر را همزمان آزمایش می کند.

    این به دلیل در دسترس بودن پایین کتابخانه های دیگر برای آزمون های واحد است. با این حال، مفهوم سناریوهای آزمایشی در آنها یکسان است، بنابراین هنگامی که یکی از آنها را پشت سر گذاشتید، نیازی به رفتن به سراغ سناریوهای دیگر ندارید.

    لطفا به یاد بیاور

    ویژگی خاص کد روزانه js ناهمزمانی بودن آن است. کتابخانه های تست توانایی اجرای تست های ناهمزمان را فراهم می کنند. برای مثال، اگر می‌خواهید به تابعی اعتراض کنید که مثلاً یک درخواست دریافت به باطن ارسال می‌کند و خروجی را برمی‌گرداند، برای انجام آزمایش‌ها باید جریان را با تابع stop() متوقف کنید، تابع را اجرا کنید. و در مورد آزمایش، و سپس راه اندازی مجدد جریان با استفاده از روش start()، "Wrapping Yogo" در setTimeout(). توبتو. شما مسئول قرار دادن هر دوره زمانی هستید که در آن دوره عملکرد تاج گذاری تکمیل می شود. لازم است در انتخاب بی اهمیت بودن این قسمت دقت شود زیرا... از یک طرف، ربات سعی کرد از روشی استفاده کند که ممکن است به عنوان یک ویژگی منجر به نیاز به اجرای خاصی از عملکرد گزارش و رفتار نادرست شود.

    تست افزونه های Backbone

    برای آزمایش عملی افزونه‌هایی که با استفاده از ویکی Backbone.js نوشته شده‌اند، توسط پروژه که در توضیح داده شده است، تسریع می‌یابد.

    از آزمون های واحد می توان برای تأیید استفاده کرد:

    • صحت ایجاد مدل ها و کنترلرها
    • صحت داده های مدل
    • روش های کنترل کننده های Vikonanny (به خاطر آنها می توانند نتیجه را معکوس کنند)
    • موفقیت یک پدیده جذاب

    کد تست:

    Test("Backbone.js"، function() (ok(نمونه، "بررسی فضای نام"); ok(sample.routers.app، "بررسی روتر")); ok(sample.core.pageManager.open("chat" ) , "تست باز کردن صفحه ( فراخوانی روش کنترلر)") ok(sample.core.state، "بررسی مدل")؛ ")؛ html(داده)، داده ها را برگرداند؛ )) ), "بررسی بارگیری الگو");

    نتیجه آزمایش رباتیک:

    اتوماسیون پرتاب های آزمایشی

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

    تست های QUnit در یک مرورگر اجرا می شوند. Phantomjs به ما کمک می کند تا از این ویژگی دور شویم - یک برنامه نرم افزاری که ربات مرورگر را شبیه سازی می کند. توسعه دهندگان phantomjs قبلاً یک اسکریپت برای تست‌های QUnit ارسال کرده‌اند و امکان پردازش کمی بیشتر برای کار صحیح وجود داشت.

    /** * وقوع تست مغزی درست است یا مهلت زمانی رخ می دهد. * مفید برای انتظار * در پاسخ سرور یا برای تغییر رابط کاربری (fadeIn و غیره) رخ دهد. * * @param testFx شرط جاوا اسکریپت که به یک بولی ارزیابی می شود، * می توان آن را به عنوان رشته ارسال کرد (به عنوان مثال: "1 == 1" یا * "$("#bar").is(":visible")" یا * به عنوان یک تابع پاسخ به تماس. (": قابل مشاهده")" یا * به عنوان یک تابع پاسخ به تماس. * @param timeOutMillis حداکثر مدت زمان انتظار. اگر * مشخص نشده باشد، 3 ثانیه استفاده می شود. = timeOutMillis ?timeOutMillis: 3001، //< Default Max Timout is 3s start = new Date().getTime(), condition = false, interval = setInterval(function() { if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { // If not time-out yet and condition not yet fulfilled condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code } else { if(!condition) { // If condition still not fulfilled // (timeout but condition is "false") console.log(""waitFor()" timeout"); phantom.exit(1); } else { // Condition fulfilled (timeout and/or condition is //"true") console.log(""waitFor()" finished in " + (new Date().getTime() - start) + "ms."); typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it"s supposed to do once the // condition is fulfilled clearInterval(interval); //< Stop this interval } } }, 100); // repeat check every 250ms }; }; if (phantom.args.length === 0 || phantom.args.length >2) console.log("Usage: run-qunit.js URL"); phantom.exit(); ) var page = new WebPage(); // مسیر "console.log()" را از داخل صفحه // به زمینه اصلی فانتوم (یعنی "این" فعلی) فراخوانی می کند page.onConsoleMessage = function(msg) ( console.log(msg); ); page.open(phantom.args, function(status)( if (وضعیت !== "موفقیت") (consol.log("عدم دسترسی به شبکه")؛ phantom.exit(); ) else (waterFor(function() ( بازگشت page.evaluate(function())( var el = document.getElementById("qunit-testresult")؛ if (el && el.innerText.match("کامل")) ( true; ) return false; )) ; ), function())( var wonNum = page.evaluate(function())( var el = document.getElementById("qunit-testresult"); console.log(el.innerText)؛ try ( document.getElementsByClassName( "شکست" ) ).innerHTML.length; ) catch (e) (بازگشت 0; ) return 10000; ));phantom.exit((parseInt(failedNum, 10) > 0) ? 1: 0);

    برای نمایش نتایج اسکریپت با تست در کنسول، باید تابع ورود به سیستم را اضافه کنید.

    تست برای آگاهی از موضوعات آینده اکنون در سایت موجود است: HTML, CSS, جاوا اسکریپت, PHP, SQL.

    آزمایش پوست بر اساس 10با آهنگ های آن ها تغذیه کنید. من سعی می کنم بر روی تغذیه پوست در پیچیده ترین زمینه های زبان خاص تمرکز کنم تا دانش فعلی شما را تا حد امکان دقیق تأیید کنم.

    دیوانه، همه بدون خمیرو هر کسی می تواند از آنها عبور کند.

    روش تست:

    1. دستورالعمل را دنبال کن آزمایش را چاپ کنیدمطابق با آزمون
    2. با روشن شدن می بینید که برق روشن می شود متحدگزینه صحیح
    3. پس از اتمام آزمون، اطلاعات بیشتری کسب خواهید کرد توپ خودت, تعداد مزایا، همچنین تجزیه و تحلیل تغذیه پوستاز آزمون.

    توجه!هیچ راهی برای چرخیدن قبل از اولین وعده غذایی وجود ندارد، پس اول از همه فکر کنید.

    آزمایشات در حال حاضر موجود است

    1. HTML

      • Usyogo آزمون را با موفقیت پشت سر گذاشت: 75424 نفر
      • میانگین امتیاز: امتیاز 2.83 از 5بالیو

      تست دانش پایه HTML. شما باید اصول اولیه را بدانید تگ های HTMLو به طور صحیح تر به آنها vikoristannya را بگویید. همچنین درک ویژگی های استاندارد ضروری است XHTML 1.1.

    2. CSS

      • Usyogo آزمون را با موفقیت پشت سر گذاشت: 32828 osib
      • میانگین امتیاز: امتیاز 3.37 از 5بالیو

      این آزمون دانش را از پایه تأیید می کند CSS. برای گذراندن موفقیت آمیز آزمون، باید انواع اصلی انتخابگرها (سینتکس آنها) را بشناسید، قدرت های اصلی و معانی احتمالی آنها را بشناسید و همچنین معانی محبوب ترین شبه عناصر را بدانید.

    3. جاوا اسکریپت

      • Usyogo آزمون را با موفقیت پشت سر گذاشت: 24845 os_b
      • میانگین امتیاز: امتیاز 3.31 از 5بالیو

      این آزمون دانش شما را از جاوا اسکریپت آزمایش می کند. غذای حاصل از خمیر به کره های مختلف شیر انباشته می چسبد. غذای زیادی برای درک تفاوت های ظریف "متفاوت" وجود دارد. در غیر این صورت، باید اصول اولیه را بدانید: نحوه کار، عملکردهای اساسی جاوا اسکریپت، اولویت های عملیات و غیره.

    4. PHP

      • Usyogo آزمون را با موفقیت پشت سر گذاشت: 33239 osib
      • میانگین امتیاز: 3.03 از 5بالیو

      این آزمون دانش شما از زبان PHP را بررسی می کند. شما باید ساختارهای اولیه PHP، کار با تغییرات، جلسات، اجرای تغییر مسیر و سایر گفتارهای استاندارد را بدانید.
      Perekonlive prohannya:این آزمون سوالات زیادی در مورد فیلمنامه دارد: "فیلمنامه را چه می بینید؟" عالی است، نیازی به کپی کردن یا تأیید آن نیست. با خودت صادق باش.

    5. SQL

      • Usyogo آزمون را با موفقیت پشت سر گذاشت: 18014 osib
      • میانگین امتیاز: امتیاز 3.28 از 5بالیو

      این تست دانش شما را از پرس و جوهای SQL تأیید می کند. غذا با دانش اولیه این زبان و بدون ضرر مصرف می شود. شما به پیشرفته ترین پرس و جوهای SQL و همچنین استفاده صحیح از آنها نیاز دارید.

    به عنوان مثال یک ماشین حساب ساده در Node.js. ما در حال آزمایش چارچوب اضافی Mocha هستیم.

    آنچه برنامه ما می تواند در نظر بگیرد:

    • جمع، تفریق، تقسیم و ضرب، مانند دو عدد.
    • اگر شماره جداگانه وارد شده بود پیشرفت را نشان دهید و کار را کامل کنید.
    • همچنین یک رابط خط فرمان وجود دارد تا کاربر نهایی بتواند به سرعت به برنامه دسترسی پیدا کند.

    چه چیزی نیاز داریم:

    • Node.js و npm؛
    • دانش جاوا اسکریپت: ساختار دستوری و کد، انواع داده ها، عملیات ریاضی و عبارات ذهنی.

    پس از مرتب کردن اهداف، می توانید به راه اندازی یک رسانه برای آزمایش و توسعه ادامه دهید.

    از چهارشنبه شروع می کنیم

    از آنجایی که ما از Node.js استفاده می کنیم، باید مرجع محلی برای فایل ها و سپرده ها ایجاد کنیم.

    یک پوشه جدید بسازید کالک. در خط فرمان به این دایرکتوری رفته و با استفاده از دستور npm init یک پروژه جدید ایجاد کنید تا یک فایل جدید بسازید package.jsonبرای برنامه ما

    از شما خواسته می شود نام بسته، نسخه، توضیحات و سایر اطلاعات مربوط به بسته را وارد کنید. می توانید نام خود را وارد کنید calc.jsو سپس فشار دهید واردبرای nadannya برای zamovchuvannyam مهم است. وقتی به دستور تست رسیدید، موکا را وارد کنید - این چارچوب آزمایشی است که ما برنده خواهیم شد:

    دستور تست: موکا

    پس از وارد کردن تمام اطلاعات، اسکریپت یک فایل ایجاد می کند package.json، که چیزی شبیه به این است:

    ( "name": "calc.js"، "نسخه": "1.0.0"، "description": "یک ماشین حساب ساده در Node.js"، "main": "index.js"، "scripts": ( "تست": "موکا")، "نویسنده": ""، "مجوز": "ISC")

    آخرین مرحله در این مرحله نصب موکا است. دستور نصب را وارد کنید:

    Npm نصب --save-dev mocha

    پس از خروج از این دستور، پوشه ظاهر می شود node_modules، فایل package-lock.json، و فایل package.jsonردیف های بعدی ظاهر می شوند:

    "devDependencies": ("mocha": "^4.0.1")

    فایل ایجاد کنید test.js. ما به سرعت از ماژول Node.js استفاده می کنیم ادعا کردن، برای بررسی درست یا واقعی بودن تراز. بنابراین، به طور صحیح تر، آزمون را می توان با موفقیت پشت سر گذاشت:

    Const assert = require("اظهار"); it("may turn true", () => ( assert.equal(true, true); ));

    اکنون تست را از خط فرمان اجرا کنید:

    $ npm test > موکا ✓ ممکن است 1 عبور درست بچرخد (8 میلی ثانیه)

    ازمایش گذشت و به محض اینکه به خود آمد تعدیل وسط تمام شد. حذف از test.jsهمه چیز به جز ردیف const assert = require ("assert"); .

    ما خواهد شد vikorystuvati فایل test.jsبا گسترش این فرآیند، ایجاد برنامه ها. دو فایل دیگر ایجاد کنید: Operations.jsبرای توابع حسابی و اعتبارسنجی calc.jsبرای خود برنامه ما در Vikorist فایل های زیادی داریم که بوی بد زیاد طولانی و پیچیده نمی شود. لیست فعلی فایل های ما این است:

    • calc.js;
    • node_modules;
    • Operations.js;
    • package-lock.json;
    • package.json;
    • test.js;

    بیایید اولین تست مفید را برای برنامه خود اضافه کنیم.

    اضافه کردن عملیات ریاضی

    اول از همه، برنامه ما باید هر دو عدد را جمع، تفریق، تقسیم و ضرب کند. همچنین با این عمل ها می توانیم عملکرد پوستی ایجاد کنیم.

    تقریباً تا شده است. بیایید یک تست بنویسیم تا ببینیم کدام یک می تواند مجموع دو عدد را به وضوح پیدا کند. در کد زیر تأیید می کنیم که مجموع نسبی 1 و 3 پشت تابع اضافی add() 4 قرار دارند:

    Const assert = require("اظهار"); it("مجموع 1 و 3 را به درستی بدانید"، () => ( assert.equal(add(1, 3), 4); ));

    پس از اجرای تست با استفاده از دستور npm test، از موارد زیر استفاده می کنیم:

    > موکا 0 گذراندن (9 میلی ثانیه) 1 ناموفق 1) به درستی مجموع 1 و 3 را بدانید: خطای مرجع: افزودن در Context.it تعریف نشده است (test.js:5:16) npm ERR! تست ناموفق بود. از جزئیات بیشتر شگفت زده شوید.

    تست با اعلان ها انجام نشد ReferenceError: add تعریف نشده است. ما در حال آزمایش تابع add() هستیم که هنوز در دسترس نیست، بنابراین این نتیجه کاملاً واضح است.

    ما می توانیم از تابع add() در یک فایل استفاده کنیم Operations.js:

    Const add = (x, y) => (+x) + (+y);

    این تابع دو آرگومان x و y را می گیرد و مجموع آنها را می چرخاند. شاید متوجه شده باشید که ما (+x) + (+y) را می نویسیم و نه x + y. ما از یک عملگر unary منحصر به فرد برای کاهش یک آرگومان به یک عدد استفاده می کنیم، فقط به این دلیل که در یک ردیف معرفی می شود.

    توجه: تابع پیکان ES6 و چرخش ضمنی در اینجا اضافه شده است.

    از آنجایی که ما از Node.js استفاده می کنیم و کد را به فایل های تکی تقسیم می کنیم، باید به سرعت module.exports را برای صادرات کد اجرا کنیم:

    Const add = (x, y) => (+x) + (+y); module.exports = (افزودن)

    روی فایل cob test.jsما کد را از آن وارد می کنیم Operations.jsنیاز() برای کمک. از آنجایی که ما از تابع سفارشی از طریق جایگزینی عملیات استفاده می کنیم، باید add() را به operations.add() تغییر دهیم:

    عملیات Const = require("./operations.js"); const assert = require("اظهار"); it("مجموع 1 و 3 را به درستی بدانید"، () => ( assert.equal(operations.add(1, 3), 4); ));

    بیایید تست را اجرا کنیم:

    $ npm test > موکا ✓ به درستی از مجموع 1 و 3 1 عبور (8ms) مطلع شوید

    اکنون تابعی داریم که اجرا می شود و تست ها با موفقیت سپری می شوند. برخی از توابع سایر عملیات به روشی مشابه عمل می کنند، افزودن تست برای subtract() , multiply() و divide() دشوار نیست:

    It("به درستی مجموع 1 و 3 را بدانید"، () => ( assert.equal(operations.add(1, 3), 4); )); it("مقدار -1 و -1 را به درستی بدانید"، () => ( assert.equal(operations.add(-1, -1), -2); )); it("به درستی تفاوت بین 33 و 3 را بدانید"، () => ( assert.equal(operations.subtract(33, 3), 30); )); it("tvir 12 and 12 را به درستی بدانید"، () => ( assert.equal(operations.multiply(12, 12), 144); )); it("دانستن خصوصی 10 و 2 صحیح است"، () => ( assert.equal(operations.divide(10, 2), 5); ));

    اکنون می توانیم همه توابع را ایجاد و صادر کنیم test.js:

    Const add = (x, y) => (+x) + (+y); const subtract = (x, y) => (+x) - (+y); const multiply = (x, y) => (+x) * (+y); const divide = (x, y) => (+x) / (+y); module.exports = (جمع، تفریق، ضرب، تقسیم، )

    بیایید تست های جدید را راه اندازی کنیم:

    $ npm test > mocha ✓ به درستی مقدار 1 و 3 را به درستی بدانید ✓ به درستی مقدار -1 و -1 را بدانید ✓ به درستی تفاوت 33 و 3 را بدانید ✓ به درستی بدانید مجموع 12 و 12 ✓ به درستی بدانید 10 خصوصی و 2 5 پاس کردن ( 8 میلی‌ثانیه)

    همه تست ها با موفقیت سپری می شوند، بنابراین اکنون می توانیم مطمئن شویم که عملکردهای اصلی برنامه ما به درستی کار می کنند. اکنون می توانید اعتبار سنجی اضافی را انجام دهید.

    افزودن اعتبارسنجی

    در حال حاضر وقتی کاربر شماره ای را وارد می کند و عملیات مورد نیاز را انتخاب می کند، همه چیز به خوبی کار می کند. با این حال، تلاش برای یافتن مجموع اعداد در آن ردیف چه فایده ای دارد؟ برنامه سعی می کند عملکرد را بررسی کند، اما از طریق کسانی که اعداد را بررسی می کنند، معلوم می شود که NaN است.

    به جای معکوس کردن برخی از مقادیر نامفهوم، زمان نتیجه گیری کار دیگری فرا رسیده است - به گونه ای کار کنید که جمع پیشرفت ها را نشان دهد و کار خود را کامل کند، زیرا معرفی یک استدلال یک عدد نیست.

    ابتدا باید تابعی بنویسید که وقتی با شماره شماره وارد شود قابل تأیید باشد. جمع فقط می تواند با اعداد کار کند، بنابراین ما با سه وضعیت روبرو هستیم:

    1. تخلف معرفی شده - اعداد.
    2. یک ورودی یک عدد و دیگری یک ردیف است.
    3. جرم معرفی شد - ردیف.
    it("در صورت تغییر شماره در مورد لغو اطلاع می دهد"، () => ( assert.equal(operations.validateNumbers("sammy", 5), false); )); it("هنگامی که دو ردیف از اعداد جایگزین می شوند در مورد لغو اطلاع می دهد" () => ( assert.equal(operations.validateNumbers("sammy", "sammy"), false); )); it("موفقیت زمانی که دو عدد متفاوت هستند"، () => ( assert.equal(operations.validateNumbers(5, 5)، true); ));

    تابع ()validateNumbers پارامترها را تایید می کند. تابع isNaN() بررسی می‌کند که آیا پارامتر عددی نیست یا خیر، و false را برمی‌گرداند. در غیر این صورت، درست می شود، که به معنای تأیید موفقیت آمیز است.

    Const validateNumbers = (x, y) => ( if (isNaN(x) && isNaN(y)) ( return false; ) true; )

    فراموش نکنید که validateNumbers را در انتهای فایل به module.exports اضافه کنید. اکنون می توانید تست های جدید را اجرا کنید:

    تست $ npm 1) در مورد ضرر وقتی یک ردیف جانشین است، جایگزین یک عدد ✓ در مورد ضرر وقتی دو ردیف جانشین هستند، جایگزین یک عدد ✓ موفقیت زمانی که دو عدد جانشین هستند، 7 عبور می کنند (12 میلی ثانیه) 1 شکست می خورند 1) در مورد باخت اطلاع می دهد. یک شکست زمانی که ردیف vikoristanny به جای عدد: AssertionError : true == false + انتظار می رود - واقعی -true + false

    دو آزمون قبول شد، اما یکی شکست خورد. چک وارد کردن دو عدد و همچنین بررسی وارد کردن دو ردیف با موفقیت انجام شد. در مورد بررسی ردیف و شماره وارد شده چه چیزی نمی توان گفت.

    اگر دوباره به عملکرد ما نگاه کنید، متوجه خواهید شد توهین شدهپارامتر باید روی NaN تنظیم شود تا تابع روی false تنظیم شود. اگر بخواهیم به همان اثر برسیم، اگر بخواهیم یکی از پارامترها با NaN یکسان باشد، باید && را با || جایگزین کنیم. :

    Const validateNumbers = (x, y) => ( if (isNaN(x) || isNaN(y)) ( return false; ) true; )

    اگر بعد از این تغییرات دوباره تست npm را اجرا کنید، تمام تست ها با موفقیت پشت سر خواهند گذاشت:

    ✓ در مورد باخت وقتی یک ردیف جانشین است، جایگزین کردن یک عدد ✓ در مورد ضرر وقتی دو ردیف جانشین هستند، جایگزین یک عدد می‌شود. ✓ موفقیت زمانی که دو عدد جانشین هستند 8 عبور (9 میلی‌ثانیه)

    ما به کل عملکرد برنامه خود اعتراض کردیم. توابع با موفقیت عملیات ریاضی را می سازند و ورودی را تأیید می کنند. مرحله آخر ایجاد رابط کاربری است.

    ما رابط را ایجاد می کنیم

    ما قبلاً توابع مورد نیاز را داریم، اما هنوز نمی توانیم به سرعت از آنها استفاده کنیم. به همین دلیل است که ما به یک رابط نیاز داریم. برای برنامه ما می توانیم یک رابط خط فرمان ایجاد کنیم.

    در حال حاضر فایل calc.jsممکن است خالی باشد این جایی است که برنامه ما ذخیره می شود. امروزه شما نیاز به وارد کردن توابع از Operations.js:

    عملیات Const = require("./operations.js");

    خود اینترفیس با ماژول Readline CLI در Node.js بسیار سازگار است:

    Const readline = require("readline");

    پس از وارد کردن هر چیزی که نیاز دارید، می توانید شروع به ایجاد برنامه کنید. برای ایجاد یک رابط، از Readline استفاده می کنیم که از طریق تغییر rl قابل دسترسی است:

    Const rl = readline.createInterface(( ورودی: process.stdin, output: process.stdout ));

    ابتدا اینکه کاربر پس از شروع برنامه مسئولیت دانلود نرم افزار را بر عهده دارد، لطفا دستورالعمل های دقیق را مطالعه کرده و دستورالعمل ها را با دقت دنبال کنید. console.log() برای چه منظوری است:

    Console.log.

    بیایید ابتدا نگاهی به خود توابع ماشین حساب بیندازیم، بیایید بررسی کنیم که console.log() در صورت لزوم چه کاری انجام می دهد. این کار را انجام می دهیم تا برنامه یک اعلان نمایش دهد و کار را کامل کند. برای این منظور، به عنوان مثال، یک فراخوانی به متد ()rl.close اضافه کنید.

    برای اجرای برنامه نود و نام فایل را وارد کنید:

    $ node calc.js Calc.js شما یک ماشین حساب در Node.js راه اندازی کرده اید! نسخه: 1.0.0. Vikoristannya: خریدار باید دو عدد را وارد کند و سپس انتخاب کند که از آنها چه چیزی کسب کند.

    این برنامه اطلاعات دقیق را نمایش می دهد و کار خود را کامل می کند. حال لازم است مقدمه کوریستوواچ را اضافه کنیم. به عنوان یک خبرنگار، باید قدم بردارید: دو عدد و یک عملیات را انتخاب کنید. تزریق پوست با استفاده از روش rl.question() پرس و جو می شود:

    Rl.question("اولین عدد را وارد کنید: ", (x) => ( rl.question("عدد دیگری را وارد کنید: ", (y) => ( rl.question(` یکی از عملیات بعدی را انتخاب کنید) جمع (+ ) جمع ) (-) ضرب (*) زیر (/) انتخاب شما: `, (انتخاب) => ( // کد rl.close(); )); )); ))؛

    متغیر x اولین عدد، y عدد دیگر و انتخاب عملیات انجام شده است. اکنون برنامه ما ورودی را می خواهد، اما با داده های حذف شده کاری انجام نمی شود.

    پس از ورود سوم، باید بررسی کنید که فقط همان اعداد وارد شده است. برای این منظور، تابع quick () validateNumbers است. با کمک اپراتور بررسی می کنیم که آیا اعداد وارد شده اند یا خیر، ربات را با برنامه کامل می کنیم:

    اگر (!operations.validateNumbers(x, y)) ( console.log ("شما می توانید فقط اعداد را وارد کنید! لطفاً برنامه را مجدداً راه اندازی کنید.")

    اگر همه چیز به درستی وارد شده باشد، اکنون باید همان روش عملیاتی را که قبلا ایجاد شده بود اجرا کنید. برای پردازش چهار گزینه انتخاب ممکن، به سرعت از عبارت switch استفاده می کنیم و نتیجه عملیات را نمایش می دهیم. اگر عملیات غیر ضروری انتخاب شود، بلوک پیش فرض نمایش داده می شود که نیاز به تکرار آزمایش را به کاربران اطلاع می دهد:

    If (!operations.validateNumbers(x, y)) ( console.log ("شما می توانید فقط اعداد را وارد کنید! لطفاً برنامه را مجددا راه اندازی کنید.")؛ else (سوئیچ (انتخاب) ( مورد "1": console.log(` مقدار $(x) و $(y) $(operations.add(x, y)) بیشتر.`)، break، case "2": console.log(`Amount $(x) و $(y) $ بیشتر (operatives.subtract(x, y)).`؛ break؛ case "4": console.log('Private $(x) and $(y) dora $(operations.divide(x, y)).` )؛ شکستن؛ برنامه را مجدداً راه اندازی کنید و یک عدد از 1 تا 4 را انتخاب کنید.»؛ شکست؛ ) )

    توجه: توابع console.log() دارای ردیف های قالب هستند که عبارات مختلفی را امکان پذیر می کنند.

    /** * یک ماشین حساب ساده در Node.js، مانند برنامه ماشین حساب vikory که از * رابط خط فرمان Readline استفاده می کند. */ عملیات const = require("./operations.js"); const readline = require("readline"); // خط خواندن Vikorist برای ایجاد یک رابط const rl = readline.createInterface((ورودی: process.stdin، خروجی: process.stdout)); console.log(` Calc.js شما یک ماشین حساب در Node.js راه اندازی کرده اید! نسخه: 1.0.0. Vikoristannya: کاربر باید دو عدد را وارد کند، و سپس انتخاب کند که چه چیزی از آنها کسب کند. `); rl.question("اولین عدد را وارد کنید: ", (x) => ( rl.question("عدد دیگری را وارد کنید: ", (y) => ( rl.question(` یکی از عملیات بعدی را انتخاب کنید) جمع (+ ) جمع ) (-) ضرب (*) فرعی (/) انتخاب شما: `, (انتخاب) => (اگر (!operations.validateNumbers(x, y)) ( console.log("شما فقط می توانید اعداد را وارد کنید! لطفا ، برنامه را مجدداً راه اندازی کنید). `؛ break؛ case "2": console.log(`تفاوت $(x) و $(y) بیشتر از $(operations.subtract(x, y)) است.`)؛ x) و $(y ) one $(عملیات. ضرب (x, y)).`), break; divide(x, y)).`); break; ;));

    اکنون برنامه ما آماده است. بیایید این ربات را برای بقیه بررسی کنیم. 999 و 1 را وارد کرده و عملیات را انتخاب کنید:

    $ node calc.js اولین عدد را وارد کنید: 999 عدد دیگری را وارد کنید: 1 انتخاب شما: 2 تفاوت 999 و 1 برابر با 998 است.

    این برنامه با موفقیت کار خود را به پایان رساند و نتیجه صحیح را ایجاد کرد. خوب، شما یک ماشین حساب ساده با استفاده از Node.js نوشتید و اصول اولیه توسعه TDD را یاد گرفتید.