چکیده: همانطور که ما آزمایشات و تستهای مختلفی در پزشکی روی بدن انجام میدهیم تا جنبههای مختلف مشکلات جسمی انسان روشن شود، نوشتن Test یا اصطلاحا Test Case نیز که برای آزمایش کردن یک محصول به کار گرفته میشود، چیزی نیست که یک راهکار صرف داشته باشد، و بسته به اینکه یک تست متناسب با چه نیازمندی طراحی شده است، شیوه طراحی و حتی نوشتاری آن متفاوت خواهد بود. در این میان حتی شرایط نوشتاری و تکنیک مورد استفاده هم میتواند در Test Case تولید شده و قالب آن موثر باشد.
قصد داشتم مقاله دیگری را به رشته تحریر در آورم، اما اخیرا به شکل جالبی سوالات زیادی درباره برگزاری کلاسهای Test Caseنویسی و یا چگونگی نوشتن آنها از من پرسیده میشود. مدتی پیش پرسش این سوال به قدری زیاد شده بود، که به شوخی با خودم فکر میکردم عدهای از دوستان در تلاشند که مرا سر کار بگذارند. اما قبل از پاسخ دادن به این سوال باید فرض سوال را متوجه شد.
افرادیکه چنین سوالی را مطرح میکنند، با احتمال زیاد یک تصور ایستا و غیرقابل تغییر از تست نرم افزار در ذهن خود دارند. این یعنی آنها برای تست تنوع قائل نیستند.
این سوال مانند این است که از یک پزشک آزمایشگاه بپرسید: “شما چطور آزمایش بیماران را انجام میدهید؟”
هر چند در تمامی آزمایشات موارد مشترک بسیار معدودی مانند بررسی دستور پزشک، نمونهگیری و … برای آزمایش وجود دارد، اما قطعا اگر چنین سوالی را از متخصص آزمایشگاه بپرسید، او به شما خواهد گفت: “ما چطور آزمایش میگیریم؟! چه سوال عجیبی؟ آزمایشات با هم متفاوت هستند. یک جا ممکن است چند قطره خون بگیریم، یک جا ممکن است نیازمند نمونه برداری از اندام داخلی باشیم، یک جا کِشت باکتری و …”. او به راحتی میتواند با صحبت در مورد انواع و اقسام روشهای آزمایش که هر کدام به فراخور نیازی اجرا میشوند، برای مدتی شما را سرگرم کند.
تست نرمافزار هم آزمایش نرمافزار است، و ما به فراخور نیازمان میتوانیم تستهایی داشته باشیم، که هر کدام بر اساس نیاز خاصی طرح شدهاند، و حتی قواعد حاکم بر آنها و نوشتن آنها نیز با هم متفاوت است.
بنابراین اولین اصلی که مشخص شد این است که شیوه تولید Test Caseها با هم متفاوت است. حتی نوشتن آنها نیز از قواعد یکسانی پیروی نمیکند.
طبق استاندارد ISO 25010 نیازمندیهای نرمافزار به ۸ دسته مختلف تقسیم میشوند، که یکی از آنها Functional(که صرفا شامل Functionality میشود) و باقی Non-Functional هستند:
- Functionality
- Efficiency
- Compatibility
- Usability
- Reliability
- Security
- Maintainability
- Portability
برای هر کدام از این نیازمندیها باید تست خاصی تعریف شود، که قواعد حاکم بر آن به طور کامل با تست نیازمندی دیگر متفاوت است.
دقیقا هم ارز این ۸ نوع نیازمندی، ۸ دسته مختلف تست با همین نامها نیز وجود دارد.
مثلا Functionality یکی از نیازمندیهای محصول نهاییست، که ۹۰ درصد اوقات تسترها با تست کردن این نوع نیازمندی درگیر میشوند. این تست به قدری حجم عملیاتیِ تسترها را اشغال میکند، که بسیاری از تسترها حتی مفهوم اولیه و صحیح ۷ مورد بعدی را هم نمیدانند. به خاطر همین تصور غالبی که از تست نرمافزار در ذهن آنهاست، صرفا منتهی به Functional Testing میشود. البته اکثر آنها جسته و گریخته نام ۷ مورد دیگر را شنیدهاند، اما در غالب کلاسها و دورههایی که برگزار میکنم، متوجه شدهام زیر یک درصد شرکتکنندگان، مفهوم اولیه ۷ مورد دیگر را که اصطلاحا به آنها تست Non-Functional گفته میشود را میدانند. شاید به خاطر همین است که آنها این سوال عجیب را میپرسند، که Test Case چگونه نوشته میشود. طبیعیست که وقتی شما یک گزینه داشته باشید، همه چیز به همان گزینه ختم میشود. وقتی ما از تمام عالم تست فقط Functional Testing را در نظر بگیریم، آنگاه منظورمان از نوشتن Test Case همان نوشتن Functional Test Case است. اما باید بگویم که حتی اگر با این فرمان هم حرکت کنیم، و واقعا تست دیگری به جز Functional Testing در عالم مهندسی تست نرمافزار وجود خارجی نداشته باشد، باز هم در اشتباهیم. چرا که Functional Testing خود با تکنیکهای مختلفی انجام میشود، و نوشتن Test Case با هر کدام از تکنیکها قواعد خاص خود را دارد. مثلا اگر برای استخراج Functional Test Caseها از تکنیک Decision Table استفاده کنیم، یک جور باید Test Caseها را بنویسیم، اگر از Use Case Testing استفاده کنیم باید جور دیگری بنویسیم، و اگر از تکنیک Fault Attack استفاده کنیم لاجرم به شکل دیگری Test Caseهای خود را مکتوب میکنیم. در بعضی از روشها هم اصلا نیازی به نوشتن Test Case وجود ندارد، مانند Exploratory Testing.
میبینید که نوشتن Test Case حتی در Functional Testing میتواند به طرق مختلف انجام میشود.
پس این سوال از پایه غلط است که: “Test Case را چگونه مینویسند؟”
اما در پایان برای دو بخش از Functional و Non-Functional مثالهایی ساده و کوتاه بیان میکنیم که متوجه موضوع بشوید.
در بخش Functional Testing دو شیوه نگارش برای یک Feature از سیستم مثالی خواهید دید. و در بخش Non-Functional نیز یک مثال از Usability را خواهیم دید.
تست Functional
فرض کنید بخواهیم یک Test Case بدون ثبت Test Data برای ورود به سیستم در حالیکه Captcha غلط ثبت شده است بنویسیم. در این بخش Test Case را به دو شیوه Use Case Testing و Decision Table خواهیم نگاشت.
نوشتن یک Test Case مثالی بر اساس روش Use Case Testing(البته در همین روش، راهکارهای دیگری هم برای نگارش Test Case وجود دارد):
نوشتن همین Test Case بر اساس روش Decision Table، که در آن هر ستون نماینده یک Test Case یا یک Rule از سیستم است:
تست Non-Functional
در اینجا میخواهیم یک Test Case از نوع Usability تعریف کنیم. Usability Testing بیانگر تستی است که سهولت کار با سیستم تحت تست در آن سنجیده میشود. خود این سنجش میتواند انواع مختلفی داشته باشد، که شرح آنها در این مقاله نمیگنجد.
شرح Test Case: “سه کاربر که تجربه کار با سیستم جاری را ندارند، باید بتوانند ثبت اطلاعات در قسمت x را با زمان میانگین حداکثر ۱۲۰ ثانیه به پایان برسانند. ثبت زمان از لحظه لاگین آغاز میشود.”
در این تست میخواهیم ببینیم آیا کار کردن با این سیستم آن قدر ساده هست که کاربران ناآشنا با سیستم بتوانند لاگین کرده، مسیر خود را یافته و در زمان مقرر ثبت اطلاعات را انجام دهند یا خیر. گاهی اوقات سیستمها برای کار کردن اینقدر سخت میشوند که کاربر برای انجام یک کار ساده باید چند برابر زمان صرف کند.