На данный момент поддерживается два интерфейса:
Подача тестовых воздействий и проверка реакции записывается в виде тестового сценария, который можно проигрывать сколько угодно раз.
Тип сценария записывается в теге <TestList type="..."> ("modbus" или "uniset"). Эти два вида различаются только способом задания параметров.
Отдельно можно указывать тип для конкретной конфигурации. См. Использование нескольких интерфейсов обмена в одном сценарии.
Ниже приведён пример записи uniset-сценария из двух тестов.
<?xml version = '1.0' encoding = 'utf-8'?> <TestScenario> <Config> ... </Config> <TestList type="uniset" logfile="result.test2.txt" logfile_trunc="1"> <test num="2" name="DG1 Running"> <check test="equal" id="SES1_CtlMode_AS" val="2" comm="SES1: mode=PultControl"/> <action name="set" id="DG1_Start_S" val="1" reset_time="300" val2="0" comm="start DG1"/> <check test="event" id="SEES1_State_AS" val="9" comm="SES1: state=Running" timeout="15000" check_pause="200"/> <check test="true" id="DG1_LampON_C"/> <action name="msleep" msec="2000" /> <check test="false" id="DG1_Start_C"/> <check test="false" id="DG1_Stop_C"/> </test> <test num="3" name="QG1 ON"> <check test="equal" id="SEES1_State_AS" val="9" comm="SES1: state=Running"/> <action name="set" id="QG1_On_S" val="1" reset_time="300" val2="0" comm="QG1 on command"/> <check test="event" id="QG1_State_AS" val="1" timeout="8000" check_pause="500" comm="QG1: state=ON"/> <check test="equal" id="SEES1_State_AS" val="1" comm="SES1: state=ON"/> <check test="true" id="QG1_LampON_C" comm="QG1: lamp ON"/> <action name="msleep" msec="2000" /> <check test="false" id="QG1_On_C" comm="QG1: on command OFF"/> <check test="false" id="QG1_Off_C" comm="QG1: off command OFF"/> <check test="true" id="SEES1_NotAloneWorking_C"/> </test> </TestList> </TestScenario>
Пример modbus-сценария:
<?xml version = '1.0' encoding = 'utf-8'?> <TestScenario> <Config> <aliases> <item default="1" alias="c1" mbslave="localhost:2048"/> <item alias="c2" mbslave="localhost:2049"/> </aliases> </Config> <RunList after_run_pause="200"> <item script="./start_mbslave1.sh" args="" silent_mode="1" chdir="../../Utils/Modbus/" ignore_terminated="0" ignore_run_failed="0" name="MBSlave1"/> <item script="./start_mbslave2.sh" args="" chdir="../../Utils/Modbus/" ignore_terminated="0" ignore_run_failed="0" name="MBSlave2"/> </RunList> <TestList logfile="result.txt" logfile_trunc="1" replace="MyGlobalVar2:104,MyGlobalVar:101" type="modbus"> <test name="Test simple read" ignore_failed="1"> <action name="set" id="0x10=2"/> <check test="true" id="0x10"/> <check test="true" id="0x1@0x02:0x02" config="c2"/> </test> <test name="Test simple write" ignore_failed="1"> <action name="set" id="0x25" val="10"/> <action name="set" id="0x25:0x10" val="10"/> <action name="set" id="0x25@0x02" val="10" config="c2"/> <action name="set" id="0x25@0x02:0x05" val="10" config="c2"/> </test> <test name="Test other 'check'" ignore_failed="1"> <check test="event" id="0x20" val="0x20" timeout="1000" check_pause="100"/> <check test="equal" id="0x20" val="0x20"/> <check test="multicheck" id="0x25=0x25,0x20:04=0x20,0x19:03=0x19" /> </test> <test name="Test 'great'" ignore_failed="1"> <action name="set" id="109" val="10"/> <check test="great" id="109" val="5" /> <check test="great" id="109" val="10" /> </test> <test name="Test 'less'" ignore_failed="1"> <action name="set" id="109" val="10"/> <check test="less" id="109" val="11" /> <check test="less" id="109" val="10" /> </test> <test name="Test other 'action'" ignore_failed="1"> <action name="multiset" set="20@2=1,21@0x02:5=1,103@2:0x10=12" config="c2"/> </test> </TestList> </TestScenario>
При этом для всего сценария можно задать следующие параметры:
logfile="filname" - задаёт имя файла куда будет писатся лог прохождения теста
logfile_trunc="1" - "1" означает каждый раз писать файл сначала (очищать перед записью)
notimestamp="1" - "1" означает не выводить дату и время при прохождении тестов
replace="var1:val1,var2:val2,.." - 'Список замен'. Смотри раздел Шаблоны в тестах
id="100", id="SensorName", id="100 ", \a id="SensorName"
Т.е. задаётся пара - "идентификатор@узел", при этом в качестве идентификатора узла можно задавать как числовое значение, так и название (в любом сочетании).
Остальные параметры являются не обязательными и имеют значения по умолчанию.
mbaddr - адрес устройства на шине. По умолчанию: 0x01
mbfunc - функция опроса или записи. По умолчанию для опроса используется mbfunc=0x04, а для записи mbfunc=0x06
nbit - номер бита [0...15]. Для случая, если опрос ведётся функцией чтения "слова", а при этом данные хранятся в каком-то бите. По умолчанию nbit=-1 - что означает не использовать.
vtype - тип запрашиваемого значения, задаётся строковым значением. По умолчанию "signed".
Все поддерживаемые типы описаны в include/libuniset/extensions/VTypes.h.
enum VType
{
vtUnknown,
vtF2, // двойное слово float(4 байта). В виде строки задаётся как "F2".
vtF4, // 8-х байтовое слово (double). В виде строки задаётся как "F4".
vtByte, // байт. В виде строки задаётся как \b "byte".
vtUnsigned, // беззнаковое целое (2 байта). В виде строки задаётся как "unsigned".
vtSigned, // знаковое целое (2 байта). В виде строки задаётся как "signed".
vtI2, // целое (4 байта). В виде строки задаётся как "I2".
vtU2 // беззнаковое целое (4 байта). В виде строки задаётся как "U2".
};
При этом для функций записи регистра используются только поля mbreg, mbaddr, mbfunc. Поля mbaddr, mbfunc так же являются не обязательными.
Все взможные действия деляться на два вида
<action name="set" id="101" val="0"/> <action name="set" id="TestSensor" val="0"/> <action name="set" id="100" val="0" reset_time="300" val2="1"/>
<action name="multiset" set="101=1,102=3,123=4"/> <action name="multiset" set="TestSensor=1,TestSensor2@Node4=23,340=5"/>
<action name="msleep" msec="1000"/>
По умолчанию вывод на экран отключён. Если требуется увидеть stdout и stderr, то можно задать параметр show_output="1".
<action name="script" script="command for run script" show_output="1"/>
Если timeout > 0, то провека будет повторяться каждые check_pause миллисекунд, пока не будет успешна, или пока не истечёт время ожидания (timeout).
<check test="false" id="101"/> <check test="false" id="CheckSensorName"/>
<check test="true" id="101"/> <check test="true" id="CheckSensorName"/>
<check test="equal" id="101" val="1"/> <check test="equal" id="CheckSensorName" val="10"/>
<check test="great" id="101" val="1"/> <check test="great" id="CheckSensorName" val="10"/>
<check test="less" id="101" val="1"/> <check test="less" id="CheckSensorName" val="10"/>
<check test="multicheck" id="101=1,CheckSensorName=10,CheckSensorName2=23,102=0"/>
<test num="1" name="Test N21"> <action name="set" id="101 " val="0"/> <check test="false" id="101" /> <action name="set" id="101" val="1"/> <check test="true" id="101" /> </test> <test num="2" name="Test N22" ignore_failed="1"> <action name="set" id="101 " val="0"/> <check test="link" link="num=1"/> </test>
<test num="2" name="Test N22" ignore_failed="1"> <check test="outlink" file="exttestfile.xml" link="num=1"/> <check test="outlink" file="exttestfile.xml" link="ALL" ignore_run_list="1"/> </test>
ignore_run_list - [0,1] игнорировать (или нет) список запускаемых процессов (<RunList>)
Помимо этого каждому тесту можно отдельно указать файл для записи лога. Эти настройки "перекрывают" глобальные.
logfile="filname" - задаёт имя файла куда будет писатся лог прохождения теста
logfile_trunc="1" - "1" означает каждый раз писать файл сначала (очищать перед записью)
<test num="1" name="Test N21" ignore_failed="1"> <action name="set" id="101 " val="0"/> <check test="false" id="101" /> <action name="set" id="101" val="1"/> <check test="true" id="101" /> </test> <test num="2" name="Test N22"> <action name="set" id="101 " val="0"/> <check test="link" link="num=1"/> </test>
Список замены имеет область видимости в зависимости от места в котором он был задан. Имеется три облати видимости:
1. Глобальная область видимости. Задаётся в секции <TestList>. Пример:
... <TestList logfile="result.test2.txt" logfile_trunc="1" global_replace="MyGlobalVar:val2,MyGlobalVar2:val2"> ...
2. Область видимости для конкретного теста. Задаётся в теге <test>. Пример:
<test num="1" name="Test replace" ignore_failed="1" replace="MyTestVar1:val1"> ... </test>
<test name="Test 1" ignore_failed="1"> <check test="outlink" file="exttestfile.xml" link="num=1" replace="MyVariable1:101,MyVariable2:102"/> </test>
<test num="1" name="Test replace" ignore_failed="1"> <action name="MyVariable10" id="MyVariable1" val="0"/> <check test="false" id="MyVariable1" /> <action name="set" id="MyVariable2" val="MyVariable3"/> <check test="true" id="MyVariable2" /> </test>
1. В файле сценария в секции <Config><aliases>
<?xml version = '1.0' encoding = 'utf-8'?> <TestScenario> <Config> <aliases> <item alias="default" confile="configure.xml"/> <item alias="c1" confile="configure1.xml"/> <item alias="c2" confile="configure2.xml"/> </aliases> </Config> <TestList> ... </TestList> </TestScenario>
2. Второй способ, в параметрах командной строки При запуске uniset-testsuite-xmlplayer --confile configure.xml,c1@configure1.xml,c2@configure2.xml,...
Первый файл в списке устанавливается по умолчанию, если не будет указан в файле теста другой файл.
Если название совпадает, приоритетным является командная строка.
<TestList config="c1">
...
</TestList>
<test num="1" name="Test replace" ignore_failed="1" config="c1"> ... </test>
4. Область 'шага' Распространяется на кокнретный <check> или <action>. Задаётся параметром 'config'. При этом указывается alias. Пример записи:
<test num="1" name="Test replace" ignore_failed="1" config="c1"> <check test="false" id="Sensor1@nodename2" config="c2"> ... </test>
Все эти параметры являются не обязательными. По умолчанию используется файл указанный при запуске теста.
<Config>
<aliases>
<item default="1" alias="c1" mbslave="localhost:2048" config="reglist.xml"/>
<item alias="c2" mbslave="localhost:2049"/>
</aliases>
</Config>
<?xml version="1.0" encoding="utf-8"?> <TestScenario> <RunList after_run_pause="5000"> <item after_run_pause="0" chdir="../../Utils/SharedMemory/" ignore_run_failed="1" ignore_terminated="1" name="SharedMemory" script="./start_fg.sh" silent_mode="1"/> </RunList> <Config> <aliases> <item alias="c1" confile="configure.xml"/> <item alias="c2" mbslave="localhost:2049" type="modbus"/> </aliases> </Config> <TestList logfile="result.multitest.txt" logfile_trunc="1"> <test ignore_failed="1" name="Test N21" num="1"> <action id="Test_DI " name="set" val="1" config="c1"/> <check id="Test_DI" test="equal" val="1" config="c1"/> <check test="true" id="0x10" config="c2"/> </test> </TestList> </TestScenario>
Как видно из примера в списке указыватся тип конфигурации type, а в самом тесте указывается поле config. как и в случае использования нескольких конфигураций.
<TestScenario> <RunList after_run_pause="5000"> <item script="./start_fg.sh" args="arg1 arg2" chdir="../../Utils/SharedMemory/" ignore_terminated="0" ignore_run_failed="0" name="SharedMemory"/> </RunList> <TestList ...> ... </TestList>
after_run_pause - [мсек], пауза после запуска скриптов. Default: 0.
У <item> можно использовать следующие параметры:
script - собственно запускаемая программа
args - аргументы передаваемые при запуске
chdir - можно задать "каталог" в который нужно перейти перед запуском программы
ignore_terminated - игнорировать "вылет" программы во время тестирования. В другом случае процесс тестирования будет остановлен.
ignore_run_failed - игнорировать неудачный "пуск" программы. В другом случае процесс тестирования будет остановлен.
after_run_pause - [мсек], пауза после запуска скрипта.
silent_mode - [0,1] перенаправить весь вывод в /dev/null
name - можно задать альтернативное имя скрипту (для вывода в логах). Иначе используется название программы.
Следует иметь в виду. Если используется ссылка на другой xml-файл (outlink) и там есть секция <RunList>, она будет исполнена, а по завершении - проессы будут остановлены.
Но во время наладки самого сценария иногда удобнее прямо "на ходу", подправлять какие-то параметры. Для этих целей в графический плээр встроен простейший редактор сценариев. Позволяющий добавлять тесты и проверки, а так же редактировать параметры существующих. Но не более того.
Редактирование параметров осуществляется двойным кликом на элементе ("тесте" или "проверке"). Остальные меню доступны по правому клику мыши.
Помимо этого, в меню "Параметры/Параметры сценария" можно отредактировать список запускаемых процессов и используемых конфигурационных файлов.
1.5.9