سؤال

أحاول دمج بعض اختبارات وحدة JavaScript في عملية الإنشاء الآلية الخاصة بي.تعمل JSUnit حاليًا بشكل جيد مع JUnit، ولكن يبدو أنها برامج مهجورة وتفتقر إلى الدعم الجيد لـ AJAX وتصحيح الأخطاء والمهلات.

هل كان لدى أي شخص أي حظ في أتمتة (باستخدام ANT) مكتبة اختبار الوحدة مثل اختبار YUI أو JQuery's QUnit أو jQUnit (http://code.google.com/p/jqunit/)?

ملحوظة:أستخدم مكتبة AJAX مصممة خصيصًا، لذا فإن مشكلة Dojo's DOH هي أنها تتطلب منك استخدام استدعاءات وظائف AJAX ومعالجات الأحداث الخاصة بها للعمل مع أي اختبار لوحدة AJAX.

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

المحلول

هناك العديد من أطر عمل اختبار وحدة جافا سكريبت (jsUnit، scriptaculous، ...) ولكن jsUnit هو الإطار الوحيد الذي أعرفه والذي يمكن استخدامه مع البناء الآلي.

إذا كنت تقوم بإجراء اختبار الوحدة "الحقيقي"، فلن تحتاج إلى دعم AJAX.على سبيل المثال، إذا كنت تستخدم إطار عمل RPC ajax مثل DWR، فيمكنك بسهولة كتابة دالة وهمية:

   function mockFunction(someArg, callback) {
      var result = ...; // some treatments   
      setTimeout(
function() { callback(result); }, 300 // some fake latency
); }

ونعم، JsUnit تتعامل مع المهلات: محاكاة الوقت في اختبارات jsUnit

نصائح أخرى

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

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

انا ايضا سأستخدم JSCoverage للحصول على تحليل تغطية التعليمات البرمجية للاختبارات.سيتم أيضًا تشغيل هذا تلقائيًا باستخدام السيلينيوم.

أنا حاليًا في منتصف إعداد هذا.سأقوم بتحديث هذه الإجابة بمزيد من التفاصيل الدقيقة بمجرد الانتهاء من الإعداد.


أدوات الاختبار:

أنا معجب كبير بـ اختبار سائق شبيبة

إنه يعمل بشكل جيد في بيئة CI وهو قادر على التقاط المتصفحات الفعلية للاختبار عبر المتصفحات.

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

وهمية جافا سكريبت أو كيفية وحدة اختبار جافا سكريبت خارج بيئة المتصفح

أنا فقط حصلت على Hudson CI لتشغيل JasmineBDD (مقطوعة الرأس)، على الأقل بالنسبة لاختبار وحدة جافا سكريبت النقي.

(يقوم Hudson بتشغيل Java عبر Shell، وتشغيل Envjs، وتشغيل JasmineBDD.)

لم أتمكن من اللعب بشكل جيد مع مكتبة كبيرة حتى الآن، مثل النموذج الأولي.

تفحص YUITest

أنا أوافق على أن jsunit هو نوع من الموت على الكرمة.لقد انتهينا للتو من استبداله باختبار YUI.

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

للبدء، لدينا ملف جافا سكريبت أساسي تم تضمينه في جميع ملفات html الاختبارية لدينا.يعالج هذا إعداد مثيل YUI، وعداء الاختبار، وكائن YUI.Test.Suite، بالإضافة إلى Test.Case.يحتوي على طرق يمكن الوصول إليها عبر السيلينيوم لتشغيل مجموعة الاختبار، والتحقق لمعرفة ما إذا كان مشغل الاختبار لا يزال قيد التشغيل (لا تتوفر النتائج إلا بعد الانتهاء منه)، والحصول على نتائج الاختبار (اخترنا تنسيق JSON)

var yui_instance; //the YUI instance
var runner;  //The YAHOO.Test.Runner
var Assert; //an instance of YAHOO.Test.Assert to save coding
var testSuite; //The YAHOO.Test.Suite that will get run.

/**
 * Sets the required value for the name property on the given template, creates
 * and returns a new YUI Test.Case object.
 * 
 * @param template the template object containing all of the tests
 */
