تست و دیباگ در جاوا اسکریپت
یکی از مهمترین قسمتهای طراحی فاز test و debug است. اینکه روند اصلی کد در همه جا درست اجرا می شود؟ اینکه کلاً منطقی کد درستی نوشته اید؟ البته خیلی از javascript developer ها اینکار را نمیکنند و کار را خلاصه به console میکنند ولی آیا روش درستیست؟ نمیشود مطلقاً به این کار خرده گرفت ولی در نظر گرفتن چند نکته ضروریست
کدی که قابلیت test دارد با کد معمولی متفاوت است. برای اینکه قابل تست باشید تا جای ممکن نباید چیز جدید در end method ها استفاده کنید و همه چیز را از کسی که شما را call کردهاید بگیرید ولی معمولاً کد ها اینگونه نیست برای همین هنگام debug کردن اینکه کار کجا خراب شده است سختر می شود.
Unit Test
کتابخانههای زیادی برای طراحی unit test وجود دارد. شما با mock کردن قسمتهای خارجی میتوانید فقط یک function را تست کنید. البته اگر انتظارات زیادی نداشته باشید در level های خیلی ساده میتوانید خودتان یک سیستم بسازید
Assertions
شما با این روش میتوانید مطمئن شوید چیزی که نوشتید واقعاً همین نتیجه را دارد؟
var assert = function(value, msg) { if ( !value ) throw(msg || (value + " does not equal true")); };
به راحتی یک ابزار assert ساختیم و با استفاده از این میتوانید چک کنید واقعاً دو چیز برابر است یا وجود دارد؟
نمونهای از ابزار های موجود
- QUnit -> http://qunitjs.com/
- WebReflection/wru -> https://github.com/WebReflection/wru
- madrobby/Evidence -> https://github.com/madrobby/evidence
- One-com/one-validation -> https://github.com/One-com/one-validation
- jasmine .js -> http://pivotal.github.com/jasmine/
- YUI 2: YUI Test -> http://developer.yahoo.com/yui/yuitest/
- Home — Scriptaculous Documentation -> http://madrobby.github.com/scriptaculous/
- FireUnit: Firebug Unit Testing for Firefox -> http://fireunit.org/
- js-test-driver - Remote javascript console - Google Project Hosting -> http://code.google.com/p/js-test-driver/
- Sinon.JS - Versatile standalone test spies, stubs and mocks for JavaScript -> http://sinonjs.org/
- Welcome! Buster.JS is... -> http://busterjs.org/
- jquery/testswarm -> https://github.com/jquery/testswarm/
این کتابخانه بیشتر ابزار ها مثل mock و assert و … را دارند.
به طور مثال شما در کتابخانه jasmine اینگونه می تونید assert داشته باشید
describe("A suite", function() { it("contains spec with an expectation", function() { expect(true).toBe(true); }); });
Debuging
برای debug هم ابزار های مهمی وجود دارد که شما با استفاده از آنها میتوانید راحتتر debug کنید
یکی از مهمترین این ابزار ها firebug است. شما با استفاده از console که در javascript در هنگام باز بودن firebug دارید میتوانید همه چیز را log کنید.
شما دستورات زیر را دارید.
// show your code with variable console.log("The %s jumped over %d tall buildings", animal, count); console.warn("test") console.info("test") console.debug("test") console.error("test")
همچنین اعمالی چون profiling و … یا ایجاد break point را میتوانید انجام دهید. همچنین استفاده از console ضروریست.
در کل برای استفاده از firebug حتماً راهنمایش باید مطالعه شود تا استفاده مفید تری داشته باشید.
استفاده از ابزارهای دیگر هم مفید است مثل
debug-js - The JavaScript debugger in JavaScript. - Google Project Hosting -> http://code.google.com/p/debug-js/
همچنین ببینید:
- JavaScript debugging for beginners | Tutorial | .net magazine -> http://www.netmagazine.com/tutorials/javascript-debugging-beginners
- How to debug JavaScript in Internet Explorer | Bernie Sumption :: Software -> http://berniesumption.com/software/how-to-debug-javascript-in-internet-explorer/
- A List Apart: Articles: Advanced Debugging With JavaScript -> http://www.alistapart.com/articles/advanced-debugging-with-javascript/
- Introduction To JavaScript Unit Testing | Smashing Coding -> http://coding.smashingmagazine.com/2012/06/27/introduction-to-javascript-unit-testing/
- jquery - Javascript Unit-testing? - Stack Overflow -> http://stackoverflow.com/questions/32809/javascript-unit-testing
- Tools to unit test your JavaScript -> http://www.ibm.com/developerworks/library/wa-tools/
- Efficient JavaScript unit testing -> http://www.ibm.com/developerworks/java/library/os-jstesting/index.html
- Test-Driven JavaScript Development in Practice | Nettuts+ -> http://net.tutsplus.com/tutorials/javascript-ajax/test-driven-javascript-development-in-practice/