سؤال

ما مدى انتشار الاختبار ودعمه وتطويره في عالم PHP؟على قدم المساواة مع جافا؟هناك مع روبي / ريلز؟لقد بحثت في Google ووجدت أن أطر الاختبار موجودة ولكني أتساءل عما إذا كانت مستخدمة على نطاق واسع.

هل تحتوي PHP IDE الرئيسية على أدوات اختبار مدمجة بالطريقة التي تعمل بها أدوات Java الخاصة بـ Eclipse أو أدوات Ruby/Rails الخاصة بـ NetBeans؟هل الاختبار مدمج في أطر عمل MVC الخاصة بـ PHP كما هو الحال مع Rails؟

أسأل لأن المجموعة التي أعمل فيها تريد توظيف شخص ما لتطوير تطبيق PHP لهم.أنا قلق بشأن الجودة والصيانة حيث قد يتم استدعائي لدعم هذا الشيء.

هل كانت مفيدة؟

المحلول

يوجد على الأقل مجموعتان متاحتان من مجموعات اختبار نمط JUnit الناضجة والمستقلة PHPUnit و اختبار بسيط, ، على التوالى.

فيما يتعلق بأطر عمل MVC، لدى Symfony إطار اختبار خاص بها يسمى جير, ، كود الشاعل لديه Unit_test مكتبة و CakePHP يعتمد على SimpleTest المذكورة أعلاه.

أعلم أن Zend Studio قد بنى دعمًا لاختبارات PHPUnit، وأن كلا من PHPUnit وSimpleTest لهما برامج تشغيل لسطر الأوامر، لذا فإن التكامل في أي سير عمل ممكن.

الأدوات موجودة في عالم PHP إذا أراد المطور الاستفادة منها، وتستفيد منها المتاجر الذكية.

التحذيرات هي ما يناسبك بالنسبة لشكاوى PHP.هناك نوعان من مجتمعات PHP؛PHP كمنصة لبناء البرامج، و PHP كوسيلة للتفاعل مع خادم الويب ومتصفح الويب وقاعدة البيانات لإنتاج أشياء تشبه التطبيقات على الويب.إنه ليس شيئًا أبيض وأسود بقدر ما هو سلسلة متصلة؛من بين تلك التي تتعلق باختبار الوحدة من جانب مطور البرامج، يتم دعم TDD واستخدامه بقدر ما هو موجود على أي نظام أساسي آخر.من بين "مجموعة من الأشياء التي لا أفهمها ولكن لا يزال الناس يحصلون على نتائج"، لم يسمع بها أحد.

يوجد الكثير من كود PHP القديم غير الإطاري/الإطار المخصص والذي يصعب الحصول على أداة اختبار مفيدة حوله.PHP أيضًا تتناسب بسهولة مع الأنماط التي تعتمد على وجود بيئة متصفح للتشغيل.ليس لدي أي دليل يدعم هذا بخلاف ملاحظاتي الخاصة، ولكن الكثير من متاجر PHP التي تهتم بالاختبار ينتهي بها الأمر بالاعتماد على اختبار القبول (على سبيل المثال.السيلينيوم) كبديل لاختبار الوحدة الفعلي، والاختبار أولاً، وما إلى ذلك.تطوير.

في حالتك المحددة، قم بإجراء مقابلة مع المطور الذي ستقوم مجموعتك بتعيينه.

  1. اسألهم عن إطار اختبار الوحدة الذي يستخدمونه

  2. اطلب منهم أن يصفوا، بشكل عام، مثالًا حقيقيًا للوقت الذي قاموا فيه بتطوير ميزة جديدة والاختبارات الداعمة لها

  3. اطلب منهم أن يصفوا، بشكل عام، مثالًا حقيقيًا لوقت فشلت فيه اختباراتهم وما فعلوه لحل الموقف

أنت أقل اهتمامًا بالموقف المحدد الذي سيصفونه وأكثر اهتمامًا بمدى ارتياحهم في مناقشة معرفتهم باختبار التعليمات البرمجية بشكل عام.

نصائح أخرى

عندما أقوم بـ TDD لمشروع باستخدام أدوات نمط XUnit، أجد صعوبة في وضع رأسي في المكان الصحيح.أجد أن استخدام الأدوات المصممة للتطوير الموجه بالسلوك أو "المواصفات على سبيل المثال"يسهل علي ذلك قم بإجراء TDD بشكل صحيح -- أي.التركيز على التصميم، وكشف النية و وصف السلوك في سياقات محددة. لا اختبارات.

