۸ ابزاری که هر توسعهدهنده جاوا باید بشناسد و دوست داشته باشد
تیم Stormpath از ۸ ابزار برای کارهای روزمره خود با SDK جاوا استفاده میکند. لیست کامل این ابزارها را در ادامه معرفی میکنیم.
همانطور که هر هنرمند هم میداند داشتن استعداد کافی نیست، شما نیاز به ابزارهای مناسب برای کار دارید. مهندسی تنها یک علم نیست، یک هنر هم هست پس همانطور که ما بیشک استعداد کافی داریم (:دی) همواره به دنبال ابزارهایی که به بهترین نحو نیازهای ما را برآورده میکنند نیز هستیم.
۱. Groovy
به جای نوشتن تستها در جاوا، ما اینکار را با Groovy انجام میدهیم. چرا که این ابزار همه قابلیتهای زیر را به رایگان در اختیار ما قرار میدهد:
- Relaxed Java-like syntax:
این سینتکس جاوا است اما با قواعد کمتری. برای مثال semicolon، نوع متغیرها و access modifierها همگی اختیاری هستند.این آخری برای تست بسیار به درد بخور است. چرا که تست شما میتواند بخواند و وضعیت داخلی کلاس را اظهار نماید بدون اینکه تست شود. برای مثال فرض کنید کلاس زیر را دارید:
public class Foo { private String bar = null; public void setBar(String bar) { this.bar = bar; } }
اگر بخواهید setBar(String) را تست کنید آیا تابع به درستی کار میکند(به این معنی که مقدار متغیر private به نام bar به درستی تغییر میکند) به سادگی میتوانید اینکار را با خواندن مقدار متغیرها با Groovy انجام دهید. جاوا اجازه چنین کاری به شما نمیدهد. (حداقل بدون استفاده از Reflection)
@Test public void test() { def foo = new Foo() foo.setBar("hello") Assert.isTrue(foo.bar.equals("hello")) //groovy allows us to access the private property called bar }
- power assertions
ابزار Groovy یک نوع قدرتمند از assert را فراهم میآورد که به عنوان power assertion statement شناخته میشود. این قابلیت ابزار Groovy از نمونه جاوای آن بسیار خواناتر است.
Assert.isTrue(foo.bar.equals("hello"))
میتواند به این ترجمه شود.
assert foo.bar == "hello"
وقتی assertion با شکست روبرو شود یک توصیف واضح از چیزی که رخ میدهد را نشان میدهد:
assert foo.bar == "goodbye" | | | | | false | hello Foo@12f41634
- Mocking
وقتی از جاوا استفاده میکنید، چارچوبهای dynamic mocking مثل EasyMock، PowerMock و Mockito بسیار محبوب است. همه این چارچوبها میتوانند به سادگی با Groovy استفاده شوند.
۲. Rest-Asssured
backend ما در این شرکت یک سرویس REST API برای ساخت و مدیریت حسابهای کاربری را فراهم میکند. SDK جاوا ما یکی از چندین SDK متفاوتی است که مدل سمت کلاینت مختص زبان را برای سادگی تعاملات فراهم میکند. بعضی از این SDKها نیز یک لایه وب برای تعامل با backend بدون نیاز به نوشتن کد دارند.
برای تضمین قابلیت همکاری بین همه این چارچوبها، لازم است همگی دقیقا یکسان رفتار کنند. بنابراین مجموعهای از تستهای یکپارچه سازی مبتنی بر HTTP نوشته شدند که هر چارچوب باید آنها را بگذراند. این پروژه توسط همه مهندسین SDK انجام میشود و همه آنها به یک زبان مسلط نیستند. بنابراین لازم است از ابزارهای تست مستقل از زبان استفاده کنیم. دراینجاست که Rest-assured نجات دهنده است.
Rest-assured یک DSL ساده جاوا برای تست سرویسهای REST است. نه تنها استفاده از آن حتی برای توسعهدهندگانی که هیچ وقت از جاوا استفاده نکردهاند، بسیار ساده است بلکه خیلی هم قدرتمند است.
برای مثال بیایید ببینیم چقدر ساده میتوانیم اعتبارسنجی کنیم که “ یک Post به لاگین با اطلاعات معتبر بایستی کد وضعیت ۳۰۲ را برگرداند.”
given() .accept(ContentType.HTML) .formParam("login", account.username) .formParam("password", account.password) .when() .post(LoginRoute) .then() .statusCode(302)
۳. cargo plugin
برای اینکه SDK جاوا توسط TCK اعتبارسنجی شود، لازم است که یکی از مثالهای وب آغاز شود تا این تستها بتوانند روی آن اجرا شوند. در واقع برای اینکه این اعتبارسنجی به طور اتوماتیک با هر build اجرا شود ابزار Cargo Plugin کمک کننده است.
Cargo یک wrapper برای اجرای انواع مختلفی از containerها به شکل استاندارد است. با استفاده از Cargo ما قادر بودیم مثالهای خود را روی Servlet Containerهای مختلف مانند Jetty و Tomcat بدون دردسر اجرا کنیم. ما به سادگی Cargo Maven2 plugin را در فایلهای pom خود تنظیم کردیم تا یک Servlet Container آغاز شود و War فایلهایی که اخیرا build شدند را در حین تست یکپارچهسازی به کارگیرد. شما میتوانید تنظیمات کار را در مثال Servlet Plugin مشاهده کنید.
۴. Git
چه میتوان در مورد Git گفت که شما ندانید؟ برای یک نگاه عمیق به مزایای گیت میتوانید صفحه درباره ما آنها را مطالعه کنید.
تیم SDK جاوا ما در اطراف جهان گسترده شده اند و اغلب کنار یکدیگر نیستند. Git از هر قطعه کدی که مینویسیم محافظت میکند. اینجا چند دستوری که در صرفهجویی زمان به ما کمک کردند را آوردیم:
git mv –force foo.java Foo.java : برای فایل سیستمهایی که این ویژگی را دارند که اسمشان حساس به کوچک بزرگی نیست، تغییر این ویژگی میتواند مشکلزا باشد. این دستور گیت را آگاه میکند که فایل foo.java به Foo.java تغییر اسم مییابد.
git diff-tree –no-commit-id –name-only -r <commit_ID> : مشاهده تمام فایلهایی که در کامیت <commit_ID> تغییر کردهاند.
git diff –name-only SHA1 SHA2: تمام فایلهایی که بین SHA1 و SHA2 تغییر کردهاند را لیست میکند.
جستجو به دنبال یک رشته در کل تاریخچه یک فایل:
یک فایل به اسم search.sh بسازید و این کد را آنجا پیست کنید.
git rev-list --all $2 | ( while read revision; do git grep -F $1 $revision $2 done )
سپس این دستور به این شکل قابل اجراست:
sh ./search.sh string_to_search file_where_to_search
۵. GitHub
گیتهاب نه تنها یک هاست رایگان برای پروژه گیت ما در اختیار قرار میدهد بلکه مزیت بسیار مهم ارائه کد منبع برای مشاهده جهانیان را در بر دارد. این مساله دیگران را تشویق به استفاده از آن، تعامل با ما و مشارکت در بهبود کد میکند که ارتقا پیوسته کد و گسترش دانش تکنیکی ما را در بر دارد.
به علاوه گیتهاب اجازه میدهد issueها را دنبال کنیم. مشتریان میتوانند ویژگیهای مورد نیاز یا خطاهایی که با آن روبرو میشوند را آنجا ثبت کنند و از جریان پیشرفت کار اطلاع داشته باشند.
۶. Maven
این ابزار به اندازه کافی مشهور هست پس خیلی توضیح نمیدهیم. اما تعدادی نکته مفید برای استفاده بهتر از Maven مطرح میکنیم:
- تحکیم وابستگیها: در یک پروژه چند ماژولی شما لازم است هر وابستگی را دقیقا در ریشه pom.xml در تگ <dependencyManagement> تعریف کنید. به محض اینکه اینکار را بکنید، همه زیر ماژولها میتواند به وابستگیها بدون مشخص کردن نسخهها وابسته باشد. با این راه مدیریت وابستگیها (برای مثال به روز رسانی نسخهها) در یک محیط متمرکز انجام میگیرد و همه زیر ماژولها میتواند تغییرات را در برداشته باشند. برای مثال ریشه pom.xml:
<dependencyManagement> <dependencies> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt.version}</version> </dependency> ... <dependencies> <dependencyManagement>
زیر ماژولهای pom.xml
<dependencies> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <!-- note that no version has been specified --> </dependency> ... <dependencies>
- جلوگیری از به کارگیری زیر ماژولها:
در حین زمان انتشار ما میخواهیم تمام زیر ماژولها منتشر شوند، اما چگونه میتوانیم مانع از انتشار یک زیر ماژول شویم؟ به سادگی، تنها کد زیر را در فایل pom برای ماژولی که نمیخواهید منتشر شود وارد کنید.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.7</version> <configuration> <skip>true</skip> <!-- this this the important line --> </configuration> </plugin>
- اجتناب از تست یکپارچه سازی:
تستهای یکپارچه سازی زیادی هستند که زمان زیادی میبرند تا کامل شوند. این تستها اعتبارسنجی میکنند که تعامل با backend به درستی انجام میشود. در حین توسعه منظم محلی، ما چندبار کد را تغییر میدهیم قبل از اینکه یک ویژگی یا اصلاح خطا تکمیل شود. نیازی نیست که برای هر یک از اینها تعاملات با backend چک شود چون که فرآیند توسعه را به شدت کند میکند. به همین منظور ما SDK جاوای خود را به این شکل تنظیم کردیم که این تستها را زمانی انجام دهد که کد روی سرور CI در حال اجراست. شما هم کاری مشابه را مانند زیر میتوانید انجام دهید:
در ریشه pom.xml
<properties> <skipITs>true</skipITs> </properties> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.19.1</version> <configuration> <skipITs>${skipITs}</skipITs> <includes> <include>**/*IT.*</include> </includes> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin> </plugins> <build>
همانطور که تصور میکنید، برای اینکه این تنظیمات ما کار کند، لازم است تمام فایلهای تست یکپارچهسازی با حرف IT پسوندگذاری شوند. برای مثال ApplicationIT.groovy
سپس اگر بخواهیم تستهای یکپارچه سازی اجرا شوند میتوانیم به شکل زیر build کنیم:
mvn clean install -DskipITs=false
۷. JWT Inspector
ما در SDK جاوا خود از JWTها برای انتقال دادهها به شکل امن و بدون زحمت استفاده کردیم. وقتی تست و عیبیابی میکنیم، نیاز داریم که محتوای JWTها که در مرورگر دریافت میکنیم را بررسی کنیم. آن توکنها میتوانند در URL، یک کوکی یا در حافظه محلی باشند. JWT Inspector یک افزونه مرورگر است که به ما برای رمزگشایی و بازرسی توکنهای وب JSON مستقیم از کنسول یا در UI کمک میکند. نیازی به دنبال کردن آن توکنها در برنامه خود ندارید. شما به سادگی کلید افزونه را فشار میدهید و JWT Inspector به طور اتوماتیک تمام اطلاعات مورد نیاز شما را نشان میدهد. شما سپس میتوانید هر تقاضای توکن گسترش یافته که نیازدارید را کپی نمایید.
۸. Postman
ما به شدت با تقاضاهای REST API سر و کار داریم. نوشتن تقاضاهای REST همواره کاربر پسند نیست. سینتکس اصلی به ابزاری که استفاده میکنیم مثل curl یا HTTPie وابسته است. هر دو نسبتا خوانا هستند اما به یادآوری سینتکس اصلی دشوار است. به علاوه، موقع عیب یابی نیاز داریم که بعضی درخواستها و خروجی آنها را تست کنیم. وقتی با خطا روبرو میشویم مطمئن نیستیم که مشکل در تقاضاست یا در نقطه پایانی است. و به این ترتیب زمان را به خاطر شک به صحت تقاضایی که داریم مینویسیم از دست میدهیم.
Postman نوشتن تقاضاهای REST API را ساده میکند. به علاوه ویژگیهای ارزشمندی مانند ذخیره و استفاده مجدد از درخواستها، تولید کد (جاوا، پایتون، curl و …) انجام میدهد و تقاضاها را گروهبندی میکند که به ترتیب اجرا شوند. Postman به خاطر واسط کاربری کاربر پسند خود به شما کمک میکند که دستورات پیچیده را build نمایید. کل کاری که باید انجام دهید کامل کردن یک فرم است. چیزی بهتر از این هست؟
سخن آخر
استفاده از ابزارهای صحیح نه تنها به شما اجازه میدهد زمان ذخیره کنید و زحمت کمتری بکشید، کیفیت نهایی محصول شما را بالاتر برده و کارکردن روزانه را لذت بخشتر مینماید. ما باید همواره مشتاق کشف و یادگیری ابزارهای جدید باشیم. ممکن است در ابتدا نیاز به تلاش داشته باشد اما به زودی پی میبرید که ارزش وقتی که صرف کردید را داشته است.
ما نیز مایل هستیم از ابزارهایی که به کمک شما آمدهاند مطلع شویم. شما چه ابزارهای مفید دیگری را میشناسید؟
منبع: