Задать вопрос

Как запустить выполнение unit-тестов в Dojo?

Помогите разобраться с запуском тестов в Dojo.
Есть проект со следующей структурой:
project_root
|--src
    |-- main
         |-- webapp
              |-- index.html
              |-- js
                   |-- dojo
                   |-- dijit
                   |-- dojox
                   |-- util
                   |-- jla
                   |-- test
                        |-- dojo-test.sh
                        |-- dojo-test-config.js
                        |-- jla
                             |--test.js

В документации к DOH сказано, что можно запускать тесты как из браузера (с помощью ${project_root}/src/main/webapp/js/util/doh/runner.html), так и из командной строки (с помощью Rhino, используя ${project_root}/src/main/webapp/js/util/shrinksafe/js.jar). Я пытаюсь запустить файл теста ${project_root}/src/main/webapp/js/test/jla/test.js из командной строки такой командой:
> cd ${project_root}/src/main/webapp/js/test
> ./dojo-test.sh -m jla/app/test

Код скрипта dojo-test.sh следующий:
#!/bin/bash

log() {
    printf "    %25s:  %s\n" $1 $2
}

format() {
    printf "    %25s:  %s\n" $1 $2
}

PROJECT_DIR='../../../../../'
log 'PROJECT_DIR' $(readlink -f $PROJECT_DIR)

SOURCE_DIR=$PROJECT_DIR'src/main/webapp/js'
log 'SOURCE_DIR' $(readlink -f $SOURCE_DIR)

JLA_DIR=$SOURCE_DIR'/jla'
log 'JLA_DIR' $(readlink -f $JLA_DIR)

DOJO_DIR=$SOURCE_DIR'/dojo'
log 'DOJO_DIR' $(readlink -f $DOJO_DIR)

ABS_DOJO_DIR=$(readlink -f $DOJO_DIR)
log 'ABS_DOJO_DIR' $ABS_DOJO_DIR

BASE_URL='file://'$ABS_DOJO_DIR
log 'BASE_URL' $BASE_URL

DOJO_JS=$DOJO_DIR'/dojo.js'
log 'DOJO_JS' $(readlink -f $DOJO_JS)

TEST_EXECUTOR=$SOURCE_DIR'/util/shrinksafe/js.jar'
log 'TEST_EXECUTOR' $(readlink -f $TEST_EXECUTOR)

CONFIG_FILE='dojo-test-config.js'

CONFIG_PATH='file://'$(readlink -f $CONFIG_FILE)
log 'CONFIG_PATH' $CONFIG_PATH

TARGET_MODULE=

if [ "$1" = "-m" ] ; then
    shift
    TARGET_MODULE=$1
    shift
fi

CURRENT_DIR='.'

echo 'Test dojo modules:'
format 'CURRENT_DIR' $(readlink -f $CURRENT_DIR)
format 'PROJECT' $(readlink -f $PROJECT_DIR)
format 'EXECUTOR' $TEST_EXECUTOR
format 'DOJO.JS' $DOJO_JS
format 'BASE_URL' $BASE_URL
format 'CONFIG' $CONFIG_PATH
format 'TEST' $TARGET_MODULE
echo 'Testing...'

java -jar $TEST_EXECUTOR $DOJO_JS baseUrl=$BASE_URL load=file://$CONFIG load=doh test=$TARGET_MODULE

Содержимое файла ${project_root}/src/main/webapp/js/test/dojo-test-config.js}
require({
    paths: {
        //путь относительно файла dojo.js
        "jla" : "../test/jla"
    }
});