function setupTestCase(template) {
    template.name = "jsTestCase";
    var test_case = new yui_instance.Test.Case(template);
    return test_case;
}

/**
 * Sets up the test suite with a single test case using the given 
 * template.
 * 
 * @param template the template object containing all of the tests
 */
function setupTestSuite(template) {
    var test_case = setupTestCase(template);
    testSuite = new yui_instance.Test.Suite("Bond JS Test Suite");
    testSuite.add(test_case);
}

/**
 * Runs the YAHOO.Test.Suite
 */
function runTestSuite() {
    runner = yui_instance.Test.Runner;
    Assert = yui_instance.Assert;

    runner.clear();
    runner.add(testSuite);
    runner.run();
}

/**
 * Used to see if the YAHOO.Test.Runner is still running.  The
 * test results are not available until it is done running.
 */
function isRunning() {
    return runner.isRunning();
}

/**
 * Gets the results from the YAHOO.Test.Runner
 */
function getTestResults() {
    return runner.getResults(yui_instance.Test.Format.JSON);
}

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

الاختبار الفعلي يؤكد فقط نتيجة الاختبار.إذا لم يكن مساويا لـ "اجتياز" فإنه يفشل في الاختبار بالرسالة التي يتم إرجاعها من نتيجة اختبار YUI.

    @Parameters
public static List<Object[]> data() throws Exception {
    yui_test_codebase = "file:///c://myapppath/yui/tests";

    List<Object[]> testResults = new ArrayList<Object[]>();

    pageNames = new ArrayList<String>();
    pageNames.add("yuiTest1.html");
    pageNames.add("yuiTest2.html");

    testResults.addAll(runJSTestsInBrowser(IE_NOPROXY));
    testResults.addAll(runJSTestsInBrowser(FIREFOX));
    return testResults;
}

/**
 * Creates a selenium instance for the given browser, and runs each
 * YUI Test page.
 * 
 * @param aBrowser
 * @return
 */
private static List<Object[]> runJSTestsInBrowser(Browser aBrowser) {
    String yui_test_codebase = "file:///c://myapppath/yui/tests/";
    String browser_bot = "this.browserbot.getCurrentWindow()"
    List<Object[]> testResults = new ArrayList<Object[]>();
    selenium = new DefaultSelenium(APPLICATION_SERVER, REMOTE_CONTROL_PORT, aBrowser.getCommand(), yui_test_codebase);
    try {
        selenium.start();

        /*
         * Run the test here
         */
        for (String page_name : pageNames) {
            selenium.open(yui_test_codebase + page_name);
            //Wait for the YAHOO instance to be available
            selenium.waitForCondition(browser_bot + ".yui_instance != undefined", "10000");
            selenium.getEval("dom=runYUITestSuite(" + browser_bot + ")");

            //Output from the tests is not available until 
            //the YAHOO.Test.Runner is done running the suite
            selenium.waitForCondition("!" + browser_bot + ".isRunning()", "10000");
            String output = selenium.getEval("dom=getYUITestResults(" + browser_bot + ")");

            JSONObject results = JSONObject.fromObject(output);
            JSONObject test_case = results.getJSONObject("jsTestCase");
            JSONArray testCasePropertyNames = test_case.names();
            Iterator itr = testCasePropertyNames.iterator();

            /*
             * From the output, build an array with the following:
             *  Test file
             *  Test name
             *  status (result)
             *  message
             */
            while(itr.hasNext()) {
                String name = (String)itr.next();
                if(name.startsWith("test")) {
                    JSONObject testResult = test_case.getJSONObject(name);
                    String test_name = testResult.getString("name");
                    String test_result = testResult.getString("result");
                    String test_message = testResult.getString("message");
                    Object[] testResultObject = {aBrowser.getCommand(), page_name, test_name, test_result, test_message};
                    testResults.add(testResultObject);
                }
            }

        }
    } finally {
        //if an exception is thrown, this will guarantee that the selenium instance
        //is shut down properly
        selenium.stop();
        selenium = null;
    }
    return testResults;
}
/**
 * Inspects each test result and fails if the testResult was not "pass"
 */