ومع ذلك، أود أن أعرض بيكس في المحادثة.من التمهيدي على موقع المشروع.

pecs هي مكتبة تطوير صغيرة تعتمد على السلوك لـ PHP 5.3، على غرار RSpec أو JSpec.

إذا كنت قد استخدمت JSpec أو الأفضل من ذلك، ياسمين-BDD (بالنسبة لجافا سكريبت) يجب أن يكون أسلوب pecs في وصف السلوك مألوفًا حقًا.أجد هذا النمط رائعًا بالنسبة للمواصفات على مستوى المكونات.إذا كنت تبحث عن أداة PHP لمواصفات مستوى الميزة (القصص أو اختبارات قبول المستخدم) ففكر في الأمر بهات.

وبالعودة إلى بيكس، إليك مثال منتقى من موقع مشروع بيكس:

describe("Bowling", function() {
  it("should score 0 for a gutter game", function() {
    $bowling = new Bowling();
    for ($i=0; $i < 20; $i++) {
      $bowling->hit(0);
    }
    expect($bowling->score)->to_equal(0);
  });
});

نعم هذه مواصفات PHP.بالنظر إلى مصدر الصور، يبدو أن المؤلف قادر على تحقيق ذلك من خلال الاستفادة من السخونة الجديدة في PHP 5.3+ وLambdas وعمليات الإغلاق.لذا أعتقد أن هذا يعني أنه لا يمكنك استخدام pecs في أي مشروع يعتمد على PHP <5.3 (فقط لمعلوماتك).

كما أن ملفات pec ليست ناضجة مثل PHPUnit أو SimpleTest.ومع ذلك، أعتقد أن مؤيدي BDD في مجتمع PHP يجب أن يدعموا نمو أدوات مثل الصور التي تشجع "المواصفات على سبيل المثال" أو BDD دون الارتباك الناتج عن الاضطرار إلى استخدام أدوات اختبار XUnit القديمة.

في هذه الأيام، أعمل بلغة Python أكثر من لغة PHP.ومع ذلك، في المرة القادمة التي أختار فيها مشروع PHP، سأكون سعيدًا للغاية إذا كان لدي أداة ناضجة ومدعومة من المجتمع مثل pecs لصياغة مواصفات البرنامج.

ولقد كان لي تجربة مذهلة مع Behat / المنك http://behat.org

وأنا أتفق مع الآخرين PHP كمنصة اختبار وحدة ليست متعة أو تجربة من هذا الاضطراب هو أفضل وسيلة للذهاب إذا كنت تستخدم أي إطار فب

والتفاف رأسي حول الملحن كأداة الريبو بناء كان أكبر حجر عثرة ولكن كنا قادرين على استخدام Behat المنك السيلينيوم Webdriver جرة الخادم بذاتها باعتبارها تصميم واختبار الانحدار أداة مذهلة. كنا تشغيل جناح الانحدار لدينا ضد طلبنا للكيك في الخادم جنكينز ولكن ثبت أن لا يكون ذلك جدا "تفشل بسرعة" بما فيه الكفاية

والآن لدينا سير العمل وغني عن مثل هذا: إنشاء القصة في الخيارة صقل قصة ميزة الكتابة وكعب من أي defs خطوة جديدة تبدأ الترميز حل بى لاختبار ثم في نهاية لدينا ميزة أو علة تعمل الإصلاح مع اختبار من هذا الاضطراب تغطي ذلك

ونحن الإعداد أوبونتو VM مع العمل Behat الإعداد ونسخها إلى كل محطة العمل. نحن يخبز عليه في عمليتنا. نحن فقط هدم التغييرات تشغيل الاختبارات ثم تبدأ ترميز الاشياء الجديدة.

ولقد كتبنا شيل للتشغيل تلقائيا الخلية مقالب وتحميلها قبل كل ميزة التي جعلت قانون إعادة بيع ديون نسيم.

والطبقة المنك WebAssert يعطيك كل التأكيدات التي تحتاج إليها للتحقق من صحة السلوك الطبقات الدورة / CommonContext العادية كبيرة لاستخدام المغلق أو كسباث.

