Подсистема набора тестов X (XTS) содержит набор сертификационных тестовых наборов OpenHarmony, включая поддерживаемый в настоящее время набор тестов совместимости приложений (ACTS) и набор тестов совместимости устройств (DCTS), который будет поддерживаться в будущем.
Эта подсистема содержит пакеты программного обеспечения ACTS и tools.- Каталог acts хранит исходный код и конфигурационные файлы тестовых случаев ACTS. ACTS помогает производителям устройств как можно раньше выявлять несовместимость программного обеспечения и обеспечивает совместимость программного обеспечения с OpenHarmony на протяжении всего процесса разработки.
OpenHarmony поддерживает следующие типы систем:
Мини-система
Мини-система работает на устройствах с памятью, равной или превышающей 128 КиБ, и оснащенных процессорами MCU, такими как ARM Cortex-M и 32-битные RISC-V. Эта система предоставляет несколько легковесных сетевых протоколов и графических фреймворков, а также широкий спектр компонентов для чтения и записи данных шины IoT. Типичные продукты включают модули подключения, сенсоры и носимые устройства для умного дома.
Малая система
Малая система работает на устройствах, чья память составляет не менее 1 МиБ и которые оснащены процессорами приложений, такими как ARM Cortex-A. Эта система предоставляет расширенные возможности безопасности, стандартные графические фреймворки и возможности кодирования и декодирования видео. Типичные продукты включают умные домашние IP-камеры, электронные кошачьи глазки, маршрутизаторы и регистраторы событий (EDR) для умных поездок.
Стандартная система Стандартная система работает на устройствах, чья память составляет не менее 128 МиБ, и которые оснащены процессорами приложений, такими как ARM Cortex-A. Эта система предоставляет полный фреймворк приложений, поддерживающий расширенное взаимодействие, 3D GPU, композитор аппаратного обеспечения, разнообразные компоненты и богатую анимацию. Эта система применяется для дисплеев высококлассных холодильников.## Структура каталогов
/test/xts
├── acts # Тестовый код
│ └── subsystem # Исходный код тестовых случаев подсистем для стандартной системы
│ └── subsystem_lite # Исходный код тестовых случаев подсистем для мини и малых систем
│ └── BUILD.gn # Конфигурация сборки тестовых случаев для стандартной системы
│ └── build_lite
│ └── BUILD.gn # Конфигурация сборки тестовых случаев для мини и малых систем
└── tools # Код тестовых инструментов
Тестовые случаи для мини-системы должны разрабатываться на языке C, а для малой системы — на языке C++.
1 "> |
Функциональность сервисов, функции всех сценариев, механическая силовая среда (MPE) и DFX на уровне сценария |
|
Модули, функциональность подсистем после интеграции модулей и DFX |
Единственное фактически используемое устройство. Можно выполнять симуляцию сообщений, но не мокировать функции. |
|
Тестирует правильность работы как сервисных, так и платформенных функций, предоставляемых тестируемым объектом для конечных пользователей или разработчиков. |
|
Тестирует вычислительные возможности тестируемого объекта при конкретных предустановленных условиях и нагрузочных моделях. Производительность измеряется объемом услуг, который может быть обработан за единицу времени, например, вызовами в секунду, кадрами в секунду или объемом обработки событий в секунду. |
Тестирует потребление энергии тестируемым объектом в течение определенного периода времени при конкретных предустановленных условиях и нагрузочных моделях.
Тестирует производительность службы тестируемого объекта при обычных и необычных входных условиях, а также при указанной нагрузке на службу и длительной непрерывной работе. Тест охватывает стабильность, способность к обработке нагрузки, введение сбоев и тестирование Monkey.
2 ">Тестирует международные данные и возможности локализации тестируемого объекта, включая многоязычное отображение, различные привычки ввода/вывода, форматы времени и региональные особенности, такие как валюта, время и культурные табу.
2 ">Тестирует пользовательский опыт объекта в реальных сценариях использования. Все выводы и комментарии должны исходить от пользователей, что является субъективной оценкой в данном случае.
Тестирует соответствие отраслевым и корпоративным стандартам, протоколам и спецификациям.
Стандарты здесь не включают никакие стандарты безопасности, которые должны быть классифицированы как тесты безопасности.Тестирует свойства безопасности тестируемого объекта для предотвращения возможных опасностей для личной безопасности, здоровья и самого объекта.
Тестирует свойство устойчивости тестируемого объекта, чтобы убедиться, что он может выдерживать и поддерживать определенное рабочее состояние (включая понижение уровня) при атаках, а также восстанавливаться и адаптировать защиту к атакам для обеспечения выполнения миссии.
## Руководство по разработке тестовых случаевНеобходимо выбрать подходящий язык программирования и целевой тестовый фреймворк для разработки тестовых случаев.**Таблица 4** Тестовые фреймворки и языки тестовых случаев для различных систем2 "> |
Фреймворк HCTest используется для поддержки тестовых случаев, разработанных на языке C. HCTest улучшен и адаптирован на основе открытого фреймворка Unity.
Перейдите в репозиторий test/xts/acts, где будут храниться тестовые случаи.
├── acts
│ └──subsystem_lite
│ │ └── module_hal
│ │ │ └── BUILD.gn
│ │ │ └── src
│ └──build_lite
│ │ └── BUILD.gn
Напишите тестовый случай в директории src.
#include "hctest.h"
/**
* @brief Регистрирует тестовый набор с именем IntTestSuite.
* @param test Имя подсистемы
* @param example Имя модуля
* @param IntTestSuite Имя тестового набора
*/
LITE_TEST_SUIT(test, example, IntTestSuite);
Формат: Имя тестового набора + Setup, Имя тестового набора + TearDown.
Функции Setup и TearDown должны существовать, но тела функций могут быть пустыми.
Вовлечены три параметра: имя тестового набора, имя тестового случая и свойства тестового случая (включая тип, гранулярность и уровень).
LITE_TEST_CASE(IntTestSuite, TestCase001, Function | MediumTest | Level1)
{
// Делайте что-то
};
``` 5. Используйте макрос **RUN_TEST_SUITE** для регистрации тестового набора.
RUN_TEST_SUITE(IntTestSuite);
Создайте конфигурационный файл (BUILD.gn) тестового модуля.
Создайте файл сборки BUILD.gn (пример) в каждой директории тестового модуля. Укажите имя собираемой статической библиотеки и её зависимые заголовочные файлы и библиотеки в файле сборки. Формат следующий:
import("//test/xts/tools/lite/build/suite_lite.gni")
hctest_suite("ActsDemoTest") {
suite_name = "acts"
sources = [
"src/test_demo.c",
]
include_dirs = [ ]
cflags = [ "-Wno-error" ]
}
Добавьте параметры сборки в файл BUILD.gn в директории acts.
Вам нужно добавить тестовый модуль в скрипт test/xts/acts/build_lite/BUILD.gn в директории acts.
lite_component("acts") {
...
if(board_name == "liteos_m") {
features += [
...
"//xts/acts/subsystem_lite/module_hal:ActsDemoTest"
]
}
}
Выполните команды сборки.
Тестовые наборы собираются вместе с версией сборки. ACTS собирается вместе с отладочной версией.
ПРИМЕЧАНИЕ: Среда сборки ACTS — это статическая библиотека, которая будет связана с образом.
Выполнение тестовых случаев для мини-системы
Загрузите образ на плату разработки.
Выполнение теста1. Используйте инструмент последовательного порта для входа в плату разработки и сохранения информации о последовательном порте. 2. Перезапустите устройство и просмотрите логи последовательного порта.Анализ результатов теста
Просмотрите логи последовательного порта, чей формат следующий:
Лог каждого тестового набора начинается с Start to run test suite: и заканчивается на xx Tests xx Failures xx Ignored.
Разработка тестовых случаев для устройств малой системы (Для примеров стандартной системы перейдите в директорию global/i18n_standard.)
Фреймворк HCPPTest улучшен и адаптирован на основе открытого фреймворка Googletest.
Перейдите в репозиторий test/xts/acts, где будут храниться тестовые случаи.
├── acts
│ └──subsystem_lite
│ │ └── module_posix
│ │ │ └── BUILD.gn
│ │ │ └── src
│ └──build_lite
│ │ └── BUILD.gn
Напишите тестовый случай в директории src.
Следующее выражение включает gtest.h.
#include "gtest/gtest.h"
``` 2. Определите Setup и TearDown.```cpp
using namespace std; using namespace testing::ext; class TestSuite: public testing::Test { protected: // Предварительное действие тестового набора, которое выполняется перед первым тестовым случаем static void SetUpTestCase(void){ } // Действие очистки тестового набора, которое выполняется после последнего тестового случая static void TearDownTestCase(void){ } // Предварительное действие тестового случая virtual void SetUp() { } // Действие очистки тестового случая virtual void TearDown() { } };
**HWTEST_F**: определение тестовых случаев с подготовкой (SetUp) и завершением (TearDown), включая имя тестового набора, имя тестового случая и аннотацию к случаю.
Используются три параметра: имя тестового набора, имя тестового случая и свойства тестового случая (включая тип, гранулярность и уровень).
```cpp
HWTEST_F(TestSuite, TestCase_0001, Function | MediumTest | Level1) {
// Do something
}
Создайте файл сборки BUILD.gn в каждой директории тестового модуля. Укажите имя собираемой статической библиотеки и её зависимые заголовочные файлы и библиотеки в файле сборки. Каждый тестовый модуль независимо собирается в исполняемый файл .bin, который можно напрямую загрузить на плату разработки для тестирования.
Пример:
import("//test/xts/tools/lite/build/suite_lite.gni")
hcpptest_suite("ActsDemoTest") {
suite_name = "acts"
sources = [
"src/TestDemo.cpp"
]
include_dirs = [
"src",
...
]
deps = [
...
]
cflags = [ "-Wno-error" ]
}
Добавьте тестовый модуль в скрипт test/xts/acts/build_lite/BUILD.gn в директории acts.
lite_component("acts") {
...
else if(board_name == "liteos_a") {
features += [
...
"//xts/acts/subsystem_lite/module_posix:ActsDemoTest"
]
}
}
```5. Выполните команды сборки.
Тестовые наборы собираются вместе с версией сборки. ACTS собирается вместе с отладочной версией.
> **ПРИМЕЧАНИЕ:**
>ACTS для малой системы независимо собирается в исполняемый файл \(.bin\) и архивируется в директории **suites\\acts** результата сборки.
### Выполнение тестовых случаев на основе C++ \(для стандартных и малых систем\)<a name="section128222336544"></a>
**Выполнение тестовых случаев для малой системы** В настоящее время тестовые случаи обмениваются через NFS и монтируются на плату разработки для выполнения.
**Настройка окружения**
1. Подключите плату разработки к вашему ПК с помощью сетевого кабеля или беспроводной сети.
2. Настройте IP-адрес, маску подсети и шлюз для платы разработки. Убедитесь, что плата разработки и ПК находятся в одной сетевой подсети.
3. Установите и зарегистрируйте сервер NFS на ПК и запустите службу NFS.
4. Выполните команду **mount** для платы разработки, чтобы убедиться, что плата разработки может получить доступ к общим файлам NFS на ПК.
Формат: **mount** _IP-адрес сервера NFS_**:/**_общая директория NFS_ **/**_директория платы разработки_ **nfs**
Пример:
```
mount 192.168.1.10:/nfs /nfs nfs
```
**Выполнение тестовых случаев**
Запустите **ActsDemoTest.bin**, чтобы инициировать выполнение тестовых случаев, и проанализируйте логи последовательного порта, сгенерированные после завершения выполнения.### Разработка тестовых случаев на JavaScript (для стандартной системы) <a name="section159801435165220"></a>
Фреймворк HJSUnit используется для поддержки автоматизированного тестирования приложений OpenHarmony, разработанных с использованием языка JavaScript на основе фреймворка JS-приложений.
**Базовый синтаксис тестовых случаев**
Тестовые случаи разрабатываются на языке JavaScript и должны соответствовать спецификациям программирования этого языка.**Таблица 5**<a name="table13980103565212"></a>
<table><thead align="left"><tr id="row1098093545218"><th class="cellrowborder" valign="top" width="17.92179217921792%" id="mcps1.2.4.1.1"><p id="p49811235135214"><a name="p49811235135214"></a><a name="p49811235135214"></a>Синтаксис</p>
</th>
<th class="cellrowborder" valign="top" width="68.88688868886888%" id="mcps1.2.4.1.2"><p id="p898183565220"><a name="p898183565220"></a><a name="p898183565220"></a>Описание</p>
</th>
<th class="cellrowborder" valign="top" width="13.19131913191919%" id="mcps1.2.4.1.3"><p id="p17981143512526"><a name="p17981143512526"></a><a name="p17981143512526"></a>Обязательно</p>
</th>
</tr>
</thead>
<tbody><tr id="row1598183515528"><td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1 "><p id="p139810358527"><a name="p139810358527"></a><a name="p139810358527"></a>beforeAll</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2 "><p id="p198111352526"><a name="p198111352526"></a><a name="p198111352526"></a>Предварительно устанавливает действие уровня тестового набора, которое выполняется один раз перед выполнением всех тестовых случаев. Вы можете передать функцию действия в качестве единственного параметра.</p>
</td>
<td class="cellrowborder" valign="top" width="13.19131913191919%" headers="mcps1.2.4.1.3 "><p id="p298114355529"><a name="p298114355529"></a><a name="p298114355529"></a>Нет</p>
</td>
</tr>
<tr id="row11981103512529"><td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1 "><p id="p20981135135215"><a name="p20981135135215"></a><a name="p20981135135215"></a>afterAll</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2 "><p id="p39811935115217"><a name="p39811935115217"></a><a name="p39811935115217"></a>Предварительно устанавливает действие уровня тестового набора для очистки, которое выполняется один раз после выполнения всех тестовых случаев.</p>
</td>
</tr>
</tbody></table>Вы можете передать функцию очистки в качестве единственного параметра. </p>
</td>
<td class="cellrowborder" valign="top" width="13.19131913191319%" headers="mcps1.2.4.1.3"><p id="p998110354527"><a name="p998110354527"></a><a name="p998110354527"></a>Нет</p>
</td>
</tr>
<tr id="row1298116359526"><td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1"><p id="p898112359526"><a name="p898112359526"></a><a name="p898112359526"></a>beforeEach</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2">```markdown
<tr id="row149811335175215">
<td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1">
<p id="p149811335175215"><a name="p149811335175215"></a><a name="p149811335175215"></a>beforeEach</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2">
<p id="p149811335175215"><a name="p149811335175215"></a><a name="p149811335175215"></a>Устанавливает действие уровня тестового случая, выполняемое перед выполнением каждого тестового случая. Количество выполнений совпадает с количеством тестовых случаев, определённых с помощью <strong id="b32523248388"><a name="b32523248388"></a><a name="b32523248388"></a>it</strong>. Вы можете передать функцию действия в качестве единственного параметра. </p>
</td>
<td class="cellrowborder" valign="top" width="13.19131913191319%" headers="mcps1.2.4.1.3">
<p id="p13981133585212"><a name="p13981133585212"></a><a name="p13981133585212"></a>Нет</p>
</td>
</tr>
<tr id="row6982435115219">
<td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1">
<p id="p19982133517525"><a name="p19982133517525"></a><a name="p19982133517525"></a>afterEach</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2"><p id="p1398213575219"><a name="p1398213575219"></a><a name="p1398213575219"></a>Устанавливает действие уровня тестового случая, выполняемое после выполнения каждого тестового случая. Количество выполнений совпадает с количеством тестовых случаев, определённых с помощью <strong id="b10590142313399"><a name="b10590142313399"></a><a name="b10590142313399"></a>it</strong>. Вы можете передать функцию очистки в качестве единственного параметра.</p>
</td>
<td class="cellrowborder" valign="top" width="13.19131913191319%" headers="mcps1.2.4.1.3">
<p id="p159821535195219"><a name="p159821535195219"></a><a name="p159821535195219"></a>Нет</p>
</td>
</tr>
<tr id="row16982143513521">
<td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1">
<p id="p598203510527"><a name="p598203510527"></a><a name="p598203510527"></a>describe</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2">
<p id="p5982123595215"><a name="p5982123595215"></a><a name="p5982123595215"></a>Определяет тестовый набор. Вы можете передать два параметра: имя тестового набора и функцию тестового набора. Оператор <strong id="b7320205019400"><a name="b7320205019400"></a><a name="b7320205019400"></a>describe</strong> поддерживает вложенность.</p>
</td>
</tr>
```Вы можете использовать <strong id="b138214222410"><a name="b138214222410"></a><a name="b138214222410"></a>beforeAll</strong>, <strong id="b18677102314115"><a name="b18677102314115"></a><a name="b18677102314115"></a>beforeEach</strong>, <strong id="b1353142514113"><a name="b1353142514113"></a><a name="b1353142514113"></a>afterEach</strong> и <strong id="b131041629204111"><a name="b131041629204111"></a><a name="b131041629204111"></a>afterAll</strong> в каждом <strong id="b590433484116"><a name="b590433484116"></a><a name="b590433484116"></a>describe</strong> выражении.```3 "><p id="p898217352527"><a name="p898217352527"></a><a name="p898217352527"></a>Да</p>
</td>
</tr>
<tr id="row6982113518526"><td class="cellrowborder" valign="top" width="17.92179217921792%" headers="mcps1.2.4.1.1 "><p id="p17982123510526"><a name="p17982123510526"></a><a name="p17982123510526"></a>it</p>
</td>
<td class="cellrowborder" valign="top" width="68.88688868886888%" headers="mcps1.2.4.1.2 "><p id="p598211352522"><a name="p598211352522"></a><a name="p598211352522"></a>Определяет тестовый случай. Вы можете передать три параметра: имя тестового случая, параметр фильтрации и функцию тестового случая.</p>
<p id="p5205769588"><a name="p5205769588"></a><a name="p5205769588"></a>Использование параметра фильтрации:</p>
<p id="p1545919528618"><a name="p1545919528618"></a><a name="p1545919528618"></a>Значение параметра фильтрации — это 32-битное целое число. Установка различных битов в <strong id="b045919521765"><a name="b045919521765"></a><a name="b045919521765"></a>1</strong> означает различные конфигурации:</p>
<a name="ul6932113319395"></a><a name="ul6932113319395"></a><ul id="ul6932113319395"><li>бит 0: указывает, применяется ли параметр фильтрации. <strong id="b1193293318395"><a name="b1193293318395"></a><a name="b1193293318395"></a>1</strong> означает, что тестовый случай используется для функционального тестирования, а другие настройки параметра не применяются.</li><li>Биты 0-10: категории тестовых случаев</li><li>Биты 16-18: масштабы тестовых случаев</li><li>Биты 24-28: уровни тестирования</li></ul>
</td></tr><p id="p7965165151011"><a name="p7965165151011"></a><a name="p7965165151011"></a><strong id="b15148755145114"><a name="b15148755145114"></a><a name="b15148755145114"></a>Категории тестовых случаев</strong>: Биты 0-10 указывают на FUNCTION (функциональное тестирование), PERFORMANCE (тестирование производительности), POWER (тестирование энергопотребления), RELIABILITY (тестирование надежности), SECURITY (тестирование соответствия безопасности), GLOBAL (тестирование целостности), COMPATIBILITY (тестирование совместимости), USER (пользовательское тестирование), STANDARD (тестирование стандартов), SAFETY (тестирование функций безопасности) и RESILIENCE (тестирование устойчивости), соответственно.</p>
<p id="p199651555102"><a name="p199651555102"></a><a name="p199651555102"></a><strong id="b135908568519"><a name="b135908568519"></a><a name="b135908568519"></a>Масштабы тестовых случаев</strong>: Биты 16-18 указывают на SMALL (маломасштабное тестирование), MEDIUM (среднемасштабное тестирование) и LARGE (крупномасштабное тестирование), соответственно.</p>
<p id="p296545151020"><a name="p296545151020"></a><a name="p296545151020"></a><strong id="b12181058125111"><a name="b12181058125111"></a><a name="b12181058125111"></a>Уровни тестирования</strong>: Биты 24-28 указывают на LEVEL0 (уровень-0 тестирование), LEVEL1 (уровень-1 тестирование), LEVEL2 (уровень-2 тестирование), LEVEL3 (уровень-3 тестирование) и LEVEL4 (уровень-4 тестирование), соответственно.</p>
</td>
<td class="cellrowborder" valign="top" width="13.19131913191319%" headers="mcps1.2.4.1.3"><p id="p17601752115716"><a name="p17601752115716"></a><a name="p17601752115716"></a>Да</p>
</td>
</tr>
</tbody>
</table>Используйте стандартный синтаксис Jasmine для написания тестовых случаев.Поддерживается спецификация ES6.1. Сохраните тестовые случаи в директории **entry/src/main/js/test**, чья структура следующая:
```
├── BUILD.gn
│ └── entry
│ └── src
│ └── main
│ └── js
│ └── default
│ └── pages
│ └── index
│ └── index.js # Входной файл
│ └── test # Тестовый код
│ └── resources # Ресурсы HAP
│ └── config.json # Конфигурационный файл HAP
```
2. Запустите фреймворк тестирования JS и загрузите тестовые случаи. Пример для файла **index.js**:
```
// Запустите фреймворк тестирования JS и загрузите тестовые случаи.
import {Core, ExpectExtend} from 'deccjsunit/index'
export default {
data: {
title: ""
},
onInit() {
this.title = this.$t('strings.world');
},
onShow() {
console.info('onShow finish')
const core = Core.getInstance()
const expectExtend = new ExpectExtend({
'id': 'extend'
})
core.addService('expect', expectExtend)
core.init()
const configService = core.getDefaultService('config')
configService.setConfig(this)
require('../../../test/List.test')
core.execute()
},
onReady() {
},
}
```
3. Напишите единичный тестовый случай, руководствуясь следующим примером:
```
// Используйте HJSUnit для выполнения единичного теста.
describe('appInfoTest', function () {
it('app_info_test_001', 0, function () {
var info = app.getInfo()
expect(info.versionName).assertEqual('1.0')
expect(info.versionCode).assertEqual('3')
})
})
```### Упаковка тестовых случаев на основе JavaScript (для стандартной системы)<a name="section445519106559"></a>
Для подробностей о том, как создать HAP, см. руководство по разработке JS-приложений стандартной системы [Сборка и создание HAPs](https://developer.harmonyos.com/en/docs/documentation/doc-guides/build_overview-0000001055075201).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )