دانشکده آموزش‌های الکترونیکی.
پایان‌نامه کارشناسی ارشد در رشته مهندسی فناوری اطلاعات (تجارت الکترونیک)

استفاده از داده کاوی در پیش‌بینی خطای نرم‌افزار بر اساس متریک‌های کد و وابستگی

به کوشش:
جواد کامیابی

استاد راهنما:
دکتر اشکان سامی

دی 1390

به نام خدا

اظهار نامه

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

نام و نام‌خانوادگی

تاریخ و امضا

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

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

و من الله توفیق
جواد کامیابی
20 آذر 1390

چکیده:

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

به کوشش

جواد کامیابی

تضمین کیفیت نرم‌افزار همیشه دارای محدودیت‌های زمان و هزینه بوده است. به منظور رسیدن به کیفیت بالا و کاهش محدودیت‌ها، مدیران همواره سعی کرده‌اند تا بخش‌های مستعد خطا را در نرم‌افزار پیش‌بینی نمایند و منابع مذکور را به صورت موثری به این بخش‌ها اختصاص دهند. پیش از این، محققین روش‌های خودکاری را برای کمک به مدیران در این امر مهم معرفی و از آن‌ها استفاده کرده‌اند. روش‌های خودکار مذکور با استفاده از اندازه گیری معیارهای مختلف نرم‌افزار و یافتن ارتباط میان این معیارها و خطاهای نرم‌افزاری، همواره سعی در افزایش سرعت و دقت در پیش‌بینی خطا داشته‌اند. به نوعی می‌توان این معیارها را در چهار دسته که عبارتند از معیارهای پیچیدگی، داده‌های تاریخی، معیارهای طراحی و معیارهای وابستگی، قرار داد. اگرچه معیارهای استفاده شده، تا حدودی موثر هستند اما هنوز هیچکدام موفق به پیش‌بینی تمامی خطاهای موجود نشده‌اند. در این رساله، ما با توسعه دادن مفهوم وابستگی در نرم‌افزار، به معرفی مفهوم جدیدی به نام درخت وابستگی می‌پردازیم. این مفهوم به ما کمک می‌کند تا با در نظر گرفتن تمامی وابستگی‌های مستقیم و غیر مستقیم در بین اجزای نرم‌افزار، معیارهای جدیدی را استخراج نماییم که این معیارها می‌توانند عملاً نتایج مطلوب‌تری را نسبت به معیارهای پیشین، در پیش‌بینی خطا ارائه دهند.

فهرست مطالب
عنوان صفحه
1-مقدمه:14
2- پیشینه پژوهشی:16
2-1-معیارهای نرم‌افزار16
2-2-معیارهای وابستگی:17
2-3-معیارهای تاریخی:17
2-4-بررسی فعالیت‌های گذشته18
2-4-1- بررسی فعالیت‌ها در زمینه معیارهای کد :18
2-4-2- بررسی فعالیت‌ها در زمینه معیارهای تاریخی:20
2-4-3- بررسی فعالیت‌ها در زمینه معیارهای وابستگی:22
3-درخت وابستگی:26
4-فرضیات:33
5-جمع آوری داده:34
5-تحلیل و مقایسه:44
6-نتیجه گیری:76
7-مراجع:77

فهرست تصاویر

عنوان صفحه
شکل 1: نمونه‌ای از وابستگی‌های میان کلاس‌ها29
شکل 2: نمونه‌ای از وابستگی‌های پیچیده در میان کلاس‌ها30
شکل 3: تصویری از نمای کلی برنامه Class Dependency Analyzer37
شکل 4: نمونه‌ای از کلاس دیاگرام نمایش داده شده در برنامه Class Dependency Analyzer37
شکل 5: نمایش تمامی کلاس‌های وابسته به یک کلاس خاص در برنامه Class Dependency Analyzer38
شکل 6: نمونه‌ای از یک گراف جهت دار39
شکل 7: ماتریس وابستگی مربوط به گراف جهت دار در شکل شماره 639
شکل 8: درخت وابستگی تشکیل شده از روی ماتریس وابستگی شکل 742
شکل 9: متغیر تصادفی، انحراف معیار σ حول محور μ53

فهرست نمودارها

عنوان صفحه
نمودار 1: ارتباط بین جفتگری و انسجام28
نمودار 2: بررسی رفتار معیار دقت در هنگام افزایش وابستگی درجه 146
نمودار 3: بررسی رفتار معیار دقت در هنگام افزایش وابستگی درجه 246
نمودار 4: بررسی رفتار معیار دقت در هنگام افزایش وابستگی درجه 347
نمودار 5: مقایسه نتیجه «دقت» در دسته بندی سه نسخه اکلیپس54
نمودار 6: مقایسه نتیجه «فراخوانی» در دسته بندی سه نسخه اکلیپس55
نمودار 7: مقایسه نتیجه «صحت» در دسته بندی سه نسخه اکلیپس56
نمودار 8: مقایسه نتیجه «معیار F» در دسته بندی سه نسخه اکلیپس56
نمودار 9: مقایسه نتیجه «منحنی مشخصه عملکرد» در دسته بندی سه نسخه اکلیپس57
نمودار 10: مقایسه نتیجه «کاپا» در دسته بندی سه نسخه اکلیپس57
نمودار 11: مقایسه نتیجه «انحراف معیار» در دسته بندی سه نسخه اکلیپس58
نمودار 12: مقایسه نتیجه «دقت» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی59
نمودار 13: مقایسه نتیجه «فراخوانی» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی60
نمودار 14: مقایسه نتیجه «صحت» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی60
نمودار 15: مقایسه نتیجه «معیار F» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی61
نمودار 16: مقایسه نتیجه «منحنی مشخصه عملکرد» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی61
نمودار 17: مقایسه نتیجه «کاپا» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی62
نمودار 18: مقایسه نتیجه «انحراف معیار» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی62
نمودار 19: قیاس نتیجه «دقت» در دسته‌بندی بر روی کل داده‌ها64
نمودار 20: قیاس نتیجه «فراخوانی» در دسته‌بندی بر روی کل داده‌ها65
نمودار 21: قیاس نتیجه «صحت» در دسته‌بندی بر روی کل داده‌ها66
نمودار 22: قیاس نتیجه «معیار F» در دسته‌بندی بر روی کل داده‌ها66
نمودار 23: قیاس نتیجه «منحنی مشخصه عملکرد» در دسته‌بندی بر روی کل داده‌ها67
نمودار 24: قیاس نتیجه «کاپا» در دسته‌بندی بر روی کل داده‌ها67
نمودار 25: قیاس نتیجه «انحراف معیار» در دسته‌بندی بر روی کل داده‌ها68

1-مقدمه:
یکی چالش بر انگیزترین موضوعات مطرح در تضمین کیفیت1، در شرکت‌های سازنده نرم افزار، موضوع رفع خطاهای نرم افزار است. خطاهای نرم افزاری می‌توانند در زمان پیش و یا پس از انتشار2 نرم افزار تشخیص داده شوند. اما منابعی که می‌توان برای تشخیص و تصحیح خطاها در نظر گرفت محدود است (Kamyabi et al.).
خطاها را می‌توان به دو دسته کلی تقسیم کرد. خطاهای نحوی3 و خطاهای مفهومی4. با توجه به‌این که ابزارهای خودکار بسیار قدرتمندی برای تشخیص خطاهای نحوی وجود دارند، احتمال‌این که خطایی ازاین دست تا زمان انتشار تشخیص داده نشود، بسیار کم است. خطاهای مفهومی به آن دسته از خطاها اشاره دارد که در اثر مشکلاتی جدای از اشتباهات نحوی و خطاهای انسانی ملموس اتفاق می‌افتند و معمولاً در اثر عدم هماهنگی در بخش‌های مختلف کد و گاهی به صورت بسیار ناملموس به وجود می‌آیند که در اینجا به سادگی نمی‌توان با بررسی کد، این‌گونه خطاها را تشخیص داد. بنا بر این در مورد خطاهای مفهومی داستان فرق می‌کند چرا که عوامل بسیار زیادی می‌توانند در بروزاین‌گونه از خطاها دخیل باشند. (Zimmermann & Nagappan, 2008) بنا براین همواره سعی شده است که با اندازه گیری معیارهای5 مختلف و استفاده از آن‌ها در روش‌های پیش‌بینی خودکار خطا، سرعت و دقت را در امر تست نرم افزار افزایش دهند. طی تحقیقاتی که تا کنون صورت گرفته، متداول‌ترین معیارهای استفاده شده در پیش‌بینی اتوماتیک خطا، معیارهای پیچیدگی6 است. (Zimmermann & Nagappan, 2008) اما جدیدترین روشی که مطرح شده است، مسأله مربوط به وابستگی‌های بین کلاس‌ها7 و همچنین بین ماژول‌ها می‌باشد. انواع وابستگی‌ها می‌توانند بین دو کلاس و یا دو ماژول8 مطرح شوند که تحقیقات نشان داده است که این وابستگی‌ها ارتباط بسیار زیادی با وجود خطاهای مفهومی دارند.
برای اجرای روشمند و علمی روند یافتن روابط و الگوهای مناسب برای پیش بینی خطا بر اساس معیارهای قابل اندازه گیری، از مفهومی به نام داده‌کاوی استفاده خواهیم کرد که در تشریح و بیان مسأله به آن خواهیم پرداخت.
دراین پایان نامه، سعی می‌کنیم که به بررسی چنین وابستگی‌هایی بپردازیم و بر اساس روابط موجود بین وابستگی و وجود خطا در نرم افزار، وجود خطا در کد را پیش بینی نماییم.
در ادامه این رساله در بخش دوم به بررسی تحقیقات قبلی انجام شده در این زمینه می‌پردازیم، در بخش سوم به بیان انگیزش و نحوه به وجود آمدن ایده کار شده در این رساله می‌پردازیم، در بخش چهارم فرضیات مورد بررسی را مطرح می‌کنیم، در بخش پنجم داده‌ها و ابزارهای جمع آوری شده برای انجام عملی آزمایشات را معرفی می‌کنیم، در بخش ششم به بیان شیوه و نوع آزمایشات و بیان نتایج آنالیزها و نتایج می‌پردازیم و در بخش هفتم و پایانی این رساله سعی در نتیجه‌گیری از آزمایشات انجام شده خواهیم داشت.
2- پیشینه پژوهشی:

تلاش‌های گذشته با هدف پیش‌بینی خطا را در سه گروه مورد بررسی قرار می‌دهیم: معیارهای نرم‌افزار9، معیارهای وابستگی10 و معیارهای تاریخی11. ابتدا به بیان توضیحی در مورد شیوه کار کردن این معیارها می‌پردازیم.
2-1 معیارهای نرم‌افزار:

معیارهای نرم‌افزار برای اندازه‌گیری درجه پیشرفته بودن یک محصول و یا یک فرآیند نرم‌افزاری به کار می‌روند. معیارهای نرم‌افزاری به چندین گروه تقسیم می‌شوند: معیارهای محصول12، معیارهای فرآیند13، معیارهای پروژه14 و معیارهای منبع15. معیارهای نرم‌افزاری که در پیش‌بینی خطا به کار می‌روند معیارهای محصول می‌باشند که از مشخصات کد سیستم نرم‌افزاری استخراج می‌شوند. این معیارها به سه گروه تقسیم می‌شوند: معیارهای اندازه16، معیارهای پیچیدگی17 و معیارهای کیفیت18. (Mills, 1988) معیارهای اندازه بر اساس تعداد خطوط کد برنامه محاسبه می‌شوند مانند تعداد کل خطوط برنامه19، تعداد خطوط توضیحات20 و … معیارهای میزان نگهداشت‌پذیری21 و قابلیت تست برنامه وابسته است از جمله معروف‌ترین معیارهای پیچیدگی معیارهای پیچیدگی مک کیب22 و معیارهای هالستد23 می‌باشند. معیارهای مک‌کیب پیچیدگی کد را بر اساس تعداد مسیرهای کنترلی محاسبه می‌نماید. (McCabe, 1976) هالستد معیارهای خود را بر اساس ارتباطات ریاضی بین اجزای کد، پیچیدگی کد و نوع زبان برنامه نویسی مطرح کرد. (Halstead M. H., 1975) معیارهای اتصال24 و پیوستگی25 از معروف‌ترین معیارهای کیفیت می‌باشند که بالا و یا پایین بودن اندازه این دو معیار نشان دهنده کیفیت محصول و یا فرآیند نرم‌افزاری است. (Pressman, 1982) معیارهای کیفیت معیارهایی میباشند که درجه آن‌ها می‌تواند تولیدکنندگان نرم‌افزار را در مورد توانایی دست کار کردن سیستم‌شان مطمئن سازد.

2-1- معیارهای وابستگی:

معیارهای وابستگی معیارهایی هستند که بر اساس ارتباط اجزای کد نرم‌افزار محاسبه می‌شوند. این ارتباط می‌تواند بین سطوح مختلف کد مطرح شود مانند سطح فایل، کلاس، تابع … نوع ارتباط و یا به عبارت دیگر وابستگی موجود بین اجزای کد نیز می‌تواند متفاوت باشد مانند وابستگی داده26 که بر اساس تعریف و استفاده از داده می‌باشد و یا وابستگی صدا زدن27 که بر اساس تعریف و صدا زدن مؤلفه‌ها می‌باشد. (Zimmermann, 2008 & Nagappan )

