رابطه پیچیده بین توسعه دهندگان نرم افزار و کد آزمون

18_05_0_0_0_0_0_0_0_01_01 img src = “https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images٪2Fm6Fn34A3L1VtH37KBVq0wUCK0Qh1-b703eea.jpeg؟alt=media&token=656c64540-707-740-740407-770-740407-740-740-740-740-740-740-740-740-740-740-740-740-780-780-740-740-740-740-740-780-780-780-780-780-780-780-780-51-574057-53D054A5.DE.DE alt = “عکس پروفایل نویسنده”>

kolinlukasKolin Lukas

30 و 30 کارآفرین برتر Crypto 2017

من در حال آماده سازی یک جلسه دیگر درباره Test Driven Development (TDD) هستم (من بسیاری از اینها را بعنوان بخشی از موقعیت خود انجام می دهم) و فکر کردم فکر بدی است که در ابتدا مخاطب را مجذوب خود کنم برخی از آمارها را نشان می دهد.

دو س mainال اصلی که بیشتر مرا مورد توجه قرار داد این بود:

ما به عنوان توسعه دهندگان نرم افزار ، احساسات خود را نسبت به نوشتن کد آزمون چگونه توصیف می کنیم؟ (واحد / م componentلفه / آزمونهای یکپارچه سازی)؟ چند درصد از توسعه دهندگان نرم افزار در واقع روش اول آزمون مانند TDD / BDD (توسعه آزمون / رفتار) را تجربه می کنند؟

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

و چه کسی این تستهای خودکار “جدید” را می نویسد؟ در بیشتر موارد – خود توسعه دهندگان (دلایلی وجود دارد که ما در این مقاله به آنها نمی پردازیم).

بنابراین ، اگر بخشی از کار باشد ، ارزش می دهد ، و این شامل کدگذاری است (که سازندگان نرم افزار قرار است عاشق آن باشند) ، ما باید آن را دوست داشته باشیم .. درست است؟ خوب ، دقیقاً نه.

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

در صورت نیاز به پاسخ ، مستقیماً به Google مراجعه کردم تا آمار مورد نظر خود را پیدا کنم اما متأسفانه آنها هیچ کجا یافت نشد به استثنای برخی از مقالاتی که برخی عقاید را درمورد اینکه چرا مردم آن را دوست دارند / دوست ندارند یا از آن استفاده می کنند / استفاده نمی کنند ، هیچ آماری وجود ندارد.

خوب ، اگر Google نتواند به شما کمک کند تا Google شکل بگیرد احتمالاً می تواند کلاهبرداری را انجام دهد ، بنابراین من تصمیم گرفتم با انتشار نظرسنجی سریع زیر که شامل دو س questionsال فوق است ، آمار خود را جمع آوری کنم.

نظرسنجی هنوز پاسخ ها را می پذیرد (ممنون میشم اگر “خودتان را اضافه خواهید کرد) اما پس از صدها پاسخ ، نتایج به شرح زیر است:

~ 45٪ در واقع آزمون نوشتن را دوست دارند

درصد توسعه دهندگانی (که برای شروع تست می نویسند) که اولین رویه آزمون آزمایشی

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

متأسفانه ، چون پاسخ دادن به نظرسنجی اجباری نیست ، احساس می کنم بیشتر افرادی که به آن پاسخ می دهند نسبت به آزمایش تمایل دارند و این میل در واقع بر پاسخی که انتخاب می کنند تأثیر می گذارد. . به نظر من بیش از 80٪ -20٪ نسبت به دوست نداشتن کد آزمون نسبت به پسندیدن آن است.

به هر حال ، فرض کنید این نتایج است – هنوز هم ، ما یک مشکل اساسی داریم. ~ 55٪ از توسعه دهندگان نرم افزار نوشتن کد آزمون را دوست ندارند و مشکل دوست نداشتن کاری که زیاد انجام می دهید این است که باعث می شود آن را بد انجام دهید .

کجاست عشق ..؟

من معتقدم 3 دلیل اصلی کمبود “عشق” وجود دارد:

1. تحصیلات: در هر موسسه ای که برنامه نویسی (علوم کامپیوتر / مهندسی نرم افزار) را آموزش می دهد ، چه دانشگاه معتبری باشد و چه ارزان ترین دوره آنلاین ، تقریباً همیشه آزمون به عنوان یک فصل کوچک در انتهای برنامه درسی تدریس می شود – فقط فرض کنید زمان کافی باقی مانده است..صحیح؟

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

2. اثر افتراقی: من خودم را به یاد می آورم که در حالت ایستاده روزانه ایستاده ام و می گویم: “من تمام کردم ، کار می کند .. فقط آزمایش ها باقی مانده است” . این جمله معنی ندارد. اگر کار من تمام شده است ، چرا باید الان تست بنویسم؟ چون مدیریت آن را می خواهد؟ به منظور تغذیه برخی از دامون پوشش کد؟.

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

من تمام کردم ، کار می کند .. فقط آزمونها باقی مانده است!

