روند تست نویسی به چه صورت می باشد؟

نوشتن تست یا آزمون نرم افزاری اون هم به صورت خودکار یک بحثی هست که خیلی از برنامه نویس ها در عمر برنامه نویسی خودشون شاید یک بار هم ازش استفاده نکرده باشند .

چند سوال اصلی وجود داره که به شرح زیر است :

  1. برای چی تست می نویسیم ؟
  2. در چه زمانی تست باید بنویسیم؟
  3. بعد از ساخت نرم افزار باید تست بنویسیم یا هنگام ساخت یا قبل از ساخت؟
  4. آیا تست دارای متد خاصی است ؟

حالا چرا این سوال برای بنده پیش اومده ؟

چندی پیش من در یکی از سایت ها دیدم که نویسندش ( یادم نیست کدوم سایت شاید هم همین انجمن بود ) گفته بود نرم افزاری خوبه که همزمان براش تست نوشته شده باشه و با تست توسعه پیدا کرده باشه.

به همین منظور من تصمیم دارم اگر این حرف نقل شده درست هست در هنگام نوشتن تست بنویسم اما چطور و چگونه باید این کار انجام بشه. به عنوان مثال :

  • من من یک فانکشن لاگین دارم چطور باید این مورد رو تست کنم؟
  • یک api دارم چطور باید درخواست هارو آنالیز کنم ؟

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

راستی من این مطلب رو در انجمن خوندم و کلا چیزی دستگیرم نشد .

پیوست :

من فعلن روی زبان الکسیر این صحبت می کنم اگر از این مورد مثالی داشتید که چه بهتر تا اینکه بتونم در زبان های دیگه ای مثل swift , … نیز بتونم استفاده کنم

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

موضوعی دیگر نیز مطرح شد که البته فریم ورکی برای روبی هست

2 پسندیده

سلام، قبل از هر چیز یک نگاهی به این سایت بنداز اگر ندیدی

1 پسندیده

درود توماج جان شب خوش البته از ساعت ایران .

این رو بنده دیدم و لینک هایی مثل



دیدم و در حال مطالعه هستم ولی بیشتر دنبال بحث در این رابطه هستم و موارد مفهموی تا گرا بگیرم از صحبت دوستان تا برم دنبالش به صورت تخصصی تر

راستی ممنون از ویرایش پست .

1 پسندیده

اینجا من یکم توضیح دادم حالا بیشتر توضیح میدم وقت کنم

2 پسندیده

روش رایج تست BDD از بیرون به داخله Outside In
مثلا اگر داریم API تست میکنیم
اول با تست بیرونی ترین لایه یعنی controller شروع میکنیم
تست مینویسیم که اگر کنترولر users/{id}/authenticate درخواست POST بگیره JSON که انتظار داریم باید خروجی باشه
این تست رد میشه چون هیچ کدی نداریم پس کنترولر و route درست میکنیم برای اینکه کاربر authenticate کنیم یک module نیاز داریم با function authenticate
پس برای این با یک unit test شروع میکنیم فرض میکنیم کد authenticate نوشتیم در حالت خوب اگر کاربر در database باشه و رمزش درست باشه باید token خروجی باشه در غیر این صورت خطا باید بده
حالا شروع میکنیم کد authenticate مینویسیم کمترین کد مینویسیم که unit test سبز بشه بعد اگر خواستیم refactor میکنیم طوری که تست سبز بمونه
بعد از module در کنترولر استفاده میکنیم اگر همه چیز درست باشه تست کنترولر هم سبز میشه

2 پسندیده

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

3 پسندیده

بله دقیقا

2 پسندیده

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

فقط من این خط رو متوجه نشدم

ضمن اینکه باید بگم تست در روش TDD BDD این طور که گفتم نوشته میشه
شما لزوما نباید این روش و پیروی کنید تا تست بنویسید میتونید بعد کد تست بنویسید که از یک سری مزایای TDD بهره مند نمی‌شه ولی با این حال کد تست داره
مهم‌ترین نکته اینکه کد در هرصورت باید تست داشته باشه حالا متودش بحث دیگه ای

2 پسندیده

بله پست میکنم به زودی

“بعد از module در کنترولر استفاده میکنیم اگر همه چیز درست باشه تست کنترولر هم سبز میشه”

module که براش unit test نوشتیم جداگانه رو میاریم تو کنترل که تست اولی و با استفاده ازش پاس کنیم

2 پسندیده

این یک نمونه برنامه که TDD شده

2 پسندیده

درود سام عزیز من شروع به تست نویسی کردم برای پروژه ام مثلا سه حالت اینکه

  • یا پسورد ارسال نشه
  • پسورد غلط باشه
  • و پسورد درست باشه

مثلا اومدم به این صورت یک مودلشو انجام دادم آیا اینطور نوشتن من درست هست یا خیر؟

  test "greets the world" do
  	jsons = Poison.encode!(%{"password" => "2"}) 
  	a =  HTTPoison.post!(
  		"http://localhost:4001/api/users/sign-in",
  		jsons, 
  		[{"Content-Type", "application/json"}])
    assert a.status_code == 200
  end

من اومدم اینطوری یک درخواست فرستادم تا تست کنه مثلا اگر پسورد درست باشه .

1 پسندیده

سلام شهریار عزیز بله این نوع تست
تست تجمعی integration test هستش که کارکرد چند قسمت باهم تست میکنه

1 پسندیده

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


من امروز رفتم تمام تست نویسی های الکسیر منظور داکیومنت هاشو خودندم موارد زیادی مثل assert رو دیدم که باید دوباره رفت و از داخلش یاد گرفت . به همین منظور گفتم پس بهتر بیام راه تست رو مثلا تو ترمینال می نویسم با curl می فرستم اینجوری بفرستم .

چون واقعا مثلا تابع های یونیت تست خیلی زیاد بود

شما مثلا برای نوشتن تست اشراف کامل به تمام تابع هاش دارید ؟

من ۱ سال میشه الیکسیر کار نکردم ولی توابع تستی اکثر زبان ها شبیه همه و بسیار ساده هستش

1 پسندیده

این تست نباید توی پروژه باشه

1 پسندیده

درود توماج جان در فایل تست هست . مثلا در این فایل ApiTrangellWeb.PageControllerTest می نویسم و با mix test اون رو تست می کنم منظور شما اینکه مثلا روی سرور نبرمش این فایل تست رو منظورتون هست ؟
می شه بیشتر توضیح بدید لطفا

منظورم اینه توی تست های پروژه نباشه، چون اندپوینت واقعی رو میزنه

1 پسندیده

بازم من توماج جان قشنگ متوجه صحبتت نشدم . شرمنده که وقتتو دارم می گیرم .

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

تست بنویسیم بعد برنامه رو از روی تست بنویسیم

اگر این تست بخشی از یک سناریو باشه که یک اپ زنده رو تست میکنه و قصد دارید یک سری تست به عنوان یک پروژه جداگانه بنویسید که مثلا در مورد شما پروسه لاگین رو تست کنه و احتمالا مرورگر رو خودکار کنید و assertion هم داشته باشید، مشکلی نیست.
اما در تست های پروژه این روش درستی نیست،

هنوز دارم متن رو کامل میکنم…

1 پسندیده