2-2- معیارهای تاریخی:

این دسته از معیارهای بر اساس تغییراتی که در بین چندین انتشار28 مختلف از یک سیستم نرم‌افزاری رخ می‌دهد تعریف می‌شوند. این تغییرات می‌توانند اضافه شدن، حذف شدن، تغییر یافتن مؤلفه‌های جز مربوطه در بین چندین انتشار باشند. محدودیتی که در به کار بردن این معیارها وجود دارد این است که محاسبه این معیارهای تنها برای محصولات نرم‌افزاری مقدور می‌باشد که دارای چندین انتشار باشند و همچنین اطلاعات کامل در مورد انتشارات قبلی موجود باشد.

2-3- بررسی فعالیت‌های گذشته:

در ادامه به بررسی تلاش‌های گذشته در زمینه پیش‌بینی خطا می‌پردازیم.
2-3-1- بررسی فعالیت‌ها در زمینه معیارهای کد :
در اولین مطالعات در زمینه پیش‌بینی خطا، آکیاما در سال 1971 بر روی یک سیستم که در فوجیتسو ژاپن توسعه یافته بود کار کرد و نشان داد معیارهای پیچیدگی نرم‌افزار و معیارهای اندازه نرم‌افزار در پیش‌بینی خطا موفق عمل می‌نمایند. (Akiyama, 1971) فردینند در سال 1974 ارتباط تعداد خطا با تعداد اجزای کد را بررسی نمود و به این نتیجه رسید که تعداد اجزای کد با تعداد خطا در ارتباط است. (Ferdinand A. , 1974) در سال 1975 هالستد معیارهای نرم‌افزاری را ارائه داد که بر اساس پیچیدگی زبان برنامه‌نویسی عمل می‌نمودند. هالستد از این معیارها برای پیش‌بینی خطا استفاده کرد و نشان داد معیارهای پیچیدگی هالستد در پیش‌بینی خطا موفق عمل می‌نمایند. این معیارها با نام معیارهای هالستد شناخته می‌شوند. (Halstead M. H., 1975) چیدمبر و کمرر در سال 1994 بر روی سیستم‌های شی گرا کار کردند و شش معیار طراحی برای این نوع سیستم معرفی کردند. این معیارها با نام معیارهای طراحی چیدمبر و کمرر شناخته می‌شوند. (Chidamber & Kemerer, 1994) باسیلی در سال 1996 از معیارهای چیدمبر و کمرر به منظور پیش‌بینی خطا استفاده نمود و نشان داد معیارهای چیدمبر و کمرر عملکرد موفقی در پیش‌بینی خطا دارند. (Basili et al., 1996) در سال 1996 اوهلسون و آلبرگ معیارهای پیچیدگی را به منظور پیش‌بینی ماژول‌های از کد به کار بردند که در طول اجرا دچار خطا می‌شدند. مدل پیش گویی کننده آن‌ها 20 درصد از ماژول‌هایی از کد را شناسایی می‌کرد که شامل 47 درصد از کل خطاها بودند. (Ohlsson & Alberg, 1996) زائو در سال 1998 به بررسی معیارهای طراحی نرم‌افزار پرداخت و عملکرد آن‌ها در پیش‌بینی خطا را محاسبه نمود. زائو نشان داد که معیارهای طراحی به خوبی در پیش‌بینی خطا عمل می‌نمایند. (Zhao M. et al., 1998) در سال 2006، ناپاگان معیارهایی برای پیش‌بینی خطاهای پس از زمان انتشار شناسایی را کرد و گزارش مبنی بر اینکه چگونه به طور سیستماتیک پیش‌بینی کننده‌های خطاهای پس از زمان انتشار بر اساس تاریخچه29 ساخته شوند، را ارائه داد. (Nagappan et a., 2006) شروتر، زیمرمن و زلر در سال 2006 با استفاده از مهندسی معکوس30 نشان دادند معیارهای طراحی در پیش‌بینی خطاهای پس از اجرا موفق عمل می‌نمایند (Schröter et al., 2006) منزیس در سال 2007 با کار بر روی چند پروژه و با استفاده از معیارهای نرم‌افزار مدل پیش‌بینی خطایی طراحی نمود که توانست 71 درصد از کل خطاهای برنامه را با نرخ خطای 25 درصد شناسایی نماید (Menzies et al., 2007) در سال 2008 جیانگ کارکرد معیارهای سطح کد31 و معیارهای سطح طراحی32 را بر روی 13 محصول نرم‌افزاری با یک دیگر مقایسه نمود. نتایج حاکی از عملکرد بهتر معیارهای سطح طراحی نسبت به معیارهای سطح کد و ترکیب دو گروه معیار در پیش‌بینی خطا بود. (Jiang et al, 2008) در سال 2010 منزیس و گروهی دیگر با تلاش‌های گذشته نشان دادند که معیارهای کد معیارهای موفقی در پیش‌بینی کد هستند و این معیارها را به عنوان معیارهای با استفاده راحت و مفید معرفی نمودند. (Menzies et al., 2010) در مطالعه‌ای که بر روی چندین پروژه عظیم نرم‌افزاری در ترکیه انجام (Menzies et al., 2010)، مدل پیش‌بینی کننده که بر اساس معیارهای کد عمل می‌نمود را از طریق طبقه بندی نایو بیز33 اصلاح نموده و به بهبود 8 درصدی نسبت به گذشته دست یافتند. در یکی از تحقیقاتی که در سال 2010 بر روی پروژه‌های متن باز34 صورت گرفت توانایی معیارهای اندازه‌گیری متن با طبقه بندی نایو بیز و معیارهای پیچیدگی با آنالیز رگرسیون35 در پیش‌بینی خطاهای نرم‌افزار مورد مقایسه قرار گرفتند. این پژوهش نشان داد معیار اندازه گیری متن از فراخوانی36 بالاتر و معیار پیچیدگی از دقت37 بالاتری برخوردار هستند. (Hideaki & Osamu, 2010) معیارهای طراحی معیارهای موفقی در پیش‌بینی خطا هستند اما در بسیاری از پروژه‌های نرم‌افزاری معیارهای سطح کد موجود نیستند از اینرو سامی و فخراحمد در سال 2010 معیارهای طراحی را بر اساس معیارهای کد تخمین زدند که این معیارها با معیارهای واقعی سطح طراحی تفاوت اندکی دارند. (Sami & Fakhrahmad, 2010)
2-3-2- بررسی فعالیت‌ها در زمینه معیارهای تاریخی:
خوش گفتار در سال 1996 بر روی دو سیستم بزرگ ارتباطی کار کرد و در مدل پیش بینی خود ماژول‌هایی را به عنوان ماژول معیوب پیش‌بینی نمود که تعداد خطوط کد آن در انتشارهای مختلف تغییر می‌کند. (McMullan et al., 1996) هودپل (Hudepohl et al., 1996) توانست با استفاده از ترکیب معیارهای پیچیدگی و داده‌های تاریخی پیش‌بینی نماید آیا یک ماژول دارای خطا می‌باشد یا خیر. در این تحقیق همان‌گونه که از اطلاعات با استفاده مجدد38، استفاده شد معیارهای طراحی نرم‌افزار نیز در پیش‌بینی خطا مورد استفاده قرار گرفت با این فرض که ماژول‌های جدید و یا تغییر یافته چگالی خطای بالاتری دارند. گریوز با استفاده از یک سیستم بسیار بزرگ و با طول عمر طولانی، نشان داد که معیارها بر اساس اطلاعات تاریخی بهتر از معیارهای پیچیدگی کد عمل می‌نمایند. (Graves T. L et al., 2000) در سال 2004 اوستراند در ادامه مطالعات خود از اطلاعات وضعیتی فایل‌های برنامه که در طول انتشارهای مختلف تغییر می‌کند مانند تعداد خطوط اضافه شده، حذف شده و تغییر یافته در فایل‌ها برای پیش‌بینی تعداد خطاهای برنامه استفاده نمود. (Ostrand et al., 2004) این مدل پیش‌گویی کننده برای یافتن خطا چه در مرحله توسعه و چه در مراحل پایانی پروژه از دقت بالایی برخوردار بود. اوستراند در سال 2005 مطالعات خود را بر اساس اطلاعات تاریخی بر روی 2 سیستم نرم‌افزاری بزرگ تا 17 انتشار برای پیش‌بینی فایل‌هایی با بالاترین چگالی خطا انجام داد. (Ostrand et al., 2005) مدل پیش‌بینی کننده خطاها 20 درصد از کل فایل‌های 2 سیستم نرم‌افزاری را به عنوان فایل‌های حاوی خطا پیش‌بینی کرد و موفق به شناسایی 71 درصد و 92 درصد از کل خطاها شد. زیمرمن در سال 2005 یکی از بزرگ‌ترین تحقیقات را بر روی اطلاعات تاریخی سیستم‌های نرم‌افزاری انجام داد. (Zimmermann et al., 2005). او بر روی اطلاعات تاریخی 8 سیستم بزرگ کار کرد تا بتواند محلی که تغییرات بعدی در انتشار بعدی رخ می‌دهد را پیش‌بینی کند. در این تحقیق او توانست محل تغییرات در آینده را با احتمال 70% به درستی تشخیص دهد. در سال 2005 نگاپان و بال با کار بر روی ویندوز سرور 2003، از تغییرات کد برای پیش‌بینی زود هنگام چگالی خطا در سیستم‌های نرم‌افزاری استفاده نمودند. (Ball & naggapan, 2005) آن‌ها نشان دادند که معیارهای مطلق تغییرات کد در پیش‌بینی چگالی خطا ضعیف عمل می‌کند در صورتی که معیارهای نسبی تغییرات کد که توسط آن‌ها مطرح شد توانست با دقت 89% بالاترین چگالی خطا را شناسایی نماید. آن‌ها نشان دادند افزایش معیار نسبی تغییرات با افزایش چگالی خطا توأم است و همچنین معیار نسبی تغییرات علاوه بر چگالی در شناسایی اجزای معیوب نیز موفق است. آن‌ها همچنین بیان کردند که تغییرات در کد و وابستگی به کدهای تغییر داده شده می‌تواند باعث بروز خطاهای پس از زمان انتشار شود. این پیش‌بینی به کمک معیارهای پیچیدگی نظیر سایز اجزای کد و اندازه موقتی39 کد تغییر یافته صورت گرفت. در سال 2006 تحقیقی بر روی ویندوز ایکس پی- سرویس پک 140 و ویندوز سرور 2003 صورت گرفت. در این تحقیق نشان داده شد که معیارهایی که بر اساس اطلاعات تاریخی در سطح پروژه و محصول عمل می‌نمایند معیارهای مناسبی برای پیش‌بینی خطاهای پس از زمان اجرا هستند و همچنین کارایی این متریک‌ها در سطح پروژه‌های بسیار بزرگ نیز نشان داده شد. (Nagappan et al., 2006).
2-3-3- بررسی فعالیت‌ها در زمینه معیارهای وابستگی:
در سال 1981 هنری و کافورا معیارهایی تحت عنوان معیار ورودی41 و معیار خروجی مطرح کردند. معیارهای ورودی تعداد ماژول‌هایی است که یک ماژول خاص را صدا می‌زنند و معیار خروجی تعداد ماژول‌هایی است که توسط یک ماژول خاص صدا زده می‌شوند. هنری و کافورا از این دو معیار برای محاسبه پیچیدگی کد استفاده نمودند و نشان دادند اجزایی از کد که دارای معیار ورودی و معیار خروجی بزرگی باشند دارای طراحی ضعیفی هستند. (Kafura & Henry, 1981) در سال 1989 سلبی و پورتر با استفاده از یک الگوریتم بازگشتی درخت‌های دسته‌بندی42 استخراج کردند که گره‌های آن‌ها تابعهای چند ارزشی بر اساس معیارهای کد هستند. هدف از تشکیل این درخت‌ها شناسایی اجزای معیوب کد بود. سلبی و پورتر بر روی 16 پروژه‌ی ناسا کار کردند و موفق به شناسایی 79.3% از کل اجزای معیوب شدند. (Porter & Selby, 1989) پدولسکی و کلارک در سال 1990 یک مدل رسمی بر اساس وابستگی‌های برنامه ارائه کردند. این وابستگی‌ها بر اساس ارتباط دو قسمت متن کد برنامه استخراج می‌شود. (Clarke & Pogdurski, 1990) در سال 1998 بینکلی و اسکاچ بر روی خطاهای زمان اجرا کار کردند و همچنین معیارهای وابستگی متصل43 را مطرح کردند. .آن‌ها کار خود را بر روی 4 پروژه به زبان‌های جاوا44، کوبول45، سی46 و سی پلاس پلاس47 بررسی نمودند. تحقیقات آن‌ها حاکی بر موفقیت آمیز بودن این معیارها در کیفیت طراحی نرم‌افزار بود. آن‌ها نشان دادند معیار وابستگی متصل در مقایسه با معیارهای متقابل48 عملکرد بسیار بهتری در پیش‌بینی خطاهای زمان اجرا49 دارند. (Binkley & Schach, 1998) بیون و وایتهد در سال 2003 گراف وابستگی و داده‌های تاریخی را برای شناسایی ناپایداری‌های برنامه ترکیب نمودند. (Bevan & Whitehead, 2003) پینگر در بر اساس اطلاعاتی که از سیر تکاملی و اطلاعات تاریخی پروژه‌های نرم‌افزاری بدست آورد پیوستگی‌های تصادفی بین اجزای کد مشاهده کرد که ممکن بود در آینده منجر به بروز خطا شوند. (Pinzger et al., 2005) شروتر در سال 2006 نشان داد که وابستگی‌های ورودی واقعی می‌تواند خطاهای را شناسایی کند و وابستگی‌های ورودی کامپایلر از وابستگی‌های ورودی واسط کاربر احتمال خطای بالاتری را ایجاد می‌کند (Schröter & Zeller, 2006) در یکی از تلاش‌های تیم مایکروسافت نشان داده شد تغییرات کد و وابستگی‌ها می‌تواند معیار موثری در شناسایی خطاهای پس از انتشار باشد. (Nagappan & Ball, 2007) ایده‌ی آن‌ها این بود که اگر جز A در کد برنامه وابستگی زیادی به جز دیگری مانند B داشته باشد و جز B در طول انتشارات مختلف تغییر بکند جز A برای هماهنگ بودن با جز B نیازمند تغییراتی می‌باشد این تغییرات معمولاً در طول وابستگی‌ها منتشر می‌شود. نگاپان و بال در این پژوهش بر روی ویندوز سرور 2003 نشان دادند درجه بالای وابستگی در کنار تغییرات کد می‌تواند باعث انتشار خطا در سراسر یک سیستم شود. زیمرمن و نگاپان در سال 2007 با کار بروی گراف وابستگی زیر سیستم‌های کد نشان دادند بین پیچیدگی گراف وابستگی و خطاهای پس از انتشار ارتباط بالایی وجود دارد و هنگامی مدل‌هایی پیش‌گویی بر اساس زیر سیستم‌هایی که در معماری بالاتر هستند ساخته می‌شوند بهتر عمل می‌کنند. (Zimmermann & Nagappan, 2007) در سال 2008 زیمرمن و نگاپان معیارهایی بر اساس وابستگی موجود در کد استخراج نمودند. (Zimmermann & Nagappan, 2008) این معیارها بر اساس مشاهدات آن‌ها از گراف وابستگی ویندوز سرور 2003 تعریف شده است. آن‌ها در بررسی گراف وابستگی ویندوز سرور 2003 مشاهده کردند گره‌های که حالت مرکزیت دارند و یا در مش50 ‏هایی با تعداد گره‌های زیاد قرار دارند از احتمال معیوب بودن بالایی برخوردارند بر اساس این مشاهدات این تیم تحقیقاتی معیارهایی تحت عنوان معیارهای شبکه استخراج نمود و کارایی آن‌ها را برای پیش‌بینی خطا در مقایسه با معیارهای پیچیدگی کد بررسی کرد که در این مقایسه معیارهای شبکه توانستند 60% از کل اجزای معیوب برنامه را شناسایی نمایند در صورتی که معیارهای پیچیدگی تنها موفق به شناسایی 30% از کل خطاها شدند. در سال 2009 تورهان با بررسی و آزمایشاتی نشان داد که معیارهای شبکه روی برنامه‌های بزرگ کارایی بهتری از معیارهای پیچیدگی دارند اما در نرم‌افزارهایی با حجم کوچک تفاوتی میان قدرت پیش‌بینی خطای معیارهای شبکه و معیارهای پیچیدگی وجود ندارد. (Torhun et al. 2009).
تلاشی که در این رساله صورت گرفته است در دسته معیارهای پیوستگی جای می‌گیرد.