@Test
public void inspectTestResults() {
    if(!this.testResult.equalsIgnoreCase("pass")) {
        fail(String.format(MESSAGE_FORMAT, this.browser, this.pageName, this.testName, this.message));
    }
}

آمل أن يكون هذا مفيدا.

هناك مشروع جديد يتيح لك التشغيل qunit اختبارات في بيئة Java (مثل ant) ​​حتى تتمكن من دمج مجموعة الاختبار من جانب العميل بشكل كامل مع اختبارات الوحدة الأخرى.

http://qunit-test-runner.googlecode.com

لقد استخدمته لوحدة اختبار المكونات الإضافية لـ jQuery، objx كود مخصص OO JavaScript ويعمل على كل شيء دون تعديل.

المشروع الذي أعمل عليه يستخدم شبيبة اختبار السائق الاستضافة الياسمين على كروم 10 مع الياسمين-JSTD-محول بما في ذلك الاستفادة من مدونة التغطية الاختبارات المضمنة في JS-Test-Driver.على الرغم من وجود بعض المشكلات في كل مرة نقوم فيها بتغيير أو تحديث المتصفحات على بيئة سي.آي تعمل اختبارات الياسمين بسلاسة كبيرة مع وجود مشكلات بسيطة فقط في الاختبارات غير المتزامنة، ولكن على حد علمي يمكن حلها باستخدام Jasmine Clock ولكن لم تتح لي الفرصة لإصلاحها بعد.

لقد نشرت أ مكتبة صغيرة للتحقق من اختبارات JavaScript المعتمدة على المتصفح دون الحاجة إلى استخدام متصفح.إنها وحدة Node.js التي تستخدم zombie.js لتحميل صفحة الاختبار وفحص النتائج.لقد كتبت عن ذلك على مدونتي.إليك ما تبدو عليه الأتمتة:

var browsertest = require('../browsertest.js').browsertest;

describe('browser tests', function () {

it('should properly report the result of a mocha test page', function (done) {
    browsertest({
        url: "file:///home/liam/work/browser-js-testing/tests.html",
        callback: function() { 
            done();
        }
    });
});

});

لقد ألقيت نظرة على تاريخ سؤالك وفي ذلك الوقت كان هناك عدد قليل من إطار/إطار عمل اختبار JS الجيد.اليوم يمكنك العثور على المزيد وفي مجالات تركيز مختلفة مثل TDD وBDD وAssetion ومع/بدون دعم العدائين.

هناك العديد من اللاعبين في هذه اللعبة مثل Mocha، Chai، QUnit، Jasmine، إلخ ...يمكنك العثور على مزيد من المعلومات في هذا مدونة حول اختبار JS/الجوال/الويب...

إطار اختبار JS آخر يمكن تشغيله باستخدام Ant هو شيك مسطر.يوجد مثال لتشغيل CrossCheck عبر Ant في ملف البناء الخاص بالمشروع.

يحاول CrossCheck، بنجاح محدود، محاكاة المتصفح، بما في ذلك تطبيقات النمط الوهمي لـ XMLHttpRequest والمهلة/الفاصل الزمني.

ومع ذلك، فإنه لا يتعامل حاليًا مع تحميل جافا سكريبت من صفحة ويب.يجب عليك تحديد ملفات جافا سكريبت التي تريد تحميلها واختبارها.إذا أبقيت كل JS الخاص بك منفصلاً عن HTML الخاص بك، فقد يكون ذلك مناسبًا لك.

لقد كتبت مهمة Ant التي تستخدم فانتوم جي إس, ، متصفح webkit بدون رأس، لتشغيل ملفات اختبار QUnit html ضمن عملية إنشاء Ant.ويمكن أيضًا أن يفشل الإنشاء في حالة فشل أي اختبارات.

https://github.com/philmander/ant-jstestrunner

هذا تقييم جيد للعديد من أدوات الاختبار.

أدوات اختبار وحدة جافا سكريبت لـ TDD

أنا شخصيا أفضلhttps://code.google.com/p/js-test-driver/

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