ProgramingTip

JavaScript를 자동화 된 단위 테스트

bestdevel 2020. 12. 5. 10:22
반응형

JavaScript를 자동화 된 단위 테스트


일부 JavaScript 단위 테스트를 자동화 된 빌드 프로세스에 통합하려고합니다. 현재 JSUnit은 JUnit과 잘 작동하지만 포기한 것처럼 보이며 AJAX, 충분한 시간 초과에 대한 지원이 있습니다.

누구든지 YUI 테스트, JQuery의 QUnit 또는 jQUnit ( http://code.google.com/p/jqunit/ ) 과 같은 단위 테스트 라이브러리를 자동화 (ANT 사용) 한 적이 있습니까?

참고 : 사용자 정의 빌드 AJAX 라이브러리를 사용하는 Dojo의 DOH의 문제는 AJAX 단위 테스트와 작업 원하는 자체 AJAX 함수 호출 및 이벤트를 함께한다는 것입니다.


많은 자바 펼쳐 단위 테스트 프레임 워크 (jsUnit, scriptaculous, ...) 된가 jsUnit은 자동화 빌드와 함께 사용할 수있는 유일한 프레임 워크입니다.

'진정한'단위 테스트를 수행하는 경우 AJAX 지원이 필요하지 않습니다. 예를 들어 DWR과 같은 RPC ajax 프레임 워크를 사용하는 경우 모의 함수를 쉽게 사용할 수 있습니다.

   function mockFunction (someArg, callback) {
      var 결과 = ...; // 일부 치료   
      setTimeout (
function () {콜백 (결과); }, 300 // 가짜 지연 시간
); }

그리고 예, JsUnit은 시간 초과를 처리합니다. jsUnit 테스트에서 시간 시뮬레이션


작업중 인 새 프로젝트에서 Javascript TDD를 시작하려고합니다. 내 현재 계획은 qunit 을 사용 하여 단위 테스트를 수행하는 것입니다. 개발하는 동안 브라우저에서 테스트 페이지를 새로 고치기 만하면 테스트를 수 있습니다.

지속적인 통합 (및 모든 브라우저에서 테스트 실행 확인)을 위해 Selenium사용 하여 각 브라우저에서 테스트 하네스를 자동으로로드하고 결과를 읽습니다. 정상적인 테스트는 소스 제어에 대한 모든 체크인에서 실행됩니다.

또한 JSCoverage 를 사용 하여 테스트의 코드 커버리지 분석을 얻을 것입니다. 이것은 또한 Selenium으로 자동화됩니다.

저는 현재 구성하는 중입니다. 설정이 정보 더 정확한 세부 정보 로이 답변을 업데이트하겠습니다.


테스트 도구 :


나는 js-test-driver 의 열렬한 팬입니다.

CI 환경에서 잘 작동하며 브라우저 간 테스트를 위해 실제 브라우저를 할 수 있습니다.


최근에 Bruno가 JsUnit을 사용하고 그 위에 JsMock 프레임 워크를 만드는 기사를 읽었습니다. 매우 흥미 롭습니다. 그의 작업을 사용하여 Javascript 코드 단위 테스트를 시작할 생각입니다.

모의 자바 펼쳐 또는 브라우저 환경 외부에서 자바 펼쳐 단위 테스트 방법


난 그냥 JasmineBDD 실행하는 허드슨 CI를 순수 자바 펼쳐 단위 테스트를 위해 (헤드리스).

(쉘을 통해 Java를 실행하고 Envjs를 실행하고 JasmineBDD를 실행하는 Hudson.)

그래도 준비 타입처럼 큰 라이브러리에서 잘 플레이 할 수는 없습니다.


YUITest 모습 보기


나는 jsunit이 포도 나무에서 죽어 가고 있다고 동의합니다. 우리는 YUI 테스트로 교체를 마쳤습니다.

qUnit을 사용하여 테스트와 유사하게 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);
}

셀레늄에서 사용은 많은 변수화 된 테스트를 사용했습니다. 데이터 메서드에서 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));
    }
}

도움이 되셨기를 바랍니다.


Java 환경 (예 : ant)에서 qunit 테스트 를 수있는 새 프로젝트가 있으므로 클라이언트 테스트 스위트를 다른 테스트와 완전히 통합 수 있습니다.

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

나는 jQuery 플러그인, objx 코드, 사용자 정의 OO JavaScript 를 단위 테스트하는 데 사용했으며 수정없이 모든 작업에서 작동합니다.


내가 사용하고 있어요 프로젝트 JS - 테스트 - 드라이버 호스팅 재스민 과 크롬 10 재스민-JSTD-어댑터 를 사용하기를 포함하여 코드 커버리지 JS - 테스트 - 드라이버에 포함 된 테스트를. CI 환경 에서 브라우저를 변경하거나 업데이트 할 때마다 몇 가지 문제가 있지만 jasmine 테스트는 비동기 테스트와 관련된 사소한 문제만으로 매우 원활하게 실행되지만 Jasmine Clock을 사용하여 해결할 수 있다는 것을 알고 있습니다. 아직 패치 할 기회가 없었습니다.


브라우저를 사용하지 않고도 브라우저에 의존하는 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();
        }
    });
});

});

귀하의 질문 날짜를 살펴본 후 몇 가지 좋은 JS 테스트 lib / framework가있었습니다. 오늘날 당신은 TDD, BDD, Assetion 및 러너 지원 유무에 관계없이 훨씬 더 많은 것을 찾을 수 있습니다.

이 게임에는 Mocha, Chai, QUnit, Jasmine 등과 같은 많은 플레이어가 있습니다. 블로그 에서 JS / 모바일 / 웹 테스트에 대한 더 많은 정보를 찾을 수 있습니다 .


Ant로 실행할 수있는 또 다른 JS 테스트 프레임 워크는 CrossCheck 입니다. 프로젝트의 빌드 파일에 Ant를 통해 CrossCheck를 실행하는 예제가 있습니다.

CrossCheck는 XMLHttpRequest 및 시간 제한 / 간격의 모의 스타일 구현을 포함하여 브라우저를 에뮬레이션하려고 시도하지만 제한적으로 성공합니다.

하지만 현재 웹 페이지에서 자바 스크립트로드를 처리하지 않습니다. 로드 및 테스트 할 javascript 파일을 지정해야합니다. 모든 JS를 HTML과 분리하여 유지하면 작동 할 수 있습니다.


헤드리스 웹킷 브라우저 인 Phantom JS 를 사용 하여 Ant 빌드 프로세스 내에서 QUnit html 테스트 파일을 실행 하는 Ant 태스크를 작성했습니다 . 테스트가 실패하면 빌드가 실패 할 수도 있습니다.

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


이것은 여러 테스트 도구에 대한 좋은 평가입니다.

TDD 용 JavaScript 단위 테스트 도구

개인적으로 https://code.google.com/p/js-test-driver/를 선호합니다.

참고 URL : https://stackoverflow.com/questions/96066/automated-unit-testing-with-javascript

반응형