3-درخت وابستگی:
همان‌طور که گفته شد جدیدترین روشی که در پیش‌بینی خطای نرم‌افزار مطرح شده است، مسأله مربوط به وابستگی‌های بین کلاس‌ها و همچنین بین ماژول‌ها51 می‌باشد. انواع وابستگی‌ها می‌توانند بین دو کلاس و یا دو ماژول مطرح شوند که تحقیقات نشان داده است که این وابستگی‌ها ارتباط بسیار زیادی با وجود خطاهای مفهومی دارند. مسأله‌ای که در این رساله تحقیق مطرح شده است، استفاده از یک تکنیک جدید بر پایه وابستگی‌های بخش‌های مختلف نرم افزار در سطح کد است. در گذشته استفاده از گراف‌های کنترل جریان52 متداول بوده که این گراف جریان داده‌ها را در هنگام اجرای برنامه مورد نظر قرار داده است و از این امر در مباحث مهندسی نرم افزار53 استفاده شده است اما، من در این طرح پیشنهادی از وابستگی کدها استفاده کرده‌ام که بر خلاف گراف کنترل جریان، وابستگی‌ها را در زمانی بررسی می‌کند که برنامه اجرا نشده است. این وابستگی‌ها می‌توانند شامل مواردی مانند وراثت، صدا زدن زیر رویه‌ها و ماژول‌ها و هرگونه وابستگی دیگری در کد باشند که این مسأله تنها محدود به برنامه نویسی شیء گرا نشده و می‌تواند برنامه‌های ساخت یافته را نیز پوشش بدهد چرا که در آنجا نیز ما شاهد وابستگی بین ماژول‌های برنامه، توابع و رویه‌ها هستیم.
برای بررسی این وابستگی‌ها و روابط آن با خطاها از مفهومی به نام داده کاوی استفاده می‌کنیم. حال سوال‌ این است که داده کاوی چیست؟
با پیشرفت سریع تکنولوژی و ورود فناوری اطلاعات بسیاری از حوزه‌ها، نیاز به داده‌ها، افزایش روز افزونی داشت. بعد از مدت کوتاهی پایگاه‌های داده بسیار عظیم با حجم بسیار گسترده‌ای از داده‌ها در سازمان‌ها، ادارات و مراکز مختلف به وجود آمدند.
حال جامعه علمی می‌توانند از چنین حجم گسترده‌ای از داده‌ها استفاده کرده و با پردازش، تحلیل و بررسی این داده‌های ذخیره شده، به روابط و اطلاعاتی دست پیدا بکنند که به هر نحوی برای سازمان و بخش مربوطه مفید واقع شود (Hand et al., 2001). ممکن است در میان حجم زیادی از داده‌ها، با روش‌های مختلف بتوان روابط خاصی پیدا کرد که از جنبه‌های مختلف برای بخش مربوطه دارای اهمیت باشد. ممکن است این اهمیت دارای جنبه اقتصادی و یا افزایش کارایی سیستم باشد.
داده کاوی، علمی است که روش‌ها و الگوریتم‌های متنوعی را در اختیار ما قرار می‌دهد تا بتوانیم از این حجم داده‌ها، با کشف الگوها54 و روابط، به اطلاعات ارزشمندی دست پیدا بکنیم.
به عبارتی «علم استخراج اطلاعات ارزشمند، از مجموعه داده‌ها و پایگاه‌های داده بزرگ» به عنوان داده کاوی شناخته می‌شود. (Hand et al., 2001).
لری کنستانتین در سال 1974 مفهوم وابستگی را معرفی کرد و این مفهوم به صورت گسترده‌ای در تحقیقات و کتاب‌ها و منابع مختلف، به صورت یک اصل در مهندسی نرم‌افزار مورد استفاده قرار گرفت. اما مفهوم وابستگی معرفی شده توسط کنستانتین از واژه Coupling یعنی جفتگری گرفته شده است. جفتگری همیشه به همراه مفهوم دیگری به کار برده شده است. این مفهوم، پیوستگی می‌باشد. قالبا جفتگری کم نشانه طراحی خوب نرم‌افزار است در حالی که پیوستگی کم نشان دهنده یک طراحی ضعیف می‌باشد. تأثیر این دو مفهوم بر یکدیگر به صورت عکس است و به گونه‌ای که در نمودار زیر مشاهده می‌نمایید، با افزایش جفتگری، پیوستگی کاهش پیدا می‌کند. (Constantine, 1996)

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

شکل 1: نمونه‌ای از وابستگی‌های میان کلاس‌ها.
برای مثال اگر در تصویر بالا کلاس A را در نظر بگیریم، ممکن است کلاس‌های دیگری مانند B و یا C به آن وابسته باشند. اگر تغییری در کلاس A اتفاق بیفتد، ممکن است روند تغییرات صورت گرفته به گونه‌ای باشد که یکی از کلاس‌های وابسته آن نتوانند مثل قبل با کلاس A ارتباط برقرار کنند و در نتیجه دچار بروز خطاهایی در بخش‌هایی از برنامه بشویم. از آنجایی که چنین خطاهایی اصولاً خطاهای نحوی را شامل نمی‌شوند، ممکن است یافتن آن‌ها قدری مشکل‌تر باشد.
حال سوالی که مطرح می‌شود این است که آیا روند پخش شوندگی خطا می‌تواند به همین طریق تا وابستگی‌های گذرا نیز ادامه پیدا کند یا خیر؟ برای توضیح بیشتر این امر، ابتدا وابستگی گذرا را توضیح خواهیم داد. فرض کنیم که تصویر قبل بخشی از یک گراف وابستگی بزرگ‌تر مانند گراف زیر باشد.

شکل 2: نمونه‌ای از وابستگی‌های پیچیده در میان کلاس‌ها.
در این صورت کلاس‌های E، F و D از طریق B دارای وابستگی‌های گذرا یا در اصطلاح Transitive نسبت به کلاس A هستند. به همین ترتیب وابستگی‌های گذرای دیگری را نیز می‌توان یافت برای مثال می‌توان به وابستگی گذرای G از طریق C به A اشاره نمود. در وابستگی‌های گذرا بیش از یک گره میانجی نیز می‌توانند مشارکت داشته باشند به گونه‌ای که برای مثال کلاس H از طریق مسیر F-B نسبت به کلاس A دارای وابستگی گذرا می‌باشد. بنا به مثال‌های نشان داده شده، یک وابستگی گذرا، نوعی از وابستگی است که در آن گره مبدأ از طریق یک یا چند گره میانی به گره مقصد وابسته باشد.
حال که مقصود از وابستگی گذرا روشن شد، می‌توانیم به صورت روشن‌تری سوال مطرح شده را بیان کنیم. آیا خطای موجود در یک گره، می‌تواند در نتیجه مسائلی مانند چرخش کد به وابسته‌های گذرای یک کلاس سرایت کند یا خیر؟
اگر دیدمان را از دیاگرام وابستگی نرم‌افزار به سمت یک گراف جهت دار سوق دهیم، می‌توانیم مسائلی را در مورد گراف جهت دار پیدا کنیم که پرورش دهنده ایده‌های مربوط به وابستگی هستند. اولین مسأله‌ای که بعد از طرح موضوع مربوط به وابستگی‌های گذرا به ذهن خطور می‌کند، الگوریتم‌های پیدا کننده کوتاه ترین مسیر بین دو گره مشخص در گراف هستند. معروف‌ترین این الگوریتم‌ها، الگوریتم وارشال است. الگوریتم وارشال همه مسیرهای ممکن در یک گراف، بین هر جفت از رأس‌ها را مقایسه می‌کند. این الگوریتم قادر است این کار را تنها با V2 مقایسه انجام دهد. این ملاحظه قابل توجهی می‌باشد که در یک گراف V2 یال وجود داشته باشد و هر ترکیبی از یال‌ها چک شده باشد. یک گراف G با راس‌های Vi که i از 1 تا N می‌باشد را در نظر بگیرید. علاوه بر این یک تابع به نام ShortestPath(i,j,k) را در نظر بگیرید که کوتاه‌ترین مسیر ممکن از i تا j را با استفاده از راس‌های 1 تا k که به عنوان راس‌های میانی در امتداد مسیر می‌باشند را بر می‌گرداند.
هم اکنون این تابع داده شده است. هدف ما پیدا کردن کوتاه‌ترین مسیر از هر i تا هر j تنها با استفاده از راس‌های 1 تا k+1 می‌باشد. دو کاندیدا برای این مسیر وجود دارد :
1- کوتاه‌ترین مسیری که فقط از راس‌های موجود در مجموعه‌ی (k,……..,1) استفاده می‌کند.
2- تعدادی مسیر که از i تا k+1 و سپس از k+1 تا j می‌روند وجود دارد که این مسیر بهتر می‌باشد.
(1).

ما می‌دانیم که بهترین مسیر از i تا j که فقط از راس‌های بین 1 تا k+1 استفاده می‌کند توسط ShortestPath(i,j,k) تعریف شده است و واضح است که اگر یک مسیر بهتر از i تا k+1 و از k+1 تا j وجود داشته باشد بنابراین طول مسیر بین i,j از الحاق کوتاه‌ترین مسیر از i تا k+1 و کوتاه‌ترین مسیر از k+1 تا j بدست می‌آید. بنابراین تابع ShortestPath(i,j,k) را در فرمول بازگشتی زیر ارائه می‌دهیم:
بنا به تعریف انجام شده، به نظر می‌رسد که الگوریتم وارشال می‌تواند در حل مسأله‌ای مانند یافتن بستار تعدی و وابستگی‌های گذرای گراف وابستگی نرم افزار قابلیت استفاده داشته باشد.
مسأله دیگری که خودنمایی می‌کند، حجم وابستگی‌ها در میان گروهی از گره‌های یک گراف است. در یک گراف جهت‌دار با n گره، میزان وابستگی‌ها می‌تواند در دامنه‌ای از صفر تا n(n-1) قرار بگیرد.
مشخصاً در گرافی که هیچ گونه وابستگی در آن وجود ندارد، ما تنها تعدادی گره مستقل خواهیم داشت. اما گرافی که در آن تمامی گره‌های آن به هم وابستگی دارند، در اصطلاح گراف کامل نامیده می‌شود. به یک گراف و یا زیر گراف کامل، در اصلاح کلیک گفته می‌شود. کلیک مبحثی است که مسائل بسیار زیاد و معروفی با عنوان مسائل کلیک در مورد آن مطرح شده‌اند. بعضی از این مسائل عبارتند از:
– یافتن کلیک‌ها با اندازه ثابت در یک گراف.
– یافتن تمامی کلیک‌های ماکزیمال در یک گراف.
– یافتن تمامی کلیک‌های ماکزیموم در یک گراف.
– …
مسأله جذاب و جالب دیگری که در مورد گراف‌ها خودنمایی می‌کند این است که مسأله کلیک، می‌تواند کمک کننده این باشد که قسمت‌هایی از گراف وابستگی نرم‌افزار را که بیشترین چگالی وابستگی ممکن در آن موجود است را پیدا کنیم و ارتباط آن را با خطا نشان دهیم.
کارپ در سال 1947 اثبات کرد که در کل مسائل مربوط به کلیک جزء مسائل ان پی-کامل هستند. به این معنی که هیچ الگوریتم قابل اجرا در زمان چند جمله‌ای برای این مسائل وجود ندارد. این مشکل در جایی خود را بیشتر نشان می‌دهد که گراف وابستگی یک نرم‌افزار معمولی ممکن است شامل چندین هزار گره باشد بنابراین به نظر می‌رسد که مسائل مربوط به کلیک، برخلاف جذابیت بسیاری که در زمینه وابستگی نرم‌افزار از خود نشان می‌دهند، به صورت عملی قابل استفاده نیستند. (Karp, 1975)
سوال دومی که مطرح می‌شود این است که آیا می‌توان از خصوصیات مسائل مربوط به کلیک در پیدا کردن نقاط مستعد خطای برنامه استفاده نمود یا خیر؟ این سوال از آنجا مطرح می‌شود که وقتی بتوان گروهی از گره‌های یک گراف را پیدا کرد که تشکیل یک کلیک را می‌دهند، در واقع بیشترین وابستگی‌های ممکن بین این گروه از گره‌ها اتفاق افتاده است. سوال این است که آیا این تراکم گره‌ها می‌تواند نشانه‌ای بر مستعد خطا بودن آن بخش از نرم‌افزار باشد یا خیر؟
4-فرضیات:
حال سوال این است که هدف از طرح مبحث مورد نظر چیست؟ به عبارتی به چه نتیجه‌ای می‌خواهیم برسیم؟ در پاسخ به این موضوع می‌توان اهدافی را برای ادامه کار مشخص کرد و این اهداف را در اینجا به صورت سوال‌ها و فرضیاتی مطرح می‌کنیم:
الف: آیا درخت وابستگی هیچ‌گونه ارتباطی با خطا دار بودن بخش‌های متناظر در برنامه دارد؟
ب: در صورت بودن ارتباط آیا درخت وابستگی می‌تواند به صورت معیاری برای پیش‌بینی خطا، به صورت عملی مورد استفاده قرار بگیرد؟
ج: عملکرد درخت وابستگی در قیاس با دیگر مشخصه‌های استفاده شده در پیش‌بینی خطا به چه صورتی است؟ آیا عملاً می‌توان بیان کرد که درخت وابستگی، خصوصیتی قابل مقایسه با دیگر مشخصه‌ها و متریک‌های مورد استفاده در پیش‌بینی خطا دارد یا خیر؟
5-جمع آوری داده:
برای پاسخگویی به سوالات و فرضیات مطرح شده در بخش قبل، بایستی آن را عملاً مورد آزمایش قرار داد. به همین منظور داده‌ها و ابزارهای مورد نیاز که در این آزمایش مورد استفاده قرار گرفته‌اند در بخش جمع‌آوری داده معرفی می‌شوند.
ابزارهای بسیاری در این راه مورد استفاده قرار گرفت و خروجی‌های متنوعی به دست آمد که در نهایت بخشی از آن‌ها عملاً قابلیت تحلیل و استفاده را در اختیار قرار می‌دادند. برای ابزارها و داده‌های مورد استفاده روند کار را توضیح خواهیم داد.
1- انتخاب نرم افزار: مقصود از نرم افزار، کد منبعی است که برای انجام آزمایشاتمان مورد باید مورد بررسی قرار بگیرد. با مروری بر انواع برنامه‌ها و مجموعه داده‌های استاندارد که در تحقیقات دیگر مورد بررسی و مطالعه قرار گرفته بود و انواع روش‌های پیش‌بینی خطا و یا تشخیص خطا بر روی آن‌ها آزمایش شده بود، می‌شد به این نتیجه رسید که نسخه‌هایی از برنامه اکلیپس و آپاچی بهترین گزینه برای انجام آزمایشات می‌باشند.
1.1- اکلیپس: یک محیط برنامه‌نویسی چند زبانه55 می‌باشد که از یک هسته مرکزی ساده تشکیل شده که با افزودن افزونه‌های56 مختلف به آن، می‌توان امکانات مورد نیاز برای هر توسعه دهنده‌ای57 را به آن اضافه نمود. این محیط برنامه نویسی در ابتدا برای توسعه برنامه‌های مختلف به زبان جاوا به کار برده می‌شد اما در ادامه با افزودن افزونه‌های مختلف به آن امکان توسعه برنامه‌ها به زبان‌هایی همچون C++، Ruby، Payton و Perl فراهم شد. اکلیپس بر اساس چارچوب مهندسی نرم‌افزار شیء گرا طراحی شده است. از سال 2006، بنیاد اکلیپس نسخه‌هایی را سالانه منتشر کرده و هر نسخه را بر اساس نام ماه‌های سال نام‌گذاری می‌کند. که از آن جمله می‌توان به نسخه‌های ایندیگو58، هلیوس59، گالیله60، گانیمده61، اروپا62 و کالیستو63 اشاره نمود.
2.1-آپاچی تام کت64 : یک سرورلت متن باز است که توسط بنیاد نرم‌افزار آپاچی65 توسعه یافته است. آپاچی تامکت، مشخصه‌های سرورلت جاوا، صفحات JSP66 و همچنین یک محیط سرور ساده HTTP را پیاده‌سازی می‌نماید.
در کل چند دلیل برای انتخاب مجموعه داده‌های مذکور جهت بررسی و آزمایش بر روی آن‌ها وجود دارد که از قرار زیر است:
– نسخه‌های متعددی از ابزارهای مذکور موجود است.
– ابزارها همگی متن باز بوده و قابلیت این را دارند که توسط ابزارهای کمکی بر روی آن‌ها آنالیز انجام داد و یا مشخصه‌های مورد نیاز را از آن‌ها استخراج نمود.
– در تحقیقات متعددی، محققین از ابزارهای مذکور استفاده کرده‌اند و هرکدام از آن‌ها تقریباً به صورت یک مجموعه داده استاندارد برای تحقیق و آزمایش شناخته می‌شوند.
– لیست کلاس‌ها و فایل‌های دارای خطا برای ابزارهای مذکور موجود می‌باشد.
2- استخراج وابستگی‌های نرم افزار: در ابتدا، برای بررسی وابستگی‌های نرم افزار نیاز داشتیم که بتوانیم این وابستگی‌ها را از کد و یا باینری‌های برنامه، استخراج کنیم و خروجی باید به نحوی باشد که از طریق ابزارهای دیگر قابل بررسی و مطالعه باشد. برای استخراج وابستگی‌های نرم‌افزار، ابزارهای مختلفی مورد بررسی قرار گرفت که در نهایت بهترین ابزاری که بر اساس نوع خروجی انتخاب شد، ابزار CDA بود. CDA مخفف Class Dependency Analyzer است که همان‌طور که از نامش پیداست، ابزاری خاص برای استخراج وابستگی‌های موجود میان کلاس‌های برنامه‌های نوشته شده به زبان جاواست. بزرگ‌ترین نقطه قوت CDA این است که این ابزار می‌تواند وابستگی را در سطوح مختلف بررسی نماید که شامل:
– یک کلاس مجزا.
– تمامی کلاس‌ها در یک Package
– تمامی کلاس‌ها در یک Container
در خروجی نیز نتایج در هر سه سطح Class Level، Package Level و Container Level ارائه می‌شوند. این ابزار همچنین خروجی را که شامل تمامی وابستگی‌های موجود در میان کلاس‌های برنامه ورودی می‌باشد، به صورت یک فایل XML در اختیار قرار می‌دهد.

شکل 3: تصویری از نمای کلی برنامه Class Dependency Analyzer
در بالا تصویری از محیط کلی CDA را مشاهده می‌نمایید. در این تصویر، لیستی از کلاس‌ها و کلاس‌های واسطی67 را مشاهده می‌نمایید که کلاس ClassTableModel به آن‌ها وابسته است.

شکل 4: نمونه‌ای از کلاس دیاگرام نمایش داده شده در برنامه Class Dependency Analyzer
در بالا، مسیرهای وابستگی از کلاس RepeatedTest به کلاس واسط TestListener نشان داده شده است.

شکل 5: نمایش تمامی کلاس‌های وابسته به یک کلاس خاص در برنامه Class Dependency Analyzer

و در تصویر بالا، تمامی کلاس‌هایی را که به کلاس TableEditorModel وابسته هستند، مشاهده می‌نمایید.
3- تشکیل ماتریس وابستگی: در ادامه، برای بررسی فایل‌های حجیم XML خروجی نیاز به ابزاری بود که بتواند از این فایل، یک گراف وابستگی را بدست آورد. ابزار مورد نظر را به زبان C#.net نوشتیم. ابزار نوشته شده، به گونه‌ای عمل می‌کند که می‌تواند از وابستگی‌های تشخیص داده شده در خروجی CDA یک ماتریس صفر و یک را تشکیل می‌دهد. هر گره یک در ماتریس، وابستگی دو گره مربوط در سطر و ستون را نمایش می‌دهد. از آنجایی که گراف مورد نظر ما یک گراف جهت دار است، بنا بر این سطرها، نشان دهنده گره وابسته در وابستگی به نمایش آمده می‌باشند.

شکل 6: نمونه‌ای از یک گراف جهت دار.
بنا بر توضیحات ارائه شده، اگر یک گراف وابستگی جهت دار به شکل بالا داشته باشیم، آنگاه ماتریس همسایگی آن به صورت زیر خواهد بود:

شکل 7: ماتریس وابستگی مربوط به گراف جهت دار در شکل شماره 6
4- تشکیل درخت وابستگی برای هر گره: اولین قدم برای تشکیل درخت وابستگی شمارش وابستگی‌های مستقیم گره‌ها می‌باشد. معروف‌ترین راهی که برای شمارش تمامی وابستگی‌های یک گره می‌تواند مطرح باشد، استفاده از الگوریتم وارشال، به شیوه‌ای که در بخش قبل توضیح داده شد می‌باشد. با شمارش وابستگی‌های مستقیم، می‌توان خروجی‌های هر گره را در دست داشت. از طرفی می‌توان به این وابستگی‌ها به چشم یک درخت با عمق 1 نگاه کرد که ریشه آن، گره مورد نظر و برگ‌های آن، گره‌هایی می‌باشند که ریشه به آن‌ها وابسته است.
ایده‌آل‌ترین حالت این است که ابتدا تمامی مسیرهای ممکن را به وسیله الگوریتم وارشال محاسبه بنماییم و سپس شروع به شمارش وابستگی‌های هر گره بکنیم اما وجود دو مشخصه در کار ما مانع از انجام این امر می‌شد:
– الگوریتم وارشال یک الگوریتم از درجه 3 می‌باشد.
– حجم ماتریس وابستگی در این آزمایشات بسیار بزرگ است به گونه‌ای که ماتریس در برخی مواقع شامل بیش از 12000 سطر و ستون می‌باشد.
زمان اجرای الگوریتم وارشال بر روی گراف‌های با این اندازه بسیار زمان‌بر می‌باشد که با توجه به منابع سخت افزاری محدود در دسترس قادر به اجرای آن نبودیم و علاوه بر آن این روش برای پیدا کردن خطا بهینه نمی‌باشد.
راه حل دیگری که به ذهن می‌رسید، پیاده سازی الگوریتم دیگری بود که مشابه وارشال عمل کند اما میزان پردازش‌ها را تا یک سقف معین محدود نماید. این راه حل دو مزیت به همراه داشت:
– ما می‌توانستیم تعداد وابستگی‌ها یا به عبارتی مسیرها را تا هر سطح دلخواه شمارش کرده و از هر کدام از نتایج به دست آمده برای بهبود نتایج پیش‌بینی خطا استفاده نماییم.
– الگوریتم بر روی منابع محدودتر قابل پیاده سازی است.
بنا بر این اقدام به پیاده سازی روشی کردیم که همچون الگوریتم وارشال شروع به یافتن تمامی مسیرهای موجود در گراف مورد نظر می‌کند اما این مسیرها را تا عمق محدودی که معین می‌شود، دنبال می‌کند. بنا بر این با استفاده از الگوریتم مورد نظر، شروع به شمارش وابستگی‌های مستقیم گره کردیم و در ادامه وابستگی‌ها را تا عمق‌های 2 و 3 ادامه دادیم.
شیوه شمارش وابستگی‌ها به گونه‌ای است که هر گره به عنوان ریشه انتخاب می‌شود. سپس وابستگی‌های مستقیم ریشه به عنوان برگ‌های اولین درخت تشکیل شده با عمق یک، شمارش شده و نگهداری می‌شود. در ادامه وابستگی‌های موجود در برگ‌های درخت به دست آمده را محاسبه می‌کنیم؛ و اقدام به تشکیل یک درخت جدید با عمق 2 می‌کنیم. در این حالت، تمامی گره‌های درخت دوم را نیز محاسبه کرده و آن را برای استفاده در عمل پیش‌بینی خطا ثبت می‌کنیم. در کل، تشکیل درخت‌های با عمق n با استفاده از درخت‌های یا عمق n-1 به همین شیوه صورت می‌پذیرد و در هر مرحله تمامی گره‌های موجود شمارش شده و برای استفاده در عمل پیش‌بینی خطا نگهداری می‌شود.
بنا بر توضیحات داده شده، اگر روش بالا را برای گره A در گراف شکل (1) پیاده کنیم و درخت آن را تشکیل بدهیم، درخت مورد نظر به صورت زیر نمایش داده خواهد شد:

شکل 8: درخت وابستگی تشکیل شده از روی ماتریس وابستگی شکل 7
با نگاهی به گراف شکل (1) مشاهده می‌کنیم که گره A، به سه گره B، E و F وابسته می‌باشد. که در تصویر شماره 3 نیز این وابستگی‌ها مشهود است. نکته دیگری که مورد توجه است، وجود 3 مسیر متفاوت وابستگی از گره A به گره E می‌باشد که در این درخت می‌توان هر سه مسیر وابستگی را مشاهده نمود.
وجود یک عدد مرزی برای در نظر گرفتن محدودیت منابع برای شمارش وابستگی و همچنین در نظر گرفتن وابستگی‌ها در هر سطح مجزا مسأله دیگری است که در مثال ذکر شده مشاهده می‌گردد. برای مثال در شکل بالا ما حداکثر تا عمق 2 وابستگی‌ها را بررسی کرده‌ایم. گرچه برای گراف مذبور عمق وابستگی بیشتر از 2 نیست اما برای گراف‌های بزرگ‌تر با چندین هزار گره مطمئناً محدودیت منابع می‌تواند بسیار چالش بر انگیز باشد و ما مطمئناً به یک عدد مرزی جهت محدود نمودن عمق درخت تشکیل شده برای هر گره، نیازمندیم.
با شمارش تعداد گره‌های هر کدام از درخت‌های به دست آمده در هر سطح می‌توان گروهی از اعداد متناظر با هر فایل را به دست آورد. هر گروه از اعداد را می‌توان به عنوان یک ویژگی در نظر گرفت. با داشتن یک ویژگی در ازای هر درخت می‌توان عمل داده‌کاوی را بر روی داده‌های به دست آمده آزمایش کرد تا ارتباط مسأله و فرضیات طرح شده با خطا دار بودن یا نبودن گره‌ها مشخص گردد.
5- استخراج متریک‌های استاندارد برای مقایسه و بررسی نتایج: یکی از بهترین راه حل‌ها برای بررسی نتایج به دست آمده از روی داده‌های مختلف، استفاده از متریک‌های استانداردی است که پیش از این مورد استفاده قرار می‌گرفتند. به همین منظور سه دسته از متریک‌های قابل استخراج از برنامه‌های معرفی شده را توسط نرم افزاری به نام Prest استخراج نموده و نتایج را به گونه‌ای که در متن همین پایان نامه توضیح داده خواهد شد مقایسه خواهیم کرد. متریک‌های استخراج شده توسط Prest، در تحقیقات افرادی برجسته‌ای مانند آقای تورهان مورد استفاده و مقایسه قرار گرفته است.

5-تحلیل و مقایسه:
در بخش آنالیز و مقایسه، برای بررسی عملکرد ویژگی‌های تعریف شده و بررسی آن از دیدگاه‌های مختلف از چند جنبه مسأله را مورد بررسی قرار می‌دهیم:
– بررسی رفتاری: به معنی بررسی رفتار گره‌های مستعد خطای گراف وابستگی در مقابل افزایش یافتن هرکدام از ویژگی‌های تعریف شده.
– مقایسه: مقایسه شیوه عملکرد ویژگی‌های تعریف شده، در مقابل شیوه‌های استانداردی که تا پیش از این مورد استفاده قرار گرفته بود.
بررسی رفتاری:
اگر تصور کنیم که یک نرم‌افزار دارای درصد خاصی از خطاها است، برای مثال اگر تصور کنیم که 15 درصد کلاس‌ها یا ماژول‌های یک برنامه خطا دار باشد، با انتخابی تصادفی از میان ماژول‌ها یا کلاس‌ها به طور منطقی پراکندگی خطا در میان کلاس‌های انتخاب شده به صورت میانگین باید عددی نزدیک به 15 باشد؛ و اگر این عمل را به صورت مداوم انجام دهیم، میانگین پراکندگی خطا در هرکدام از دسته‌های انتخاب شده بر



قیمت: تومان

دسته بندی : مقاله و پایان نامه

دیدگاهتان را بنویسید

دانشکده آموزش‌های الکترونیکی.
پایان‌نامه کارشناسی ارشد در رشته مهندسی فناوری اطلاعات (تجارت الکترونیک)

استفاده از داده کاوی در پیش‌بینی خطای نرم‌افزار بر اساس متریک‌های کد و وابستگی

به کوشش:
جواد کامیابی

استاد راهنما:
دکتر اشکان سامی

دی 1390

به نام خدا

اظهار نامه

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

نام و نام‌خانوادگی

تاریخ و امضا

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

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

و من الله توفیق
جواد کامیابی
20 آذر 1390

چکیده:

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

به کوشش

جواد کامیابی

تضمین کیفیت نرم‌افزار همیشه دارای محدودیت‌های زمان و هزینه بوده است. به منظور رسیدن به کیفیت بالا و کاهش محدودیت‌ها، مدیران همواره سعی کرده‌اند تا بخش‌های مستعد خطا را در نرم‌افزار پیش‌بینی نمایند و منابع مذکور را به صورت موثری به این بخش‌ها اختصاص دهند. پیش از این، محققین روش‌های خودکاری را برای کمک به مدیران در این امر مهم معرفی و از آن‌ها استفاده کرده‌اند. روش‌های خودکار مذکور با استفاده از اندازه گیری معیارهای مختلف نرم‌افزار و یافتن ارتباط میان این معیارها و خطاهای نرم‌افزاری، همواره سعی در افزایش سرعت و دقت در پیش‌بینی خطا داشته‌اند. به نوعی می‌توان این معیارها را در چهار دسته که عبارتند از معیارهای پیچیدگی، داده‌های تاریخی، معیارهای طراحی و معیارهای وابستگی، قرار داد. اگرچه معیارهای استفاده شده، تا حدودی موثر هستند اما هنوز هیچکدام موفق به پیش‌بینی تمامی خطاهای موجود نشده‌اند. در این رساله، ما با توسعه دادن مفهوم وابستگی در نرم‌افزار، به معرفی مفهوم جدیدی به نام درخت وابستگی می‌پردازیم. این مفهوم به ما کمک می‌کند تا با در نظر گرفتن تمامی وابستگی‌های مستقیم و غیر مستقیم در بین اجزای نرم‌افزار، معیارهای جدیدی را استخراج نماییم که این معیارها می‌توانند عملاً نتایج مطلوب‌تری را نسبت به معیارهای پیشین، در پیش‌بینی خطا ارائه دهند.

فهرست مطالب
عنوان صفحه
1-مقدمه:14
2- پیشینه پژوهشی:16
2-1-معیارهای نرم‌افزار16
2-2-معیارهای وابستگی:17
2-3-معیارهای تاریخی:17
2-4-بررسی فعالیت‌های گذشته18
2-4-1- بررسی فعالیت‌ها در زمینه معیارهای کد :18
2-4-2- بررسی فعالیت‌ها در زمینه معیارهای تاریخی:20
2-4-3- بررسی فعالیت‌ها در زمینه معیارهای وابستگی:22
3-درخت وابستگی:26
4-فرضیات:33
5-جمع آوری داده:34
5-تحلیل و مقایسه:44
6-نتیجه گیری:76
7-مراجع:77

فهرست تصاویر

عنوان صفحه
شکل 1: نمونه‌ای از وابستگی‌های میان کلاس‌ها29
شکل 2: نمونه‌ای از وابستگی‌های پیچیده در میان کلاس‌ها30
شکل 3: تصویری از نمای کلی برنامه Class Dependency Analyzer37
شکل 4: نمونه‌ای از کلاس دیاگرام نمایش داده شده در برنامه Class Dependency Analyzer37
شکل 5: نمایش تمامی کلاس‌های وابسته به یک کلاس خاص در برنامه Class Dependency Analyzer38
شکل 6: نمونه‌ای از یک گراف جهت دار39
شکل 7: ماتریس وابستگی مربوط به گراف جهت دار در شکل شماره 639
شکل 8: درخت وابستگی تشکیل شده از روی ماتریس وابستگی شکل 742
شکل 9: متغیر تصادفی، انحراف معیار σ حول محور μ53

فهرست نمودارها

عنوان صفحه
نمودار 1: ارتباط بین جفتگری و انسجام28
نمودار 2: بررسی رفتار معیار دقت در هنگام افزایش وابستگی درجه 146
نمودار 3: بررسی رفتار معیار دقت در هنگام افزایش وابستگی درجه 246
نمودار 4: بررسی رفتار معیار دقت در هنگام افزایش وابستگی درجه 347
نمودار 5: مقایسه نتیجه «دقت» در دسته بندی سه نسخه اکلیپس54
نمودار 6: مقایسه نتیجه «فراخوانی» در دسته بندی سه نسخه اکلیپس55
نمودار 7: مقایسه نتیجه «صحت» در دسته بندی سه نسخه اکلیپس56
نمودار 8: مقایسه نتیجه «معیار F» در دسته بندی سه نسخه اکلیپس56
نمودار 9: مقایسه نتیجه «منحنی مشخصه عملکرد» در دسته بندی سه نسخه اکلیپس57
نمودار 10: مقایسه نتیجه «کاپا» در دسته بندی سه نسخه اکلیپس57
نمودار 11: مقایسه نتیجه «انحراف معیار» در دسته بندی سه نسخه اکلیپس58
نمودار 12: مقایسه نتیجه «دقت» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی59
نمودار 13: مقایسه نتیجه «فراخوانی» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی60
نمودار 14: مقایسه نتیجه «صحت» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی60
نمودار 15: مقایسه نتیجه «معیار F» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی61
نمودار 16: مقایسه نتیجه «منحنی مشخصه عملکرد» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی61
نمودار 17: مقایسه نتیجه «کاپا» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی62
نمودار 18: مقایسه نتیجه «انحراف معیار» در دسته بندی آپاچی بر روی متریک‌های کد و درخت وابستگی62
نمودار 19: قیاس نتیجه «دقت» در دسته‌بندی بر روی کل داده‌ها64
نمودار 20: قیاس نتیجه «فراخوانی» در دسته‌بندی بر روی کل داده‌ها65
نمودار 21: قیاس نتیجه «صحت» در دسته‌بندی بر روی کل داده‌ها66
نمودار 22: قیاس نتیجه «معیار F» در دسته‌بندی بر روی کل داده‌ها66
نمودار 23: قیاس نتیجه «منحنی مشخصه عملکرد» در دسته‌بندی بر روی کل داده‌ها67
نمودار 24: قیاس نتیجه «کاپا» در دسته‌بندی بر روی کل داده‌ها67
نمودار 25: قیاس نتیجه «انحراف معیار» در دسته‌بندی بر روی کل داده‌ها68