ولقد استخدمت كابيبارا / WebDriver مع جافا والقضبان المشاريع قبل وجدت فوق إعداد / منحنى التعلم مرتفع جدا بالمقارنة مع Behat.

بالإضافة إلى المكتبات/الأطر التي آلان كما ذكرنا سابقًا، يمكنك الاستفادة من Apache::Test الخاص بـ mod_perl، والذي أستخدمه كأداة مساعدة.إنه يسمح لي بدمج الاختبارات في عملية الإصدار الخاصة بي بكل بساطة.يستخدم الحزام مقبض الإخراج (بروتوكول اختبار أي شيء) لتحديد ما إذا كانت الاختبارات ستنجح أم لا، وذلك باستخدام مكتبات مثل الاختبار::بسيط أو اختبار::المزيد (بيرل و بي أتش بي).

يدعم Apache::Test اختبارات الكتابة في كل من Perl وPHP.في مشاريعي الخاصة، استغرق الأمر قليلا قليلا من الخداع والكثير من القراءة لتفعيلها حقًا، ولكن تنفيذها اختبار::المزيد في PHP مدمج في الحزام.يتم إجراء جميع الاختبارات المكتوبة في كل من PHP وPerl من خلال أمر واحد ويتم التقاط أي فشل على طول الطريق بواسطة Apache::Test، مع ملاحظة ما حدث من خطأ قدر الإمكان.

الجزء الرائع في كل هذا هو أنه يمكنك أيضًا استخدام PHPUnit، أو Simple-Test جنبًا إلى جنب مع إطاري الاختبار السابقين.من خلال إجراء الاختبارات في كل مكتبة على حدة، يمكنك استخدام تطبيق PHP لـ Test::More (أو حتى Perl عن طريق اختبار stdout) وإخراج TAP مرة أخرى حتى يتمكن تسخيرك من تفسيره.

تأكد من قراءة أباتشي::اختبار التوثيق و دليل mod_perl لتشغيل Apache::Test.بالإضافة إلى ذلك، وجدت المقال هنا مساعدة عظيمة.

كمثال سريع، يمكنك إعداد اختبار في لغة Perl في عدد قليل جدًا من أسطر التعليمات البرمجية التي سيتم تشغيلها عبر جميع الصفحات الموجودة على موقعك (التي تحتوي على روابط) والتحقق من جميع النتائج في "200 OK"الردود وليس لديك أي أخطاء في التحليل:

#!perl

use strict;
use warnings;

use Apache::Test qw(:withtestmore);
use Apache::TestRequest;
use Test::More;
use Test::WWW::Mechanize;
use WWW::CheckSite::Validator;
use WWW::CheckSite::Spider;

plan 'no_plan';

my $config = Apache::Test::config();
my $host = "http://". Apache::TestRequest::hostport($config) || '';

my $s = WWW::CheckSite::Spider->new(
    uri => $host,
    ua_class => 'Test::WWW::Mechanize',
);
my $m = $s->current_agent;

while (my $page = $s->get_page) {
    is($m->status(), "200", $m->uri() ." retrieved successfully.");
    $m->content_lacks("Parse Error", $m->uri() ." does not contain syntax errors.");
}

في مشروع الماضي، لقد استعملت PHPUnit، وأنه قد ترك لي الرغبة. خط PHPUnit + قيادة ادارة الاختبارات، جعلت من ذلك أن أنفق الكثير من الوقت الترميز الاختبارات، لم يكن سريعا بما فيه الكفاية، ويبدو حقا لتقييد أسلوب رمز بطريقة لم يعجبني (كانت كائنات أسهل للاختبار، لذلك يبدو كيندا يفضل الكائنات).

وكان السيلينيوم الحل الذي تحدثنا عنه ولكن لم يحصل على نحو الدخول في اللعب، وأعتقد أننا حقا قد استفادوا من هذا النوع من التجارب على مستوى الانتاج.

في هذا المشروع الأخير، اتخذت مبرمج يؤدي نهج البرمجة أكثر وظيفية كما كنا مراجعة البرامج. عندما ذكرت أن أود أن رمز عبر TDD، وقال انه جلد حتى حل مخصص في يوم واحد أو أقل أن أعتبره أثبتت فعاليتها بالنسبة لي لاستخدام PHPUnit. وبالإضافة إلى ذلك، وقال انه حقا فتحت عيني حول مسألة الشيئية مقابل البرمجة الوظيفية.