اثر پس انداز همچنین چرخه معیوبی را که در کتاب Test Driven Development به عنوان مثال کنت بک معرفی شده تشویق می کند:

چرخه معیوب

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

3. سوinter تعبیر از یک “واحد”: در برخی اوقات یک بحث / تحقیق در مورد آزمایش ، هرم زیر پدیدار می شود:

هرم تست کلاسیک

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

  • آزمایش بسیار زیاد. اگر هر عملکرد / روشی (حداقل عمومی) باید بصورت جداگانه آزمایش شود ، در پایان هزار آزمایش خواهیم داشت. این مجموعه تست غول پیکر بخشی از کد ماست و باید به همین ترتیب نگهداری شود.
  • استفاده بیش از حد از اشیاock مسخره. اگر همه چیز باید جدا شود ، تمام وابستگی های یک کلاس معین باید مسخره شود. این باعث می شود که توسعه دهندگان وقت زیادی را برای نوشتن کد تمسخر یا استفاده از اطلاعات مسخره که اساساً اکثر مردم زیاد علاقه ندارند ، صرف کنند.

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

چه کاری می توانیم انجام دهیم:

TDD “Mantra” از بسیاری جهات به ما کمک می کند ، اما اصلی ترین کاری که به نظر من انجام می دهد ، آزمایش یا عبارت بهتر است – توسعه با توجه به نمونه های اجرایی الزامات – بخشی از فرایند توسعه . < / p>

این کاملاً حذف می شود اثر بعدی که در بالا مورد بحث قرار گرفت.

موارد دیگری که می تواند برای افزایش “عشق” اعمال شود ، اگر ابتدا آزمایش نکنید ، آزمایش می شود ، اما آزمون اول قطعاً تشویق می کند آنها.

“یک واحد” جریان تجاری است. آزمون “اهمیتی” ندارد اگر شما یک روش ، 10 روش یا 10 کلاس درگیر آن جریان دارید ، اگر این نهادها در آن جریان تجاری مشارکت داشته باشند ، همینطور خواهد بود. در واقع این قاعده کلی است که باید از ساختار داخلی کد آگاهی نداشته باشد. این امر بدون آسیب رساندن به پوشش کد ، تعداد آزمایشات را به طرز چشمگیری کاهش می دهد و البته تعداد اشیا m ساختگی مورد نیاز ما را کاهش می دهد. همچنین امکان refactoring مداوم و تکامل طبیعی پایه کد را فراهم می کند. ما فقط مرزهای خارجی برنامه خود را (DB ، وب ، I / O) مسخره می کنیم ، هرگز یک لایه داخلی از برنامه خود را مسخره نمی کنیم. علاوه بر این ، ما عجله نمی کنیم که هر مرز خارجی را مسخره کنیم ، فقط در صورت تمسخر ، آن را مسخره می کنیم (عملکرد / دسترسی / امنیت / پیچیدگی / ثبات). وقتی تصمیم گرفتیم وابستگی را مسخره کنیم ، به دنبال پیاده سازی در حافظه هستیم که همان API را در اختیار ما بگذارد ، فقط در صورت عدم وجود ، مناسب نبودن یا مجازات های خاص خود ، ما شی m مسخره خود را می نویسیم. این ارزش آزمایشات ما را بسیار افزایش می دهد ، هرچه از اشیا m مسخره استفاده شود مقدار بیشتری کسب می کنیم. کد آزمون شهروند درجه یک است و به اندازه کد تولید دارای اهمیت است. ما با کد آزمون خود به گونه ای رفتار می کنیم که گویی کد تولید است (کد تمیز ، رعایت اصول SOLID و غیره). این امر علاقه و چالش تولید کد با کیفیت بالا برای مجموعه آزمون را حفظ می کند و البته یک پایگاه کد قابل نگهداری ایجاد می کند. در سیستم هایی که تحت آزمایش های خودکار هستند ، اگر تغییر و نگهداری کد آزمون دشوار باشد ، تغییر و نگهداری کل پایه کد نیز دشوار است .

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

ابتدا سعی کنید نکات بالا را عمیقا درک کنید ، ببینید آیا با آنها موافق هستید یا خیر ، و مهمتر از همه آنها را بر اساس کد کد خود امتحان کنید. < p class = "paragraf"> در مورد TDD ، معمولاً به تغییر ذهنی قابل توجهی نیاز دارد. من توصیه می کنم ابتدا با انجام کد TDD KATA ، آشنا شدن با ایده و مفهوم ، سپس انتخاب یک ویژگی در تولید و تلاش برای پیاده سازی آن با استفاده از TDD و برنامه نویسی جفت. وقتی افراد کنار هم می نشینند و چیز جدیدی را امتحان می کنند یک اثر عالی و جادویی وجود دارد ، این بهترین توصیف در تصویر زیر است: miro.medium.com/max/2400/1*5uL8BtbyK6uond49BBA3BQ.jpeg”>

اثر “جادویی” برنامه نویسی جفت