1-مقدمه:
یکی چالش بر انگیزترین موضوعات مطرح در تضمین کیفیت1، در شرکت‌های سازنده نرم افزار، موضوع رفع خطاهای نرم افزار است. خطاهای نرم افزاری می‌توانند در زمان پیش و یا پس از انتشار2 نرم افزار تشخیص داده شوند. اما منابعی که می‌توان برای تشخیص و تصحیح خطاها در نظر گرفت محدود است (Kamyabi et al.).
خطاها را می‌توان به دو دسته کلی تقسیم کرد. خطاهای نحوی3 و خطاهای مفهومی4. با توجه به‌این که ابزارهای خودکار بسیار قدرتمندی برای تشخیص خطاهای نحوی وجود دارند، احتمال‌این که خطایی ازاین دست تا زمان انتشار تشخیص داده نشود، بسیار کم است. خطاهای مفهومی به آن دسته از خطاها اشاره دارد که در اثر مشکلاتی جدای از اشتباهات نحوی و خطاهای انسانی ملموس اتفاق می‌افتند و معمولاً در اثر عدم هماهنگی در بخش‌های مختلف کد و گاهی به صورت بسیار ناملموس به وجود می‌آیند که در اینجا به سادگی نمی‌توان با بررسی کد، این‌گونه خطاها را تشخیص داد. بنا بر این در مورد خطاهای مفهومی داستان فرق می‌کند چرا که عوامل بسیار زیادی می‌توانند در بروزاین‌گونه از خطاها دخیل باشند. (Zimmermann & Nagappan, 2008) بنا براین همواره سعی شده است که با اندازه گیری معیارهای5 مختلف و استفاده از آن‌ها در روش‌های پیش‌بینی خودکار خطا، سرعت و دقت را در امر تست نرم افزار افزایش دهند. طی تحقیقاتی که تا کنون صورت گرفته، متداول‌ترین معیارهای استفاده شده در پیش‌بینی اتوماتیک خطا، معیارهای پیچیدگی6 است. (Zimmermann & Nagappan, 2008) اما جدیدترین روشی که مطرح شده است، مسأله مربوط به وابستگی‌های بین کلاس‌ها7 و همچنین بین ماژول‌ها می‌باشد. انواع وابستگی‌ها می‌توانند بین دو کلاس و یا دو ماژول8 مطرح شوند که تحقیقات نشان داده است که این وابستگی‌ها ارتباط بسیار زیادی با وجود خطاهای مفهومی دارند.
برای اجرای روشمند و علمی روند یافتن روابط و الگوهای مناسب برای پیش بینی خطا بر اساس معیارهای قابل اندازه گیری، از مفهومی به نام داده‌کاوی استفاده خواهیم کرد که در تشریح و بیان مسأله به آن خواهیم پرداخت.
دراین پایان نامه، سعی می‌کنیم که به بررسی چنین وابستگی‌هایی بپردازیم و بر اساس روابط موجود بین وابستگی و وجود خطا در نرم افزار، وجود خطا در کد را پیش بینی نماییم.
در ادامه این رساله در بخش دوم به بررسی تحقیقات قبلی انجام شده در این زمینه می‌پردازیم، در بخش سوم به بیان انگیزش و نحوه به وجود آمدن ایده کار شده در این رساله می‌پردازیم، در بخش چهارم فرضیات مورد بررسی را مطرح می‌کنیم، در بخش پنجم داده‌ها و ابزارهای جمع آوری شده برای انجام عملی آزمایشات را معرفی می‌کنیم، در بخش ششم به بیان شیوه و نوع آزمایشات و بیان نتایج آنالیزها و نتایج می‌پردازیم و در بخش هفتم و پایانی این رساله سعی در نتیجه‌گیری از آزمایشات انجام شده خواهیم داشت.
2- پیشینه پژوهشی:

تلاش‌های گذشته با هدف پیش‌بینی خطا را در سه گروه مورد بررسی قرار می‌دهیم: معیارهای نرم‌افزار9، معیارهای وابستگی10 و معیارهای تاریخی11. ابتدا به بیان توضیحی در مورد شیوه کار کردن این معیارها می‌پردازیم.
2-1 معیارهای نرم‌افزار:

معیارهای نرم‌افزار برای اندازه‌گیری درجه پیشرفته بودن یک محصول و یا یک فرآیند نرم‌افزاری به کار می‌روند. معیارهای نرم‌افزاری به چندین گروه تقسیم می‌شوند: معیارهای محصول12، معیارهای فرآیند13، معیارهای پروژه14 و معیارهای منبع15. معیارهای نرم‌افزاری که در پیش‌بینی خطا به کار می‌روند معیارهای محصول می‌باشند که از مشخصات کد سیستم نرم‌افزاری استخراج می‌شوند. این معیارها به سه گروه تقسیم می‌شوند: معیارهای اندازه16، معیارهای پیچیدگی17 و معیارهای کیفیت18. (Mills, 1988) معیارهای اندازه بر اساس تعداد خطوط کد برنامه محاسبه می‌شوند مانند تعداد کل خطوط برنامه19، تعداد خطوط توضیحات20 و … معیارهای میزان نگهداشت‌پذیری21 و قابلیت تست برنامه وابسته است از جمله معروف‌ترین معیارهای پیچیدگی معیارهای پیچیدگی مک کیب22 و معیارهای هالستد23 می‌باشند. معیارهای مک‌کیب پیچیدگی کد را بر اساس تعداد مسیرهای کنترلی محاسبه می‌نماید. (McCabe, 1976) هالستد معیارهای خود را بر اساس ارتباطات ریاضی بین اجزای کد، پیچیدگی کد و نوع زبان برنامه نویسی مطرح کرد. (Halstead M. H., 1975) معیارهای اتصال24 و پیوستگی25 از معروف‌ترین معیارهای کیفیت می‌باشند که بالا و یا پایین بودن اندازه این دو معیار نشان دهنده کیفیت محصول و یا فرآیند نرم‌افزاری است. (Pressman, 1982) معیارهای کیفیت معیارهایی میباشند که درجه آن‌ها می‌تواند تولیدکنندگان نرم‌افزار را در مورد توانایی دست کار کردن سیستم‌شان مطمئن سازد.

2-1- معیارهای وابستگی:

معیارهای وابستگی معیارهایی هستند که بر اساس ارتباط اجزای کد نرم‌افزار محاسبه می‌شوند. این ارتباط می‌تواند بین سطوح مختلف کد مطرح شود مانند سطح فایل، کلاس، تابع … نوع ارتباط و یا به عبارت دیگر وابستگی موجود بین اجزای کد نیز می‌تواند متفاوت باشد مانند وابستگی داده26 که بر اساس تعریف و استفاده از داده می‌باشد و یا وابستگی صدا زدن27 که بر اساس تعریف و صدا زدن مؤلفه‌ها می‌باشد. (Zimmermann, 2008 & Nagappan )

2-2- معیارهای تاریخی:

این دسته از معیارهای بر اساس تغییراتی که در بین چندین انتشار28 مختلف از یک سیستم نرم‌افزاری رخ می‌دهد تعریف می‌شوند. این تغییرات می‌توانند اضافه شدن، حذف شدن، تغییر یافتن مؤلفه‌های جز مربوطه در بین چندین انتشار باشند. محدودیتی که در به کار بردن این معیارها وجود دارد این است که محاسبه این معیارهای تنها برای محصولات نرم‌افزاری مقدور می‌باشد که دارای چندین انتشار باشند و همچنین اطلاعات کامل در مورد انتشارات قبلی موجود باشد.

2-3- بررسی فعالیت‌های گذشته:

