60

自動化されたビルド プロセスに JavaScript 単体テストを組み込もうとしています。現在、JSUnit は JUnit とうまく連携しますが、放棄されたようであり、Ajax、デバッグ、およびタイムアウトの適切なサポートが不足しています。

YUIテスト、jQuery のQUnit、またはjQUnitなどのユニット テスト ライブラリを ( Antを使用して) 自動化できた人はいますか?

注: 私はカスタムビルドの Ajax ライブラリーを使用しているため、Dojo の DOH の問題は、独自の Ajax 関数呼び出しとイベント・ハンドラーを使用して Ajax ユニット・テストを処理する必要があることです。

4

14 に答える 14

24

私が取り組んでいる新しいプロジェクトでJavaScript TDDを始めようとしています。私の現在の計画は、単体テストを行うためにQUnitを使用することです。テストの開発中は、ブラウザーでテスト ページを更新するだけでテストを実行できます。

継続的インテグレーション (およびすべてのブラウザーでテストが確実に実行されるようにするため) のために、Seleniumを使用して各ブラウザーでテスト ハーネスを自動的に読み込み、結果を読み取ります。これらのテストは、ソース管理へのチェックインごとに実行されます。

また、 JSCoverageを使用して、テストのコード カバレッジ分析を取得します。これも Selenium で自動化されます。

現在、この設定の真っ最中です。セットアップが完成したら、この回答をより正確な詳細で更新します。


テスト ツール:

于 2008-09-18T20:44:13.803 に答える
20

多くの JavaScript 単体テスト フレームワーク (JSUnit、scriptaculous など) がありますが、自動ビルドで使用できると私が知っているのは JSUnit だけです。

「真の」単体テストを行っている場合は、AJAX サポートは必要ありません。たとえば、DWR などのRPC Ajax フレームワークを使用している場合、モック関数を簡単に作成できます。

   関数 mockFunction(someArg, コールバック) {
      var 結果 = ...; // いくつかの処理
      setTimeout(
function() { コールバック(結果); }、 300 // 偽のレイテンシー ); }

はい、JSUnit はタイムアウトを処理します: JSUnit テストでの時間のシミュレート

于 2008-09-18T19:51:49.983 に答える
13

私はjs-test-driverの大ファンです。

CI環境でうまく機能し、クロスブラウザー テスト用に実際のブラウザーをキャプチャできます。

于 2009-11-03T16:15:27.023 に答える
4

私は最近、JSUnit を使用し、その上に JsMock フレームワークを作成する Bruno の記事を読みました... 非常に興味深いものです。彼の作品を利用して、私の JavaScript コードの単体テストを開始することを考えています。

JavaScript のモックまたはブラウザー環境外で JavaScript を単体テストする方法

于 2008-09-26T12:35:18.167 に答える
4

少なくとも純粋な JavaScript 単体テストのために、Hudson CI に JasmineBDD (ヘッドレス) を実行させました。

(Hudson はシェル経由で Java を実行し、Envjs を実行し、JasmineBDD を実行しています。)

ただし、プロトタイプのように、まだ大きなライブラリでうまく動作するようにはなっていません。

于 2010-10-19T11:39:31.597 に答える
2

YUITestを調べる

于 2008-09-18T19:36:52.780 に答える
2

私は、JSUnit がつるで死にかけていることに同意します。これを YUI Test に置き換える作業が完了しました。

qUnit を使用した例と同様に、Seleniumを使用してテストを実行しています。このテストは、他の Selenium テストとは別に実行しています。これは、通常の UI リグレッション テスト (サーバーへのアプリケーションのデプロイなど) にある依存関係がないためです。

まず、すべてのテスト HTML ファイルに含まれるベース JavaScript ファイルを用意します。これは、YUI インスタンス、テスト ランナー、YUI.Test.Suite オブジェクト、および Test.Case のセットアップを処理します。これには、Selenium 経由でアクセスしてテスト スイートを実行し、テスト ランナーがまだ実行されているかどうかを確認し (実行が完了するまで結果は利用できません)、テスト結果を取得できるメソッドがあります (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);
}

Selenium 側に関しては、パラメータ化されたテストを使用しました。データ メソッドで Internet Explorer と Firefox の両方でテストを実行し、テスト結果を解析して Object 配列のリストにします。各配列にはブラウザー名、テスト ファイル名、テスト名、結果 (合格、不合格、または無視) が含まれます。 ) とメッセージ。

実際のテストは、テスト結果をアサートするだけです。「合格」と等しくない場合は、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));
    }
}
于 2009-12-11T22:33:22.130 に答える
1

私が取り組んでいるプロジェクトでは、 Jasmine-JSTD-Adapterを使用して Chrome 10 で Jasmine をホストするJs-Test-Driverを使用し、JS-Test-Driver に含まれるコード カバレッジテストを利用しています。

CI 環境でブラウザーを変更または更新するたびにいくつかの問題がありますが、Jasmine テストは非常にスムーズに実行されており、非同期テストでは小さな問題が発生するだけですが、私が知る限り、これらは Jasmine Clock を使用して回避できますが、まだパッチを当てる機会がありません。

于 2012-01-16T11:03:42.697 に答える
1

ブラウザーを使用せずにブラウザー依存の JavaScript テストを検証するための小さなライブラリーを公開しました。これは、zombie.js を使用してテスト ページをロードし、結果を検査する Node.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();
            }
        });
    });

});
于 2012-03-27T09:07:58.507 に答える
1

あなたの質問の日付を調べたところ、当時はいくつかの優れた JavaScript テスト ライブラリとフレームワークがありました。

今日では、 TDDBDD、Assetion、およびランナーのサポートあり/なしなど、さまざまな焦点でさらに多くのものを見つけることができます。

このゲームには、モカチャイQUnitジャスミンなど、多くのプレイヤーがいます...

このブログでは、JavaScript、モバイル、および Web テストに関する詳細情報を見つけることができます...

于 2014-03-18T08:03:09.130 に答える
1

Java 環境 (Ant など) でQUnitテストを実行できる新しいプロジェクトがあるため、クライアント側のテスト スイートを他の単体テストと完全に統合できます。

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

jQuery プラグイン、objxコード、カスタム OO JavaScript の単体テストに使用しましたが、変更なしですべてに対応しています。

于 2010-12-01T10:42:50.343 に答える
0

Ant で実行できるもう 1 つの JavaScript テスト フレームワークはCrossCheckです。プロジェクトのビルド ファイルには、Ant を介して CrossCheck を実行する例があります。

CrossCheck は、 XMLHttpRequestおよびタイムアウト/間隔のモック スタイルの実装を含め、ブラウザーをエミュレートしようと試みますが、成功は限定的です。

ただし、現在、Web ページからの JavaScript の読み込みは処理されません。ロードしてテストする JavaScript ファイルを指定する必要があります。すべての JavaScript コードを HTML から分離しておくと、うまくいく可能性があります。

于 2008-09-18T20:30:14.307 に答える
0

Ant ビルド プロセス内で QUnit HTML テスト ファイルを実行するために、ヘッドレスWebKitブラウザーであるPhantomJSを使用する Ant タスクを作成しました。テストが失敗すると、ビルドも失敗する可能性があります。

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

于 2012-06-05T19:34:09.587 に答える