تم إهمال هذه الحزمة، تحقق من العدوى بدلاً من ذلك.
Humbug هو إطار عمل لاختبار الطفرة في لغة PHP. إنها قيد التطوير حاليًا، لذا، على الرغم من أنها تعمل بشكل جيد بالفعل، إلا أنها ستكون بها جوانب صعبة يعمل فريق من التوابع بجد لحلها. إذا سقط من البوابة، فقد تم تحذيرك ;).
$ git remote set-url upstream https://github.com/humbug/humbug.git
استبدل upstream
باسم جهاز التحكم عن بعد الذي تستخدمه محليًا؛ يتم استخدام upstream
بشكل شائع ولكنك قد تستخدم شيئًا آخر. يمكنك أيضًا استخدام عنوان URL مختلف (على سبيل المثال [email protected]:mockery/mockery.git). قم بتشغيل git remote -v
لمعرفة ما تستخدمه بالفعل.
جدول المحتويات
اختبار الطفرات هو، باختصار، إعطاء اختبارات الوحدة الخاصة بك فرصة للحصول على المال. يتضمن إدخال عيوب صغيرة في كود المصدر ثم التحقق مما إذا كانت اختبارات الوحدة قد لاحظت ذلك. إذا حدث ذلك، فإن اختبارات الوحدة الخاصة بك قد "قتلت" الطفرة. إذا لم يكن الأمر كذلك، فقد أفلتت الطفرة من الكشف. نظرًا لأن اختبارات الوحدة تهدف إلى منع الانحدارات، فإن الحصول على انحدار حقيقي دون أن يلاحظه أحد سيكون أمرًا سيئًا!
في حين أن "تغطية التعليمات البرمجية" يمكن أن تخبرك عن التعليمات البرمجية التي تنفذها اختباراتك، فإن "اختبار الطفرات" يهدف إلى مساعدتك في الحكم على مدى جودة أداء اختبارات الوحدة الخاصة بك فعليًا وأين يمكن تحسينها.
لقد كتبت بمزيد من التفاصيل حول سبب أهمية اختبار الطفرات: الأكاذيب والأكاذيب اللعينة وتغطية الكود: نحو اختبار الطفرات
Humbug هو مشروع مفتوح المصدر يرحب بطلبات السحب والمشكلات من أي شخص. قبل فتح طلبات السحب، يرجى قراءة دليل المساهمة القصير الخاص بنا.
يمكنك استنساخ وتثبيت تبعيات Humbug باستخدام Composer:
git clone https://github.com/humbug/humbug.git
cd humbug
/path/to/composer.phar install
أمر humbug موجود الآن في bin/humbug.
إذا كنت لا تريد تتبع الفرع الرئيسي مباشرةً، فيمكنك تثبيت Humbug phar كما يلي:
wget https://padraic.github.io/humbug/downloads/humbug.phar
wget https://padraic.github.io/humbug/downloads/humbug.phar.pubkey
# If you wish to make humbug.phar directly executable
chmod +x humbug.phar
على نظام التشغيل Windows، يمكنك فقط التنزيل باستخدام متصفح أو من Powershell v3 باستخدام الأوامر التالية حيث يكون wget
اسمًا مستعارًا لـ Invoke-WebRequest
:
wget https://padraic.github.io/humbug/downloads/humbug.phar -OutFile humbug.phar
wget https://padraic.github.io/humbug/downloads/humbug.phar.pubkey -OutFile humbug.phar.pubkey
إذا كنت عالقًا مع Powershell v2:
$client = new-object System.Net.WebClient
$client .DownloadFile( " https://padraic.github.io/humbug/downloads/humbug.phar " , " humbug.phar " )
$client .DownloadFile( " https://padraic.github.io/humbug/downloads/humbug.phar.pubkey " , " humbug.phar.pubkey " )
تم توقيع phar باستخدام مفتاح opensl الخاص. ستحتاج إلى تخزين ملف pubkey بجوار ملف phar في جميع الأوقات حتى تتمكن من استخدامه. إذا قمت بإعادة تسمية humbug.phar
إلى humbug
، على سبيل المثال، فقم أيضًا بإعادة تسمية المفتاح من humbug.phar.pubkey
إلى humbug.pubkey
.
يتم حاليًا تنفيذ إصدارات phar يدويًا، لذا لن يتم تحديثها بنفس معدل تحديث git master. لتحديث phar الحالي، فقط قم بتشغيل:
./humbug.phar self-update
ملاحظة: استخدام phar يعني أن الإصلاحات قد تستغرق وقتًا أطول للوصول إلى الإصدار الخاص بك، ولكن هناك ضمانًا أكبر بالحصول على إصدار تطوير مستقر. يتم تنزيل المفتاح العام مرة واحدة فقط. يتم إعادة استخدامه بواسطة التحديث الذاتي للتحقق من إصدارات phar المستقبلية.
بمجرد أن تبدأ الإصدارات نحو الاستقرار، سيكون هناك إصدار ألفا وبيتا وRC وإصدار نهائي. سيتم تحديث ملف phar الخاص بمسار التطوير تلقائيًا حتى يصل إلى إصدار مستقر. إذا كنت ترغب في متابعة تتبع مستوى التطوير، فستحتاج إلى الإشارة إلى ذلك باستخدام إحدى علامات الاستقرار:
./humbug.phar self-update --dev
إذا واجهت أي مشكلات في التحديث الذاتي مع حدوث أخطاء غير متوقعة openssl
أو SSL، فيرجى التأكد من تمكين ملحق openssl
. في نظام التشغيل Windows، يمكنك القيام بذلك عن طريق إضافة السطر التالي أو إلغاء التعليق عليه في ملف php.ini
لـ PHP في سطر الأوامر (إذا كان مختلفًا عن الملف الخاص بخادم http الخاص بك):
extension=php_openssl.dll
قد تنشأ بعض أخطاء SSL الأخرى بسبب فقدان الشهادات. يمكنك تصحيح ذلك عن طريق العثور على موقعهم على نظامك (على سبيل المثال، C:/xampp/php/ext/cacert.pem
)، أو بدلاً من ذلك تنزيل نسخة من http://curl.haxx.se/ca/cacert.pem. ثم تأكد من أن الخيار التالي يشير بشكل صحيح إلى هذا الملف:
openssl.cafile=C:/path/to/cacert.pem
نظرًا لربط تبعيات Humbug بالإصدارات الحديثة، فإن إضافة Humbug إلى Composer.json قد يؤدي إلى حدوث تعارضات. يُفضل استخدام طريقتي التثبيت المذكورتين أعلاه في حالة حدوث ذلك. ومع ذلك، يمكنك تثبيته عالميًا مثل أي أداة أخرى للأغراض العامة:
composer global require ' humbug/humbug=~1.0@dev '
وإذا لم تكن قد قمت بذلك من قبل... أضف هذا إلى ~/.bash_profile
(أو ~/.bashrc
):
export PATH= ~ /.composer/vendor/bin: $PATH
يعمل Humbug حاليًا على PHP 5.4 أو أحدث.
لا يزال Humbug قيد التطوير، لذا، أكرر، احذر من الحواف الخشنة.
لتكوين هراء في مشروعك، يمكنك تشغيل:
humbug configure
ستطرح هذه الأداة بعض الأسئلة المطلوبة لإنشاء ملف تكوين Humbug ( humbug.json.dist
).
في الدليل الأساسي لمشروعك، قم بإنشاء ملف humbug.json.dist
:
{
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
]
} ,
"logs" : {
"text" : "humbuglog.txt" ,
"json" : "humbuglog.json"
}
}
يمكنك تثبيت humbug.json.dist
على VCS الخاص بك وتجاوزه محليًا باستخدام ملف humbug.json
.
تحرير حسب الاقتضاء. إذا لم تقم بتحديد سجل واحد على الأقل، فلن تتوفر معلومات مفصلة حول المسوخ الهارب. سجل النص قابل للقراءة من قبل الإنسان. إذا كانت الملفات المصدر موجودة في الدليل الأساسي، أو كان يجب استبعاد الملفات الموجودة في الدلائل المصدر، فيمكنك إضافة أنماط استبعاد (إليك نموذجًا للملفات الموجودة في الدليل الأساسي حيث يتم استبعاد بائع الملحن وأدلة الاختبارات):
{
"timeout" : 10 ,
"source" : {
"directories" : [
"."
] ,
"excludes" : [
"vendor" ,
"Tests"
]
} ,
"logs" : {
"text" : "humbuglog.txt"
}
}
إذا كان عليك، من الدليل الأساسي لمشروعك، إجراء اختبارات من دليل آخر، فيمكنك الإشارة إلى ذلك أيضًا. لا يجب أن تحتاج إلى تشغيل Humbug من أي دليل آخر غير الدليل الأساسي لمشروعك.
{
"chdir" : "tests" ,
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
] ,
}
}
تأكد من أن جميع اختباراتك في حالة النجاح (يُسمح بالاختبارات غير المكتملة والمتخطية). سوف يتوقف Humbug في حالة فشل أي من اختباراتك.
الأمر السحري الموجود في الدليل الأساسي لمشروعك (باستخدام تنزيل PHAR) هو:
./humbug.phar
أو إذا قمت باستنساخ Humbug للتو:
../humbug/bin/humbug
أو إذا أضفت Humbug باعتباره تابعًا للمؤلف إلى مشروعك:
./vendor/bin/humbug
بدلًا من php بامتداد xdebug، يمكنك أيضًا تشغيل Humbug عبر phpdbg:
phpdbg -qrr humbug.phar
إذا سارت الأمور على ما يرام، فستحصل على شيء مشابه لما يلي:
_ _ _
| || |_ _ _ __ | |__ _ _ __ _
| __ | || | ' | '_ || / _` |
|_||_|_,_|_|_|_|_.__/_,___, |
|___/
Humbug version 1.0-dev
Humbug running test suite to generate logs and code coverage data...
361 [==========================================================] 28 secs
Humbug has completed the initial test run successfully.
Tests: 361 Line Coverage: 64.86%
Humbug is analysing source files...
Mutation Testing is commencing on 78 files...
(.: killed, M: escaped, S: uncovered, E: fatal error, T: timed out)
.....M.M..EMMMMMSSSSMMMMMSMMMMMSSSE.ESSSSSSSSSSSSSSSSSM..M.. | 60 ( 7/78)
...MM.ES..SSSSSSSSSS...MMM.MEMME.SSSS.............SSMMSSSSM. | 120 (12/78)
M.M.M...TT.M...T.MM....S.....SSS..M..SMMSM...........M...... | 180 (17/78)
MM...M...ESSSEM..MMM.M.MM...SSS.SS.M.SMMMMMMM..SMMMMS....... | 240 (24/78)
.........SMMMSMMMM.MM..M.SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | 300 (26/78)
SSSSSSSSM..E....S......SS......M.SS..S..M...SSSSSSSS....MMM. | 360 (37/78)
.M....MM..SM..S..SSSSSSSS.EM.S.E.M............M.....M.SM.M.M | 420 (45/78)
..M....MMS...MMSSS................M.....EME....SEMS...SSSSSS | 480 (52/78)
SSSSS.EMSSSSM..M.MMMM...SSE.....MMM.M..MM..MSSSSSSSSSSSSSSSS | 540 (60/78)
SSS....SSSSSSSSMM.SSS..........S..M..MSSMS.SSSSSSSSSSSSSSSSS | 600 (68/78)
......E...M..........SM.....M..MMMMM.MMMMMSSSSSSSM.SS
653 mutations were generated:
284 mutants were killed
218 mutants were not covered by tests
131 covered mutants were not detected
17 fatal errors were encountered
3 time outs were encountered
Metrics:
Mutation Score Indicator (MSI): 47%
Mutation Code Coverage: 67%
Covered Code MSI: 70%
Remember that some mutants will inevitably be harmless (i.e. false positives).
Humbug results are being logged as JSON to: log.json
Humbug results are being logged as TEXT to: log.txt
لشرح مخرجات التقدم التي ربما تكون غامضة:
يتم احتساب عمليات القتل والأخطاء والمهلات على أنها طفرات تم اكتشافها. نقوم بالإبلاغ عن الأخطاء في السجلات في حالة مواجهة Humbug نفسها لخطأ داخلي، أي خطأ يجب الإبلاغ عنه كمشكلة هنا!
أبلغت نتائج ملخص المثال عن عدد من درجات المقاييس:
إذا قمت بفحص هذه المقاييس، فإن المشكلة البارزة هي أن MSI بنسبة 47% أقل بمقدار 18 نقطة من تغطية الكود المُبلغ عنها والتي تبلغ 65%. تعتبر اختبارات الوحدة هذه أقل فعالية بكثير مما يمكن أن تكتشفه تغطية التعليمات البرمجية وحدها.
تفسير هذه النتائج يتطلب بعض السياق. سوف تسرد السجلات جميع الطفرات التي لم يتم اكتشافها على أنها اختلافات مقارنة بكود المصدر الأصلي. إن فحصها سيوفر مزيدًا من المعرفة حول الطفرات المحددة التي لم يتم اكتشافها.
يحتوي Humbug على عدد قليل من خيارات سطر الأوامر الجديرة بالملاحظة، بخلاف تلك المرتبطة عادةً بأي تطبيق Symfony Console.
يمكنك تعيين حد المهلة يدويًا لأي اختبار فردي:
humbug --timeout=10
إذا كنت مهتمًا فقط بتغيير مجموعة فرعية من ملفاتك، فيمكنك تمرير أي عدد من خيارات --file
التي تحتوي على أسماء ملفات بسيطة أو الكرة الأرضية أو التعبيرات العادية. بشكل أساسي، يتم تمرير كل هذه العناصر إلى طريقة name()
الخاصة بـ Symfony Finder.
humbug --file=NewClass.php --file= * Driver.php
وهذا لا يقيد بأي حال من الأحوال فحص الأخطاء الأولي في مجموعة الاختبار الشاملة التي لا يزال يتم تنفيذها بالكامل لضمان اجتياز جميع الاختبارات بشكل صحيح قبل المتابعة.
إذا كنت تريد تعديل عدد قليل فقط من الملفات المحددة، فيمكنك تمرير أي عدد من خيارات --path
التي تحتوي على أسماء ملفات المسار الكاملة. سيتم تمرير هذا الخيار إلى عامل التصفية Closure
الذي سيتقاطع مع الملفات التي تم العثور عليها باستخدام خيار config و/أو --file
مع الملفات التي قدمتها باستخدام خيار --path
.
humbug --path=src/Data/NewClass.php --path=src/Driver/Driver.php
ملحوظة: هذا لا يقيد بأي حال من الأحوال فحص الأخطاء الأولي في مجموعة الاختبار الشاملة والتي لا يزال يتم تنفيذها بالكامل لضمان اجتياز جميع الاختبارات بشكل صحيح قبل المتابعة.
التحليل التزايدي (IA) هو وضع تجريبي غير مكتمل للتشغيل حيث يتم تخزين النتائج مؤقتًا محليًا بين عمليات التشغيل وإعادة استخدامها عندما يكون ذلك منطقيًا. في الوقت الحاضر، يعمل هذا الوضع بسذاجة شديدة من خلال التخلص من عمليات التشغيل الاختبارية حيث لم يتم تعديل كل من الملف المباشر الذي يتم تحوره والاختبارات ذات الصلة للخط المتحور منذ آخر تشغيل (كما هو محدد من خلال مقارنة SHA1 للملفات المعنية).
humbug --incremental
يوفر وضع IA زيادة كبيرة في الأداء لقواعد الأكواد المستقرة نسبيًا، ولك الحرية في اختباره ومعرفة مدى نجاحه في الحياة الواقعية. في المستقبل، يجب أن تأخذ في الاعتبار التغييرات في الملفات التي تحتوي على الفئات الأصلية والسمات المستوردة وفئات تبعياتها المباشرة، وكلها لها تأثير على سلوك أي كائن معين.
يستخدم IA ذاكرة تخزين مؤقت محلية دائمة، على سبيل المثال /home/padraic/.humbug
.
لقد كان اختبار الطفرات بطيئًا تقليديًا. المفهوم هو إعادة تشغيل مجموعة الاختبار الخاصة بك لكل طفرة تم إنشاؤها. لتسريع الأمور بشكل ملحوظ، يقوم Humbug بما يلي:
في حين أن كل هذا يؤدي إلى تسريع عملية Humbug، يجب أن تدرك أن تشغيل Humbug سيكون أبطأ من اختبار الوحدة. قد تتطلب مجموعة الاختبار التي تبلغ مدتها ثانيتين 30 ثانية لاختبار الطفرة. أو 5 دقائق. كل هذا يتوقف على التفاعل بين سطور التعليمات البرمجية وعدد الاختبارات ومستوى تغطية التعليمات البرمجية وأداء كل من التعليمات البرمجية والاختبارات.
ينفذ Humbug مجموعة أساسية من Mutators، والتي تخبرنا بشكل أساسي متى يمكن تحور رمز PHP معين، وتطبق أيضًا هذا الطفرة على مجموعة من الرموز المميزة.
ملحوظة: كود المصدر الموجود داخل الوظائف (بدلاً من أساليب الفصل) لم يتم تعديله في هذا الوقت.
الحساب الثنائي:
إبداعي | متحور | إبداعي | متحور |
---|---|---|---|
+ | - | /= | *= |
- | + | %= | *= |
* | / | **= | /= |
/ | * | & | | |
% | * | | | & |
** | / | ^ | & |
+= | -= | ~ | |
-= | += | >> | << |
*= | /= | << | >> |
الاستبدال المنطقي:
وهذا يشمل مؤقتًا الطفرات المنطقية.
إبداعي | متحور |
---|---|
حقيقي | خطأ شنيع |
خطأ شنيع | حقيقي |
&& | || |
|| | && |
و | أو |
أو | و |
! |
الحدود الشرطية:
إبداعي | متحور |
---|---|
> | >= |
< | <= |
>= | > |
<= | < |
الشروط المنفية:
إبداعي | متحور | إبداعي | متحور |
---|---|---|---|
== | != | > | <= |
!= | == | < | >= |
<> | == | >= | < |
=== | !== | <= | > |
!== | === |
الزيادات:
إبداعي | متحور |
---|---|
++ | -- |
-- | ++ |
قيم الإرجاع:
إبداعي | متحور | إبداعي | متحور |
---|---|---|---|
عودة صحيحة؛ | عودة كاذبة. | العودة 1.0>؛ | عودة -(+1); |
عودة كاذبة. | عودة صحيحة؛ | إرجاع $هذا؛ | عودة فارغة؛ |
العودة 0؛ | العودة 1؛ | وظيفة الإرجاع () ؛ | وظيفة()؛ عودة فارغة؛ |
يعود ؛ | العودة 0؛ | عودة فئة جديدة؛ | فئة جديدة؛ عودة فارغة؛ |
العودة 0.0؛ | العودة 1.0؛ | العودة ( Anything )؛ | ( Anything )؛ عودة فارغة؛ |
العودة 1.0؛ | العودة 0.0؛ |
الأرقام الحرفية:
إبداعي | متحور |
---|---|
0 | 1 |
1 | 0 |
إنت> 1 | إنت + 1 |
تعويم >= 1 / <= 2 | تعويم + 1 |
تعويم> 2 | 1 |
إذا العبارات:
تمت تغطية جميع عبارات if إلى حد كبير من خلال التعديلات السابقة، ولكن هناك حالات خاصة مثل استخدام الوظائف الأصلية أو أساليب الفئة دون أي مقارنات أو عمليات، على سبيل المثال is_int()
أو in_array()
. لن يغطي هذا الوظائف المحددة في الملفات نظرًا لأنها غير موجودة حتى وقت التشغيل (شيء آخر يجب العمل عليه!).
إبداعي | متحور |
---|---|
إذا (is_int(1)) | إذا (!is_int(1)) |
سيتم إضافة المزيد من Mutators مع مرور الوقت.
bin/humbug stats ../my-project/humbuglog.json ../my-project/list-of-classes.txt --skip-killed=yes [-vvv]
يوزع الإحصائيات من humbuglog.json أو سجل JSON المسمى المخصص الخاص بك.
مرجع سطر الأوامر:
humbug stats [humbuglog.json location] [class list location] [--skip-killed = yes] [-vvv]
humbuglog.json location, defaults to ./humbuglog.json
class list location, a path to a text file containing full class names, one per line.
only this files-related stats would be shown
--skip-killed=yes is used to completely skip output of "killed" section
various verbosity levels define amount of info to be displayed:
by default, there's one line per class with amount of mutants killed/escaped/errored/timed out (depending on output section)
-v adds one line per each mutant with line number and method name
-vv adds extra line for each mutant, displaying diff view of line mutant is detected in
-vvv shows full diff with several lines before and after
يمكن اختبار ذلك على برنامج humbug نفسه، من خلال تشغيل الأمر humbug:
إحصائيات بن/هراء بن/هراء [-vvv]
هذه قائمة قصيرة بالمشكلات المعروفة:
بإذن من Craig Davis الذي رأى الإمكانات في مستودع فارغ مرة واحدة:P.
.:::::::::::...
.::::::::::::::::::::.
.::::::::::::::::::::::::.
::::::::::::::::::::::::::::.
::::::::::::::::::::::::::::::: .,uuu ...
:::::::::::::::::::::::::::::::: dHHHHHLdHHHHb
....:::::::'` ::::::::::::::::::' uHHHHHHHHHHHHHF
.uHHHHHHHHH' ::::::::::::::`. uHHHHHHHHHHHHHP"
HHHHHHHHHHH `:::::::::::',dHHuHHHHHHHHP".g@@g
J"HHHHHHHHHP 4H ::::::::' u$$$.
".HHHHHHHHP" .,uHP :::::' uHHHHHHHHHHP"",e$$$$$c
HHHHHHHF' dHHHHf `````.HHHHHHHHHHP",d$$$$$$$P%C
.dHHHP"" JHHHHbuuuu,JHHHHHHHHP",d$$$$$$$$$e=,z$$$$$$$$ee..
"" .HHHHHHHHHHHHHHHHHP",gdP" ..3$$$Jd$$$$$$$$$$$$$$e.
dHHHHHHHHHHHHHHP".edP " .zd$$$$$$$$$$$"3$$$$$$$$c
`???""??HHHHP",e$$F" .d$,?$$$$$$$$$$$$$F d$$$$$$$$F"
?be.eze$$$$$".d$$$$ $$$E$$$$P".,ede`?$$$$$$$$
4."?$$$$$$$ z$$$$$$ $$$$r.,.e ?$$$$ $$$$$$$$$
'$c "$$$$ .d$$$$$$$ 3$$$.$$$$ 4$$$ d$$$$P"`,,
"""- "$$".`$$" " $$f,d$$P".$$P zeee.zd$$$$$.
ze. .C$C"=^" ..$$$$$$P".$$$'e$$$$$P?$$$$$$
.e$$$$$$$"="$f",c,3eee$$$$$$$$P $$$P'd$$$$"..::.."?$%
4d$$$P d$$$dF.d$$$$$$$$$$$$$$$$f $$$ d$$$" :::::::::.
$$$$$$ d$$$$$ $$$$$$$$$$$$$$$$$$ J$$",$$$'.::::::::::::
"$$$$$$ ?$$$$ d$$$$$$$$$$$$$$$P".dP'e$$$$':::::::::::::::
4$$$$$$c $$$$b`$$$$$$$$$$$P"",e$$",$$$$$' ::::::::::::::::
' ?"?$$$b."$$$$.?$$$$$$P".e$$$$F,d$$$$$F ::::::::::::::::::
"?$$bc."$b.$$$$F z$$P?$$",$$$$$$$ ::::::::::::::::::::
`"$$c"?$$$".$$$)e$$F,$$$$$$$' ::::::::::::::::::::
':. "$b...d$$P4$$$",$$$$$$$" :::::::::::::::::::::
':::: "$$$$$".,"".d$$$$$$$F ::::::::::::::::::::::
:::: be."".d$$$4$$$$$$$$F :::::::::::::::::::::::
:::: "??$$$$$$$$$$?$P" :::::::::::::::::::::::::
:::::: ?$$$$$$$$f .::::::::::::::::::::::::::::
:::::::`"????"".::::::::::::::::::::::::::::::