در ادامه به بررسی تلاش‌های گذشته در زمینه پیش‌بینی خطا می‌پردازیم.
2-3-1- بررسی فعالیت‌ها در زمینه معیارهای کد :
در اولین مطالعات در زمینه پیش‌بینی خطا، آکیاما در سال 1971 بر روی یک سیستم که در فوجیتسو ژاپن توسعه یافته بود کار کرد و نشان داد معیارهای پیچیدگی نرم‌افزار و معیارهای اندازه نرم‌افزار در پیش‌بینی خطا موفق عمل می‌نمایند. (Akiyama, 1971) فردینند در سال 1974 ارتباط تعداد خطا با تعداد اجزای کد را بررسی نمود و به این نتیجه رسید که تعداد اجزای کد با تعداد خطا در ارتباط است. (Ferdinand A. , 1974) در سال 1975 هالستد معیارهای نرم‌افزاری را ارائه داد که بر اساس پیچیدگی زبان برنامه‌نویسی عمل می‌نمودند. هالستد از این معیارها برای پیش‌بینی خطا استفاده کرد و نشان داد معیارهای پیچیدگی هالستد در پیش‌بینی خطا موفق عمل می‌نمایند. این معیارها با نام معیارهای هالستد شناخته می‌شوند. (Halstead M. H., 1975) چیدمبر و کمرر در سال 1994 بر روی سیستم‌های شی گرا کار کردند و شش معیار طراحی برای این نوع سیستم معرفی کردند. این معیارها با نام معیارهای طراحی چیدمبر و کمرر شناخته می‌شوند. (Chidamber & Kemerer, 1994) باسیلی در سال 1996 از معیارهای چیدمبر و کمرر به منظور پیش‌بینی خطا استفاده نمود و نشان داد معیارهای چیدمبر و کمرر عملکرد موفقی در پیش‌بینی خطا دارند. (Basili et al., 1996) در سال 1996 اوهلسون و آلبرگ معیارهای پیچیدگی را به منظور پیش‌بینی ماژول‌های از کد به کار بردند که در طول اجرا دچار خطا می‌شدند. مدل پیش گویی کننده آن‌ها 20 درصد از ماژول‌هایی از کد را شناسایی می‌کرد که شامل 47 درصد از کل خطاها بودند. (Ohlsson & Alberg, 1996) زائو در سال 1998 به بررسی معیارهای طراحی نرم‌افزار پرداخت و عملکرد آن‌ها در پیش‌بینی خطا را محاسبه نمود. زائو نشان داد که معیارهای طراحی به خوبی در پیش‌بینی خطا عمل می‌نمایند. (Zhao M. et al., 1998) در سال 2006، ناپاگان معیارهایی برای پیش‌بینی خطاهای پس از زمان انتشار شناسایی را کرد و گزارش مبنی بر اینکه چگونه به طور سیستماتیک پیش‌بینی کننده‌های خطاهای پس از زمان انتشار بر اساس تاریخچه29 ساخته شوند، را ارائه داد. (Nagappan et a., 2006) شروتر، زیمرمن و زلر در سال 2006 با استفاده از مهندسی معکوس30 نشان دادند معیارهای طراحی در پیش‌بینی خطاهای پس از اجرا موفق عمل می‌نمایند (Schröter et al., 2006) منزیس در سال 2007 با کار بر روی چند پروژه و با استفاده از معیارهای نرم‌افزار مدل پیش‌بینی خطایی طراحی نمود که توانست 71 درصد از کل خطاهای برنامه را با نرخ خطای 25 درصد شناسایی نماید (Menzies et al., 2007) در سال 2008 جیانگ کارکرد معیارهای سطح کد31 و معیارهای سطح طراحی32 را بر روی 13 محصول نرم‌افزاری با یک دیگر مقایسه نمود. نتایج حاکی از عملکرد بهتر معیارهای سطح طراحی نسبت به معیارهای سطح کد و ترکیب دو گروه معیار در پیش‌بینی خطا بود. (Jiang et al, 2008) در سال 2010 منزیس و گروهی دیگر با تلاش‌های گذشته نشان دادند که معیارهای کد معیارهای موفقی در پیش‌بینی کد هستند و این معیارها را به عنوان معیارهای با استفاده راحت و مفید معرفی نمودند. (Menzies et al., 2010) در مطالعه‌ای که بر روی چندین پروژه عظیم نرم‌افزاری در ترکیه انجام (Menzies et al., 2010)، مدل پیش‌بینی کننده که بر اساس معیارهای کد عمل می‌نمود را از طریق طبقه بندی نایو بیز33 اصلاح نموده و به بهبود 8 درصدی نسبت به گذشته دست یافتند. در یکی از تحقیقاتی که در سال 2010 بر روی پروژه‌های متن باز34 صورت گرفت توانایی معیارهای اندازه‌گیری متن با طبقه بندی نایو بیز و معیارهای پیچیدگی با آنالیز رگرسیون35 در پیش‌بینی خطاهای نرم‌افزار مورد مقایسه قرار گرفتند. این پژوهش نشان داد معیار اندازه گیری متن از فراخوانی36 بالاتر و معیار پیچیدگی از دقت37 بالاتری برخوردار هستند. (Hideaki & Osamu, 2010) معیارهای طراحی معیارهای موفقی در پیش‌بینی خطا هستند اما در بسیاری از پروژه‌های نرم‌افزاری معیارهای سطح کد موجود نیستند از اینرو سامی و فخراحمد در سال 2010 معیارهای طراحی را بر اساس معیارهای کد تخمین زدند که این معیارها با معیارهای واقعی سطح طراحی تفاوت اندکی دارند. (Sami & Fakhrahmad, 2010)
2-3-2- بررسی فعالیت‌ها در زمینه معیارهای تاریخی:
خوش گفتار در سال 1996 بر روی دو سیستم بزرگ ارتباطی کار کرد و در مدل پیش بینی خود ماژول‌هایی را به عنوان ماژول معیوب پیش‌بینی نمود که تعداد خطوط کد آن در انتشارهای مختلف تغییر می‌کند. (McMullan et al., 1996) هودپل (Hudepohl et al., 1996) توانست با استفاده از ترکیب معیارهای پیچیدگی و داده‌های تاریخی پیش‌بینی نماید آیا یک ماژول دارای خطا می‌باشد یا خیر. در این تحقیق همان‌گونه که از اطلاعات با استفاده مجدد38، استفاده شد معیارهای طراحی نرم‌افزار نیز در پیش‌بینی خطا مورد استفاده قرار گرفت با این فرض که ماژول‌های جدید و یا تغییر یافته چگالی خطای بالاتری دارند. گریوز با استفاده از یک سیستم بسیار بزرگ و با طول عمر طولانی، نشان داد که معیارها بر اساس اطلاعات تاریخی بهتر از معیارهای پیچیدگی کد عمل می‌نمایند. (Graves T. L et al., 2000) در سال 2004 اوستراند در ادامه مطالعات خود از اطلاعات وضعیتی فایل‌های برنامه که در طول انتشارهای مختلف تغییر می‌کند مانند تعداد خطوط اضافه شده، حذف شده و تغییر یافته در فایل‌ها برای پیش‌بینی تعداد خطاهای برنامه استفاده نمود. (Ostrand et al., 2004) این مدل پیش‌گویی کننده برای یافتن خطا چه در مرحله توسعه و چه در مراحل پایانی پروژه از دقت بالایی برخوردار بود. اوستراند در سال 2005 مطالعات خود را بر اساس اطلاعات تاریخی بر روی 2 سیستم نرم‌افزاری بزرگ تا 17 انتشار برای پیش‌بینی فایل‌هایی با بالاترین چگالی خطا انجام داد. (Ostrand et al., 2005) مدل پیش‌بینی کننده خطاها 20 درصد از کل فایل‌های 2 سیستم نرم‌افزاری را به عنوان فایل‌های حاوی خطا پیش‌بینی کرد و موفق به شناسایی 71 درصد و 92 درصد از کل خطاها شد. زیمرمن در سال 2005 یکی از بزرگ‌ترین تحقیقات را بر روی اطلاعات تاریخی سیستم‌های نرم‌افزاری انجام داد. (Zimmermann et al., 2005). او بر روی اطلاعات تاریخی 8 سیستم بزرگ کار کرد تا بتواند محلی که تغییرات بعدی در انتشار بعدی رخ می‌دهد را پیش‌بینی کند. در این تحقیق او توانست محل تغییرات در آینده را با احتمال 70% به درستی تشخیص دهد. در سال 2005 نگاپان و بال با کار بر روی ویندوز سرور 2003، از تغییرات کد برای پیش‌بینی زود هنگام چگالی خطا در سیستم‌های نرم‌افزاری استفاده نمودند. (Ball & naggapan, 2005) آن‌ها نشان دادند که معیارهای مطلق تغییرات کد در پیش‌بینی چگالی خطا ضعیف عمل می‌کند در صورتی که معیارهای نسبی تغییرات کد که توسط آن‌ها مطرح شد توانست با دقت 89% بالاترین چگالی خطا را شناسایی نماید. آن‌ها نشان دادند افزایش معیار نسبی تغییرات با افزایش چگالی خطا توأم است و همچنین معیار نسبی تغییرات علاوه بر چگالی در شناسایی اجزای معیوب نیز موفق است. آن‌ها همچنین بیان کردند که تغییرات در کد و وابستگی به کدهای تغییر داده شده می‌تواند باعث بروز خطاهای پس از زمان انتشار شود. این پیش‌بینی به کمک معیارهای پیچیدگی نظیر سایز اجزای کد و اندازه موقتی39 کد تغییر یافته صورت گرفت. در سال 2006 تحقیقی بر روی ویندوز ایکس پی- سرویس پک 140 و ویندوز سرور 2003 صورت گرفت. در این تحقیق نشان داده شد که معیارهایی که بر اساس اطلاعات تاریخی در سطح پروژه و محصول عمل می‌نمایند معیارهای مناسبی برای پیش‌بینی خطاهای پس از زمان اجرا هستند و همچنین کارایی این متریک‌ها در سطح پروژه‌های بسیار بزرگ نیز نشان داده شد. (Nagappan et al., 2006).
2-3-3- بررسی فعالیت‌ها در زمینه معیارهای وابستگی:
در سال 1981 هنری و کافورا معیارهایی تحت عنوان معیار ورودی41 و معیار خروجی مطرح کردند. معیارهای ورودی تعداد ماژول‌هایی است که یک ماژول خاص را صدا می‌زنند و معیار خروجی تعداد ماژول‌هایی است که توسط یک ماژول خاص صدا زده می‌شوند. هنری و کافورا از این دو معیار برای محاسبه پیچیدگی کد استفاده نمودند و نشان دادند اجزایی از کد که دارای معیار ورودی و معیار خروجی بزرگی باشند دارای طراحی ضعیفی هستند. (Kafura & Henry, 1981) در سال 1989 سلبی و پورتر با استفاده از یک الگوریتم بازگشتی درخت‌های دسته‌بندی42 استخراج کردند که گره‌های آن‌ها تابعهای چند ارزشی بر اساس معیارهای کد هستند. هدف از تشکیل این درخت‌ها شناسایی اجزای معیوب کد بود. سلبی و پورتر بر روی 16 پروژه‌ی ناسا کار کردند و موفق به شناسایی 79.3% از کل اجزای معیوب شدند. (Porter & Selby, 1989) پدولسکی و کلارک در سال 1990 یک مدل رسمی بر اساس وابستگی‌های برنامه ارائه کردند. این وابستگی‌ها بر اساس ارتباط دو قسمت متن کد برنامه استخراج می‌شود. (Clarke & Pogdurski, 1990) در سال 1998 بینکلی و اسکاچ بر روی خطاهای زمان اجرا کار کردند و همچنین معیارهای وابستگی متصل43 را مطرح کردند. .آن‌ها کار خود را بر روی 4 پروژه به زبان‌های جاوا44، کوبول45، سی46 و سی پلاس پلاس47 بررسی نمودند. تحقیقات آن‌ها حاکی بر موفقیت آمیز بودن این معیارها در کیفیت طراحی نرم‌افزار بود. آن‌ها نشان دادند معیار وابستگی متصل در مقایسه با معیارهای متقابل48 عملکرد بسیار بهتری در پیش‌بینی خطاهای زمان اجرا49 دارند. (Binkley & Schach, 1998) بیون و وایتهد در سال 2003 گراف وابستگی و داده‌های تاریخی را برای شناسایی ناپایداری‌های برنامه ترکیب نمودند. (Bevan & Whitehead, 2003) پینگر در بر اساس اطلاعاتی که از سیر تکاملی و اطلاعات تاریخی پروژه‌های نرم‌افزاری بدست آورد پیوستگی‌های تصادفی بین اجزای کد مشاهده کرد که ممکن بود در آینده منجر به بروز خطا شوند. (Pinzger et al., 2005) شروتر در سال 2006 نشان داد که وابستگی‌های ورودی واقعی می‌تواند خطاهای را شناسایی کند و وابستگی‌های ورودی کامپایلر از وابستگی‌های ورودی واسط کاربر احتمال خطای بالاتری را ایجاد می‌کند (Schröter & Zeller, 2006) در یکی از تلاش‌های تیم مایکروسافت نشان داده شد تغییرات کد و وابستگی‌ها می‌تواند معیار موثری در شناسایی خطاهای پس از انتشار باشد. (Nagappan & Ball, 2007) ایده‌ی آن‌ها این بود که اگر جز A در کد برنامه وابستگی زیادی به جز دیگری مانند B داشته باشد و جز B در طول انتشارات مختلف تغییر بکند جز A برای هماهنگ بودن با جز B نیازمند تغییراتی می‌باشد این تغییرات معمولاً در طول وابستگی‌ها منتشر می‌شود. نگاپان و بال در این پژوهش بر روی ویندوز سرور 2003 نشان دادند درجه بالای وابستگی در کنار تغییرات کد می‌تواند باعث انتشار خطا در سراسر یک سیستم شود. زیمرمن و نگاپان در سال 2007 با کار بروی گراف وابستگی زیر سیستم‌های کد نشان دادند بین پیچیدگی گراف وابستگی و خطاهای پس از انتشار ارتباط بالایی وجود دارد و هنگامی مدل‌هایی پیش‌گویی بر اساس زیر سیستم‌هایی که در معماری بالاتر هستند ساخته می‌شوند بهتر عمل می‌کنند. (Zimmermann & Nagappan, 2007) در سال 2008 زیمرمن و نگاپان معیارهایی بر اساس وابستگی موجود در کد استخراج نمودند. (Zimmermann & Nagappan, 2008) این معیارها بر اساس مشاهدات آن‌ها از گراف وابستگی ویندوز سرور 2003 تعریف شده است. آن‌ها در بررسی گراف وابستگی ویندوز سرور 2003 مشاهده کردند گره‌های که حالت مرکزیت دارند و یا در مش50 ‏هایی با تعداد گره‌های زیاد قرار دارند از احتمال معیوب بودن بالایی برخوردارند بر اساس این مشاهدات این تیم تحقیقاتی معیارهایی تحت عنوان معیارهای شبکه استخراج نمود و کارایی آن‌ها را برای پیش‌بینی خطا در مقایسه با معیارهای پیچیدگی کد بررسی کرد که در این مقایسه معیارهای شبکه توانستند 60% از کل اجزای معیوب برنامه را شناسایی نمایند در صورتی که معیارهای پیچیدگی تنها موفق به شناسایی 30% از کل خطاها شدند. در سال 2009 تورهان با بررسی و آزمایشاتی نشان داد که معیارهای شبکه روی برنامه‌های بزرگ کارایی بهتری از معیارهای پیچیدگی دارند اما در نرم‌افزارهایی با حجم کوچک تفاوتی میان قدرت پیش‌بینی خطای معیارهای شبکه و معیارهای پیچیدگی وجود ندارد. (Torhun et al. 2009).
تلاشی که در این رساله صورت گرفته است در دسته معیارهای پیوستگی جای می‌گیرد.

3-درخت وابستگی:
همان‌طور که گفته شد جدیدترین روشی که در پیش‌بینی خطای نرم‌افزار مطرح شده است، مسأله مربوط به وابستگی‌های بین کلاس‌ها و همچنین بین ماژول‌ها51 می‌باشد. انواع وابستگی‌ها می‌توانند بین دو کلاس و یا دو ماژول مطرح شوند که تحقیقات نشان داده است که این وابستگی‌ها ارتباط بسیار زیادی با وجود خطاهای مفهومی دارند. مسأله‌ای که در این رساله تحقیق مطرح شده است، استفاده از یک تکنیک جدید بر پایه وابستگی‌های بخش‌های مختلف نرم افزار در سطح کد است. در گذشته استفاده از گراف‌های کنترل جریان52 متداول بوده که این گراف جریان داده‌ها را در هنگام اجرای برنامه مورد نظر قرار داده است و از این امر در مباحث مهندسی نرم افزار53 استفاده شده است اما، من در این طرح پیشنهادی از وابستگی کدها استفاده کرده‌ام که بر خلاف گراف کنترل جریان، وابستگی‌ها را در زمانی بررسی می‌کند که برنامه اجرا نشده است. این وابستگی‌ها می‌توانند شامل مواردی مانند وراثت، صدا زدن زیر رویه‌ها و ماژول‌ها و هرگونه وابستگی دیگری در کد باشند که این مسأله تنها محدود به برنامه نویسی شیء گرا نشده و می‌تواند برنامه‌های ساخت یافته را نیز پوشش بدهد چرا که در آنجا نیز ما شاهد وابستگی بین ماژول‌های برنامه، توابع و رویه‌ها هستیم.
برای بررسی این وابستگی‌ها و روابط آن با خطاها از مفهومی به نام داده کاوی استفاده می‌کنیم. حال سوال‌ این است که داده کاوی چیست؟
با پیشرفت سریع تکنولوژی و ورود فناوری اطلاعات بسیاری از حوزه‌ها، نیاز به داده‌ها، افزایش روز افزونی داشت. بعد از مدت کوتاهی پایگاه‌های داده بسیار عظیم با حجم بسیار گسترده‌ای از داده‌ها در سازمان‌ها، ادارات و مراکز مختلف به وجود آمدند.
حال جامعه علمی می‌توانند از چنین حجم گسترده‌ای از داده‌ها استفاده کرده و با پردازش، تحلیل و بررسی این داده‌های ذخیره شده، به روابط و اطلاعاتی دست پیدا بکنند که به هر نحوی برای سازمان و بخش مربوطه مفید واقع شود (Hand et al., 2001). ممکن است در میان حجم زیادی از داده‌ها، با روش‌های مختلف بتوان روابط خاصی پیدا کرد که از جنبه‌های مختلف برای بخش مربوطه دارای اهمیت باشد. ممکن است این اهمیت دارای جنبه اقتصادی و یا افزایش کارایی سیستم باشد.
داده کاوی، علمی است که روش‌ها و الگوریتم‌های متنوعی را در اختیار ما قرار می‌دهد تا بتوانیم از این حجم داده‌ها، با کشف الگوها54 و روابط، به اطلاعات ارزشمندی دست پیدا بکنیم.
به عبارتی «علم استخراج اطلاعات ارزشمند، از مجموعه داده‌ها و پایگاه‌های داده بزرگ» به عنوان داده کاوی شناخته می‌شود. (Hand et al., 2001).
لری کنستانتین در سال 1974 مفهوم وابستگی را معرفی کرد و این مفهوم به صورت گسترده‌ای در تحقیقات و کتاب‌ها و منابع مختلف، به صورت یک اصل در مهندسی نرم‌افزار مورد استفاده قرار گرفت. اما مفهوم وابستگی معرفی شده توسط کنستانتین از واژه Coupling یعنی جفتگری گرفته شده است. جفتگری همیشه به همراه مفهوم دیگری به کار برده شده است. این مفهوم، پیوستگی می‌باشد. قالبا جفتگری کم نشانه طراحی خوب نرم‌افزار است در حالی که پیوستگی کم نشان دهنده یک طراحی ضعیف می‌باشد. تأثیر این دو مفهوم بر یکدیگر به صورت عکس است و به گونه‌ای که در نمودار زیر مشاهده می‌نمایید، با افزایش جفتگری، پیوستگی کاهش پیدا می‌کند. (Constantine, 1996)

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

شکل 1: نمونه‌ای از وابستگی‌های میان کلاس‌ها.
برای مثال اگر در تصویر بالا کلاس A را در نظر بگیریم، ممکن است کلاس‌های دیگری مانند B و یا C به آن وابسته باشند. اگر تغییری در کلاس A اتفاق بیفتد، ممکن است روند تغییرات صورت گرفته به گونه‌ای باشد که یکی از کلاس‌های وابسته آن نتوانند مثل قبل با کلاس A ارتباط برقرار کنند و در نتیجه دچار بروز خطاهایی در بخش‌هایی از برنامه بشویم. از آنجایی که چنین خطاهایی اصولاً خطاهای نحوی را شامل نمی‌شوند، ممکن است یافتن آن‌ها قدری مشکل‌تر باشد.
حال سوالی که مطرح می‌شود این است که آیا روند پخش شوندگی خطا می‌تواند به همین طریق تا وابستگی‌های گذرا نیز ادامه پیدا کند یا خیر؟ برای توضیح بیشتر این امر، ابتدا وابستگی گذرا را توضیح خواهیم داد. فرض کنیم که تصویر قبل بخشی از یک گراف وابستگی بزرگ‌تر مانند گراف زیر باشد.

شکل 2: نمونه‌ای از وابستگی‌های پیچیده در میان کلاس‌ها.
در این صورت کلاس‌های E، F و D از طریق B دارای وابستگی‌های گذرا یا در اصطلاح Transitive نسبت به کلاس A هستند. به همین ترتیب وابستگی‌های گذرای دیگری را نیز می‌توان یافت برای مثال می‌توان به وابستگی گذرای G از طریق C به A اشاره نمود. در وابستگی‌های گذرا بیش از یک گره میانجی نیز می‌توانند مشارکت داشته باشند به گونه‌ای که برای مثال کلاس H از طریق مسیر F-B نسبت به کلاس A دارای وابستگی گذرا می‌باشد. بنا به مثال‌های نشان داده شده، یک وابستگی گذرا، نوعی از وابستگی است که در آن گره مبدأ از طریق یک یا چند گره میانی به گره مقصد وابسته باشد.
حال که مقصود از وابستگی گذرا روشن شد، می‌توانیم به صورت روشن‌تری سوال مطرح شده را بیان کنیم. آیا خطای موجود در یک گره، می‌تواند در نتیجه مسائلی مانند چرخش کد به وابسته‌های گذرای یک کلاس سرایت کند یا خیر؟
اگر دیدمان را از دیاگرام وابستگی نرم‌افزار به سمت یک گراف جهت دار سوق دهیم، می‌توانیم مسائلی را در مورد گراف جهت دار پیدا کنیم که پرورش دهنده ایده‌های مربوط به وابستگی هستند. اولین مسأله‌ای که بعد از طرح موضوع مربوط به وابستگی‌های گذرا به ذهن خطور می‌کند، الگوریتم‌های پیدا کننده کوتاه ترین مسیر بین دو گره مشخص در گراف هستند. معروف‌ترین این الگوریتم‌ها، الگوریتم وارشال است. الگوریتم وارشال همه مسیرهای ممکن در یک گراف، بین هر جفت از رأس‌ها را مقایسه می‌کند. این الگوریتم قادر است این کار را تنها با V2 مقایسه انجام دهد. این ملاحظه قابل توجهی می‌باشد که در یک گراف V2 یال وجود داشته باشد و هر ترکیبی از یال‌ها چک شده باشد. یک گراف G با راس‌های Vi که i از 1 تا N می‌باشد را در نظر بگیرید. علاوه بر این یک تابع به نام ShortestPath(i,j,k) را در نظر بگیرید که کوتاه‌ترین مسیر ممکن از i تا j را با استفاده از راس‌های 1 تا k که به عنوان راس‌های میانی در امتداد مسیر می‌باشند را بر می‌گرداند.
هم اکنون این تابع داده شده است. هدف ما پیدا کردن کوتاه‌ترین مسیر از هر i تا هر j تنها با استفاده از راس‌های 1 تا k+1 می‌باشد. دو کاندیدا برای این مسیر وجود دارد :
1- کوتاه‌ترین مسیری که فقط از راس‌های موجود در مجموعه‌ی (k,……..,1) استفاده می‌کند.
2- تعدادی مسیر که از i تا k+1 و سپس از k+1 تا j می‌روند وجود دارد که این مسیر بهتر می‌باشد.
(1).

ما می‌دانیم که بهترین مسیر از i تا j که فقط از راس‌های بین 1 تا k+1 استفاده می‌کند توسط ShortestPath(i,j,k) تعریف شده است و واضح است که اگر یک مسیر بهتر از i تا k+1 و از k+1 تا j وجود داشته باشد بنابراین طول مسیر بین i,j از الحاق کوتاه‌ترین مسیر از i تا k+1 و کوتاه‌ترین مسیر از k+1 تا j بدست می‌آید. بنابراین تابع ShortestPath(i,j,k) را در فرمول بازگشتی زیر ارائه می‌دهیم:
بنا به تعریف انجام شده، به نظر می‌رسد که الگوریتم وارشال می‌تواند در حل مسأله‌ای مانند یافتن بستار تعدی و وابستگی‌های گذرای گراف وابستگی نرم افزار قابلیت استفاده داشته باشد.
مسأله دیگری که خودنمایی می‌کند، حجم وابستگی‌ها در میان گروهی از گره‌های یک گراف است. در یک گراف جهت‌دار با n گره، میزان وابستگی‌ها می‌تواند در دامنه‌ای از صفر تا n(n-1) قرار بگیرد.
مشخصاً در گرافی که هیچ گونه وابستگی در آن وجود ندارد، ما تنها تعدادی گره مستقل خواهیم داشت. اما گرافی که در آن تمامی گره‌های آن به هم وابستگی دارند، در اصطلاح گراف کامل نامیده می‌شود. به یک گراف و یا زیر گراف کامل، در اصلاح کلیک گفته می‌شود. کلیک مبحثی است که مسائل بسیار زیاد و معروفی با عنوان مسائل کلیک در مورد آن مطرح شده‌اند. بعضی از این مسائل عبارتند از:
– یافتن کلیک‌ها با اندازه ثابت در یک گراف.
– یافتن تمامی کلیک‌های ماکزیمال در یک گراف.
– یافتن تمامی کلیک‌های ماکزیموم در یک گراف.
– …
مسأله جذاب و جالب دیگری که در مورد گراف‌ها خودنمایی می‌کند این است که مسأله کلیک، می‌تواند کمک کننده این باشد که قسمت‌هایی از گراف وابستگی نرم‌افزار را که بیشترین چگالی وابستگی ممکن در آن موجود است را پیدا کنیم و ارتباط آن را با خطا نشان دهیم.
کارپ در سال 1947 اثبات کرد که در کل مسائل مربوط به کلیک جزء مسائل ان پی-کامل هستند. به این معنی که هیچ الگوریتم قابل اجرا در زمان چند جمله‌ای برای این مسائل وجود ندارد. این مشکل در جایی خود را بیشتر نشان می‌دهد که گراف وابستگی یک نرم‌افزار معمولی ممکن است شامل چندین هزار گره باشد بنابراین به نظر می‌رسد که مسائل مربوط به کلیک، برخلاف جذابیت بسیاری که در زمینه وابستگی نرم‌افزار از خود نشان می‌دهند، به صورت عملی قابل استفاده نیستند. (Karp, 1975)
سوال دومی که مطرح می‌شود این است که آیا می‌توان از خصوصیات مسائل مربوط به کلیک در پیدا کردن نقاط مستعد خطای برنامه استفاده نمود یا خیر؟ این سوال از آنجا مطرح می‌شود که وقتی بتوان گروهی از گره‌های یک گراف را پیدا کرد که تشکیل یک کلیک را می‌دهند، در واقع بیشترین وابستگی‌های ممکن بین این گروه از گره‌ها اتفاق افتاده است. سوال این است که آیا این تراکم گره‌ها می‌تواند نشانه‌ای بر مستعد خطا بودن آن بخش از نرم‌افزار باشد یا خیر؟
4-فرضیات:
حال سوال این است که هدف از طرح مبحث مورد نظر چیست؟ به عبارتی به چه نتیجه‌ای می‌خواهیم برسیم؟ در پاسخ به این موضوع می‌توان اهدافی را برای ادامه کار مشخص کرد و این اهداف را در اینجا به صورت سوال‌ها و فرضیاتی مطرح می‌کنیم:
الف: آیا درخت وابستگی هیچ‌گونه ارتباطی با خطا دار بودن بخش‌های متناظر در برنامه دارد؟
ب: در صورت بودن ارتباط آیا درخت وابستگی می‌تواند به صورت معیاری برای پیش‌بینی خطا، به صورت عملی مورد استفاده قرار بگیرد؟
ج: عملکرد درخت وابستگی در قیاس با دیگر مشخصه‌های استفاده شده در پیش‌بینی خطا به چه صورتی است؟ آیا عملاً می‌توان بیان کرد که درخت وابستگی، خصوصیتی قابل مقایسه با دیگر مشخصه‌ها و متریک‌های مورد استفاده در پیش‌بینی خطا دارد یا خیر؟
5-جمع آوری داده:
برای پاسخگویی به سوالات و فرضیات مطرح شده در بخش قبل، بایستی آن را عملاً مورد آزمایش قرار داد. به همین منظور داده‌ها و ابزارهای مورد نیاز که در این آزمایش مورد استفاده قرار گرفته‌اند در بخش جمع‌آوری داده معرفی می‌شوند.
ابزارهای بسیاری در این راه مورد استفاده قرار گرفت و خروجی‌های متنوعی به دست آمد که در نهایت بخشی از آن‌ها عملاً قابلیت تحلیل و استفاده را در اختیار قرار می‌دادند. برای ابزارها و داده‌های مورد استفاده روند کار را توضیح خواهیم داد.
1- انتخاب نرم افزار: مقصود از نرم افزار، کد منبعی است که برای انجام آزمایشاتمان مورد باید مورد بررسی قرار بگیرد. با مروری بر انواع برنامه‌ها و مجموعه داده‌های استاندارد که در تحقیقات دیگر مورد بررسی و مطالعه قرار گرفته بود و انواع روش‌های پیش‌بینی خطا و یا تشخیص خطا بر روی آن‌ها آزمایش شده بود، می‌شد به این نتیجه رسید که نسخه‌هایی از برنامه اکلیپس و آپاچی بهترین گزینه برای انجام آزمایشات می‌باشند.
1.1- اکلیپس: یک محیط برنامه‌نویسی چند زبانه55 می‌باشد که از یک هسته مرکزی ساده تشکیل شده که با افزودن افزونه‌های56 مختلف به آن، می‌توان امکانات مورد نیاز برای هر توسعه دهنده‌ای57 را به آن اضافه نمود. این محیط برنامه نویسی در ابتدا برای توسعه برنامه‌های مختلف به زبان جاوا به کار برده می‌شد اما در ادامه با افزودن افزونه‌های مختلف به آن امکان توسعه برنامه‌ها به زبان‌هایی همچون C++، Ruby، Payton و Perl فراهم شد. اکلیپس بر اساس چارچوب مهندسی نرم‌افزار شیء گرا طراحی شده است. از سال 2006، بنیاد اکلیپس نسخه‌هایی را سالانه منتشر کرده و هر نسخه را بر اساس نام ماه‌های سال نام‌گذاری می‌کند. که از آن جمله می‌توان به نسخه‌های ایندیگو58، هلیوس59، گالیله60، گانیمده61، اروپا62 و کالیستو63 اشاره نمود.
2.1-آپاچی تام کت64 : یک سرورلت متن باز است که توسط بنیاد نرم‌افزار آپاچی65 توسعه یافته است. آپاچی تامکت، مشخصه‌های سرورلت جاوا، صفحات JSP66 و همچنین یک محیط سرور ساده HTTP را پیاده‌سازی می‌نماید.
در کل چند دلیل برای انتخاب مجموعه داده‌های مذکور جهت بررسی و آزمایش بر روی آن‌ها وجود دارد که از قرار زیر است:
– نسخه‌های متعددی از ابزارهای مذکور موجود است.
– ابزارها همگی متن باز بوده و قابلیت این را دارند که توسط ابزارهای کمکی بر روی آن‌ها آنالیز انجام داد و یا مشخصه‌های مورد نیاز را از آن‌ها استخراج نمود.
– در تحقیقات متعددی، محققین از ابزارهای مذکور استفاده کرده‌اند و هرکدام از آن‌ها تقریباً به صورت یک مجموعه داده استاندارد برای تحقیق و آزمایش شناخته می‌شوند.
– لیست کلاس‌ها و فایل‌های دارای خطا برای ابزارهای مذکور موجود می‌باشد.
2- استخراج وابستگی‌های نرم افزار: در ابتدا، برای بررسی وابستگی‌های نرم افزار نیاز داشتیم که بتوانیم این وابستگی‌ها را از کد و یا باینری‌های برنامه، استخراج کنیم و خروجی باید به نحوی باشد که از طریق ابزارهای دیگر قابل بررسی و مطالعه باشد. برای استخراج وابستگی‌های نرم‌افزار، ابزارهای مختلفی مورد بررسی قرار گرفت که در نهایت بهترین ابزاری که بر اساس نوع خروجی انتخاب شد، ابزار CDA بود. CDA مخفف Class Dependency Analyzer است که همان‌طور که از نامش پیداست، ابزاری خاص برای استخراج وابستگی‌های موجود میان کلاس‌های برنامه‌های نوشته شده به زبان جاواست. بزرگ‌ترین نقطه قوت CDA این است که این ابزار می‌تواند وابستگی را در سطوح مختلف بررسی نماید که شامل:
– یک کلاس مجزا.
– تمامی کلاس‌ها در یک Package
– تمامی کلاس‌ها در یک Container
در خروجی نیز نتایج در هر سه سطح Class Level، Package Level و Container Level ارائه می‌شوند. این ابزار



قیمت: تومان

دسته بندی : پایان نامه ها

دیدگاهتان را بنویسید