والمشروع الأول، بدأ من الصفر، في في الطابق الأرضي، الشيئية ترميز كبير حدة اختبار الإطار، أصبح متجانسة وتعثرت بسرعة. جعل المشروع الثاني، راسخة برنامج CMS مع تاريخ 5 سنوات والقانون القديم، ولكن نموذج برمجة وظيفية وإطار اختبار بسيط (نحن في الواقع في كثير من الأحيان استخدام فب ASSERT) أنها تحصل على أبسط بدلا من النمو في التعقيد.

وأما المشروع الثاني، أيضا، لم يحصل إلى حد تنفيذ السيلينيوم (وأنا ما زلت أعتقد أنه سيكون من المفيد)، إلا أن نهج البرمجة وظيفي من السهل التعامل مع الاختبار في التعليمات البرمجية.

لقد وجدت هذا السؤال للتو، وبينما لا أزال في "مرحلة البحث" لمعرفة ما يحدث.لقد اكتشفت للتو شيئًا لـ Ruby on Rails يسمى "Cucumber" http://cukes.info/

إنه في الأساس "تطوير مدفوع بالقصة" لروبي ومن المحتمل جدًا أن يكون معيارًا ذهبيًا في مجال الاختبار الوظيفي، على الأقل بقدر ما رأيته في رحلاتي.(لقد طرحت هذا الأمر علنًا حتى يتمكن الخبراء من تصحيحي إذا كنت مخطئًا)

كمثال على اللغة في خيار، لديك شيء يشبه SQL إلى حد كبير. لكن يبدو أنه أكثر قابلية للقراءة من قبل الإنسان.من الصفحة الأولى لـ cukes تبدو لغتهم كما يلي:

 Scenario: Add two numbers
      Given I have entered 50 in the calculator
      And I have entered 70 in the calculator
      When I press add
      Then the result should be 120 on the screen

سيتم تجميع ما سبق وتشغيله كاختبار.

الآن كل هذا تمهيد إلى حد الإجابة على سؤالك حول PHP - BDD & TDD.

من خلال تكرار التعليقات أعلاه، ستسمح PHPUnit باختبار الوحدة ووفقًا لمنشور المدونة هذا: http://sebastian-bergmann.de/archives/738-Support-for-BDD-and-Stories-in-PHPUnit-3.3.html يدعم أيضًا اختبار BDD "لنمط القصة".

للتوسع في الإجابة أعلاه فيما يتعلق بـ "SIMPLETEST" المذكور أعلاه، يحتوي نظام ST على فئة كائن متصفح مدمجة لأتمتة المتصفح، بينما يحتوي PHPUnit على امتداد لأتمتة متصفح SELENIUM http://seleniumhq.com (ميزة السيلينيوم مقابل.SimpleTest هو أن السيلينيوم سيقوم بتشغيل أي جافا سكريبت على الصفحة بينما لن يقوم SimpleTest بذلك).

أتمنى أن تجد هذه المعلومات مفيدة لأنها نتيجة لعدة أشهر من البحث الشخصي والتجربة العملية والخطأ باستخدام التقنيات المذكورة أعلاه.إذا كان هناك خبراء يمكنهم توضيح وتحسين فهمي لما ورد أعلاه، فأنا أرحب بتعليقاتهم.

  • أليكس.

والمقارنة مايكل بوث من الميزات اختبار BDD باللغتين:

http://mechanicalrobotfish.com / وظائف / 117-روبي-مقابل-PHP-بدد الجمال المسابقة-لا-مسابقة

ويخلص إلى أن الأدوات والثقافة PHP BDD متخلفة في هذه المرحلة.

وبالتأكيد ليس هناك شيء مشابه مع ما هو متاح لمبرمج روبي، سواء من حيث المعرفة (كتب، أشرطة الفيديو، والمقالات، بلوق وظيفة) أو أدوات (Rspec، Shoulda، مصنع فتاة، موكا، خيار).

وأنت قد ترغب في التحقق من PHPStorm . أنا أحب المتسابقين الاختبار التي تستخدم PHPUnit من داخل IDE.

والآن أنا النامية "الطيف" إطار لاختبار BDD: https://github.com/m -haritonov / الطيف

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top