но в ответ получаю следующую ошибку:
org.mozilla.javascript.WrappedException: Wrapped java.io.FileNotFoundException:  (Нет такого файла или каталога)
        at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1654)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:175)
        at org.mozilla.javascript.FunctionObject.call(FunctionObject.java:411)
        at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
        at org.mozilla.javascript.gen.c2._c11(Unknown Source)
        at org.mozilla.javascript.gen.c2.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:86)
        at org.mozilla.javascript.gen.c1._c82(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:66)
        at org.mozilla.javascript.gen.c1._c7(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
        at org.mozilla.javascript.gen.c1._c38(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.call0(OptRuntime.java:57)
        at org.mozilla.javascript.gen.c1._c74(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
        at org.mozilla.javascript.gen.c1._c37(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
        at org.mozilla.javascript.gen.c1._c42(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
        at org.mozilla.javascript.gen.c1._c11(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2347)
        at org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:272)
        at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:127)
        at org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
        at org.mozilla.javascript.gen.c1._c1(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
        at org.mozilla.javascript.gen.c1._c0(Unknown Source)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:401)
        at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3003)
        at org.mozilla.javascript.gen.c1.call(Unknown Source)
        at org.mozilla.javascript.gen.c1.exec(Unknown Source)
        at org.mozilla.javascript.tools.shell.Main.evaluateScript(Main.java:526)
        at org.mozilla.javascript.tools.shell.Main.processFileSecure(Main.java:448)
        at org.mozilla.javascript.tools.shell.Main.processFile(Main.java:414)
        at org.mozilla.javascript.tools.shell.Main.processSource(Main.java:405)
        at org.mozilla.javascript.tools.shell.Main.processFiles(Main.java:179)
        at org.mozilla.javascript.tools.shell.Main$IProxy.run(Main.java:100)
        at org.mozilla.javascript.Context.call(Context.java:499)
        at org.mozilla.javascript.ContextFactory.call(ContextFactory.java:511)
        at org.mozilla.javascript.tools.shell.Main.exec(Main.java:162)
        at org.mozilla.javascript.tools.shell.Main.main(Main.java:140)
Caused by: java.io.FileNotFoundException:  (Нет такого файла или каталога)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
        at org.mozilla.javascript.tools.shell.Global.readUrl(Global.java:875)
        at org.mozilla.javascript.tools.shell.Global.readUrl(Global.java:661)
        at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:160)
        ... 48 more

Если запускать тест из браузера с помощью url
http://path/to/project_root/src/main/webapp/js/util/doh/runner.html?paths=jla,../../../js/test/jla&test=jla/settings
то все работает нормально: тест запускается и успешно проходится.
Изначально в конфиге указан путь относительно файла dojo.js. Но если присмотреться, то видно, что при запуске теста из браузера в параметре paths идентификатор jla мапится на путь относительно файла ${project_root}/src/main/webapp/js/util/doh/runner.html, т.е. относительно файла, который запускает тестирование.
Пробовал изменять путь к файлу конфига на путь относительно файла скрипта и на путь относительно файла ${project_root}/src/main/webapp/js/util/shrinksafe/js.jar и все равно не работает.
Я не могу понять на какой именно путь он ругается. Подскажите как правильно запустить тестирование?
  • Вопрос задан
  • 227 просмотров
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
@nikolaas Автор вопроса
Все. Разобрался сам. Если кому интересно, вот решение:
Привел проект к такой структуре (это было не обязательно, но пришлось сделать для других целей):
project_root
|--src
    |-- main
         |-- webapp
              |-- index.html
              |-- js
                   |-- dtk
                        |-- dojo
                        |-- dijit
                        |-- dojox
                        |-- util
                   |-- jla
                        |-- some
                             |-- module.js
                   |-- test
                        |-- dojo-test.sh
                        |-- dojo-test-config.js
                        |-- jla
                             |-- root-test.js
                             |-- some
                                  |-- test.js

Код скрипта dojo-test.js:
#!/bin/bash

# Скрипт для запуска тестов проект. Имеет два способа запуска:
# 1) Запуск тестирования всего проекта:
#      ./dojo-test.sh
#    При этом в качестве основного теста выступает тест 
#    ${project_root}/jla-web-app/src/main/webapp/js/test/jla/root-test.js,
#    который запускает остальные тесты
# 2) Запуск конкретного теста:
#      ./dojo-test.sh -t test/some/test

format() {
    printf "    %25s:  %s\n" $1 $2
}

# как оказалось запускать тестирование нужно из этой директории (тут путь взят относительно директории скрипта):
cd ../dtk/util/doh

CURRENT_DIR='.'
SOURCE_DIR='../../../'
PROJECT_DIR=$SOURCE_DIR'../../../../'
DOJO_DIR=$SOURCE_DIR'dtk/dojo'
DOJO_JS=$DOJO_DIR'/dojo.js'
RHINO=$SOURCE_DIR'dtk/util/shrinksafe/js.jar'
CONFIG_FILE=$SOURCE_DIR'test/dojo-test-config.js'

TARGET_MODULE=
if [ "$1" = "-t" ] ; then
    shift
    TARGET_MODULE=$1
    shift
else
    TARGET_MODULE='test/root-test'
fi

echo''
echo 'Testing project '$(readlink -f $PROJECT_DIR)':'
echo''
format 'RHINO' $RHINO
format 'DOJO.JS' $DOJO_JS
format 'BASE_URL' $DOJO_DIR
format 'CONFIG' $CONFIG_FILE
format 'TESTS' $TARGET_MODULE
echo''
echo 'Run test '$TARGET_MODULE'...'

java -jar $RHINO $DOJO_JS baseUrl=$BASE_URL load=$CONFIG_FILE load=doh test=$TARGET_MODULE

Содержимое файла конфига (который dojo-test-config.js):
require({
    //пути задаются относительно файла dojo.js
    paths: {
        //путь к исходникам jla
        "jla" : "../../jla",
        //путь к тестам jla
        "test" : "../../test/jla"
    }
});

Все. Теперь храним исходники в директории
${project_root}/src/main/webapp/js/jla
Все тесты хранятся в директории
${project_root}/src/main/webapp/js/test/jla
Пример теста ${project_root}/src/main/webapp/js/test/jla/some/test.js:
define(["doh/runner"], function(doh) {
    doh.register("Tests group name", {
        name: "Test name",
        setUp: function() {
              //тут инициализация чего
        },
        runTest: function() {
            require(["jla/some/module"], function(module) {
                //тут собственно тестируем наш модуль module
            });
        },
        tearDown: function() {
            //тут действия после тестирования    
        }
    });
});

Запускать скрипт dojo-test.sh нужно из этой директории
${project_root}/src/main/webapp/js/dtk/util/doh
с помощью команды:
./dojo-test.sh -t test/some/test
Либо если у вас есть несколько тестов и вы хотите запустить их все сразу, то нужно создать в директории
${project_root}/src/main/webapp/js/test/jla/
файл root-test.js следующего содержания:
define([
    "doh/runner",
    "test/some/test1",
    "test/some/test2"
    //собственно тут перечисляем все тесты, которые хотим запустить
], function(doh) {
    return 1;//почему-то нужно что-то обязательно вернуть, вероятно по другому Dojo Loader не понимает, что это модуль и не грузит его
});

И запускаем скрипт dojo-test.sh с помощью команды:
./dojo-test.sh

Также есть возможность запускать тестирование из браузера. Для этого нужно открыть следующий адрес (адрес дан для моего примера):
http://sin2/js/dtk/util/doh/runner.html?paths=jla,../../../js/jla;test,../../../js/test/jla&test=test/some/test

У меня поднят web-сервер Apachе, который разрешает sin2 в директорию
${project_root}/src/main/webapp/
Собственно про параметры. Первый параметр
paths=jla,../../../js/jla;test,../../../js/test/jla

делает тоже самое что и конфиг-файл dojo-test-config.js - задает пути, в которых dojo будет искать исходные файлы модулей и тестов.
Второй параметр
test=test/some/test
задает тест который будет запущен.
В нашем случае для запуска всех тестов можно сразу было задать этот параметр в таком виде:
test=test/root-test
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы