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