اختبار وحدة مؤتمتة مع JavaScript

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

أي شخص لديه أي أتمتة الحظ (مع ANT) مكتبة اختبار وحدة مثل اختبار YUI ، QUQQQ jQuery ، أو jQUnit ( http://code.google.com/p/jqunit/

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

0
وأضاف تحرير
الآراء: 3
السؤال ذو الصلة: JavaScript unit test tool""> stackoverflow كوم/الأسئلة/300855/و hellip؛
وأضاف المؤلف Jacques Bosch, مصدر

14 إجابة

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

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

0
وأضاف

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

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

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

And yes, JsUnit do handle timeouts : Simulating Time in jsUnit Tests

0
وأضاف

Look into YUITest

0
وأضاف

لقد قمت بنشر مكتبة صغيرة للتحقق من اختبارات جافا سكريبت المعتمدة على المتصفح دون الحاجة إلى استخدام متصفح. وهي وحدة 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();
        }
    });
});

});
0
وأضاف

نظرت في تاريخ سؤالك وبعد ذلك كان هناك عدد قليل من اختبار JS الجيد lib/framework. اليوم يمكنك العثور على أكثر من ذلك بكثير وبتركيز مختلف مثل TDD ، BDD ، Assetion ومع/بدون دعم العداء.

هناك العديد من اللاعبين في هذه اللعبة مثل موكا ، تشاي ، كوينت ، ياسمين ، الخ ... يمكنك العثور على مزيد من المعلومات في مدونة هذه حول اختبار JS/Mobile/على الويب ...

0
وأضاف

أما إطار اختبار JS الآخر الذي يمكن تشغيله مع Ant فهو CrossCheck . هناك مثال على تشغيل CrossCheck عبر Ant في ملف البناء للمشروع.

محاولات CrossCheck ، مع نجاح محدود ، لمحاكاة متصفح ، بما في ذلك تطبيقات وهمية على غرار XMLHttpRequest و timeout/interval.

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

0
وأضاف

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

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

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

أنا حاليًا في منتصف إعداد هذا. انا تحديث هذه الإجابة مع مزيد من التفاصيل بالضبط متى أحصل على الإعداد التوصل اليه.


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

0
وأضاف
نعم ، يرجى مشاركتها. شكر
وأضاف المؤلف melaos, مصدر
حصلت على هذا الإعداد ، ولكن باستخدام تقنيات مختلفة قليلا. استخدمت برنامج اختبار JS لتشغيل اختبارات الوحدة في كل متصفح (بدلاً من Selenium) ، باستخدام محول QUnit ( code.google.com/p/js-test-driver/wiki/QUnitAdapter ). آخر في صاحب العمل الحالي وأنا أستخدم إطار اختبار ياسمين ، وإدارة الاختبارات في عقدة الياسمين ( github.com/mhevery/jasmine-node ) الذي يتجنب تأخير استخدام المتصفح. أستخدم مشروع روبي الصغير الخاص بي (
وأضاف المؤلف Karl, مصدر
إلى حد كبير أفضل استخدام السيلينيوم. رجل ، لقد أهدرت الكثير من الوقت مع هذا الشيء. تذمر التذمر ....
وأضاف المؤلف the0ther, مصدر
هل سبق لك الحصول على هذا الإعداد؟ كيف سار الأمر؟
وأضاف المؤلف El Yobo, مصدر
مرحبا @ Karl.I كما وجدت qunit كأداة مفيدة ولكن لا أعرف بالضبط ما لاختبار. أنا hava منطق لعبة مكتوبة في JavaScript مع مجموعات ، والرسوم المتحركة. يمكنك الثابتة والمتنقلة مساعدتي مع بعض المعلومات؟ شكر.
وأضاف المؤلف Anahit Ghazaryan, مصدر

Im a big fan of js-test-driver

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

0
وأضاف
أنا أحب ذلك بسبب التكامل CI ولكن أعتقد أن أفضل نقطة زائد هو أنه يعمل مع YUITest و QUnit!
وأضاف المؤلف AutomatedTester, مصدر

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

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

للبدء ، لدينا ملف JavaScript الأساسي الذي تم تضمينه في جميع ملفات 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 data() throws Exception {
    yui_test_codebase = "file:///c://myapppath/yui/tests";

    List testResults = new ArrayList(); pageNames = new ArrayList(); 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 runJSTestsInBrowser(Browser aBrowser) { String yui_test_codebase = "file:///c://myapppath/yui/tests/"; String browser_bot = "this.browserbot.getCurrentWindow()" List testResults = new ArrayList(); 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)); } } 

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

0
وأضاف

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

(تشغيل Hudson Java عبر shell ، تشغيل Envjs ، تشغيل JasmineBDD.)

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

0
وأضاف

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

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

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

0
وأضاف

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

0
وأضاف

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

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

0
وأضاف

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

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

I personally prefer https://code.google.com/p/js-test-driver/

0
وأضاف