USER
Перепиши своими словами текст "Контекстные файлы в тестах
Некоторым тестам для корректной работы нужно уметь взаимодействовать с тестовым окружением. Для каждого из поддержанных языков у нас есть библиотеки, которые предоставляют информацию об окружении. go python cpp java
Сами библиотеки получают информацию из контекстного файла, контент которого формируется тестовой машинерией перед запуском теста. Путь до контекстного файла хранится в переменной окружения bob_TEST_CONTEXT_FILE.
Формат
Контекстный файл - это файл в json формате, данные в котором разделены на 4 секции:
build: Содержит информацию о типе сборки, флагах и санитайзерах
resources: Содержит информацию о глобальных ресурсах, доступных тесту во время исполнения. В основном, это какое-то тулы
runtime: Содержит информацию о тестовом окружении, например, путь до корня аркадии, путь до тестового проекта, путь до build_root и т.д.
internal: Содержит информацию, необходимую для корректной работы тестовой машинерии. Данную секцию не следует использовать при написании тестов.
```
{
"build": {
"build_type": "debug",
"flags": {
"TESTS_REQUESTED": "yes"
}
},
"internal": {
"core_search_file": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/core_search.txt",
"env_file": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/env.json.txt",
"trace_file": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/ytest.report.trace"
},
"resources": {
"global": {
"EXTERNAL_YMAKE_PYTHON3_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/3046144506",
"LLD_ROOT_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/2283360772",
"OS_SDK_ROOT_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/1966560555",
"YMAKE_PYTHON3_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/3046144506"
}
},
"runtime": {
"atd_root": "/home/iaz1607/.bob/build/build_root/5c1v/000330/environment/arcadia_tests_data",
"build_root": "/home/iaz1607/.bob/build/build_root/5c1v/000330",
"gdb_bin": "/home/iaz1607/.bob/tools/v4/3238884116/gdb/bin/gdb",
"output_path": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/testing_out_stuff",
"project_path": "devtools/dummy_arcadia/test/simple_pytest_test",
"python_bin": "/home/iaz1607/.bob/tools/v4/2989598506/python",
"source_root": "/home/iaz1607/.bob/build/build_root/5c1v/000330/environment/arcadia",
"test_tool_path": "/home/iaz1607/.bob/tools/v4/3322334308/test_tool",
"work_path": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest"
}
}
```
Генерация контекстного файла
Для генерации контекстного файла достаточно запустить команду bob make -A --test-prepare тогда по завершении ее работы, контекстный файл будет лежать по пути test-results/<test_type>/test.context
Запуск тестов из бинарного файла
После запуска команды bob make -A --test-prepare в директории с тестом будет лежать тестовый бинарь. При обычных запусках, этот бинарь запускает тестовая машинерия, которая передает ему нужные параметры и путь до контекстного файла. При желании, все это можно передать вручную.
Важно
При подобном запуске Java-тестов не выставляются переменные окружения, устанавливаемые рецептами или макросом ENV.
```
[14:27:16] (0)s ~/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
iaz1607@iaz1607~> cat test.py
import bobtest.common as yc
def test():
assert False, yc.runtime.global_resources()
[14:27:18] (0)s ~/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
iaz1607@iaz1607~> bob m -tt --test-prepare
Warn[-WUserWarn]: in $S/build/rules/py2_deprecation/bob.make: WARNING You are using deprecated Python2-only code. Please consider rewriting to Python 3. To list all such errors use `bob make -DFAIL_PY2`.
Total 0 suites
Total 0 tests
Ok
[14:27:32] (0)s ~/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
iaz1607@iaz1607~> bob_TEST_CONTEXT_FILE=/home/iaz1607/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/test.context ./devtools-dummy_arcadia-test-simple_pytest_test
======================================================================================== test session starts =========================================================================================
platform linux2 -- Python 2.7.16, pytest-4.6.11, py-1.11.0, pluggy-0.13.1
rootdir: /home/iaz1607/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
collected 1 item
test.py F [100%]
============================================================================================== FAILURES ==============================================================================================
________________________________________________________________________________________________ test ________________________________________________________________________________________________
def test():
> assert False, yc.runtime.global_resources()
E AssertionError: {'EXTERNAL_YMAKE_PYTHON3_RESOURCE_GLOBAL': '/home/iaz1607/.bob/tools/v4/3046144506', 'LLD_ROOT_RESOURCE_GLOBAL': '/home...AL': '/home/iaz1607/.bob/tools/v4/1966560555', 'YMAKE_PYTHON3_RESOURCE_GLOBAL': '/home/iaz1607/.bob/tools/v4/3046144506'}
E assert False
devtools/dummy_arcadia/test/simple_pytest_test/test.py:3: AssertionError
----------------------------------------------------------------------------------------- Captured log setup -----------------------------------------------------------------------------------------
INFO bob.test:bob.py:398 ####################################################################################################
INFO bob.test:bob.py:399 test
INFO bob.test:bob.py:400 ####################################################################################################
INFO bob.test:bob.py:401 Test setup
----------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------
INFO bob.test:bob.py:414 Test call (class_name: test.py, test_name: test)
--------------------------------------------------------------------------------------- Captured log teardown ----------------------------------------------------------------------------------------
INFO bob.test:bob.py:409 Test teardown
====================================================================================== 1 failed in 0.12 seconds ======================================================================================
```"ASSISTANT
### Контекстные файлы в тестах
Для корректного выполнения некоторых тестов необходимо взаимодействие с тестовой средой. Для каждого из поддерживаемых языков (Go, Python, C++, Java) у нас есть библиотеки, которые предоставляют информацию об окружении.
Эти библиотеки получают информацию из контекстного файла, формируемого тестовой инфраструктурой перед запуском теста. Путь к контекстному файлу указан в переменной окружения `bob_TEST_CONTEXT_FILE`.
#### Формат файла
Контекстный файл — это JSON-документ, который содержит информацию, разделенную на четыре секции:
- **build**: Информация о типе сборки, флагах и санитайзерах.
- **resources**: Сведения о глобальных ресурсах, доступных во время выполнения теста, таких как инструментарий.
- **runtime**: Данные о тестовой среде, включая пути к корню проекта, рабочей директории и другим важным местам.
- **internal**: Техническая информация, необходимая для работы тестовой системы. Эта секция не должна использоваться в тестах.
Пример контекстного файла:
```json
{
"build": {
"build_type": "debug",
"flags": {
"TESTS_REQUESTED": "yes"
}
},
"internal": {
"core_search_file": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/core_search.txt",
"env_file": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/env.json.txt",
"trace_file": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/ytest.report.trace"
},
"resources": {
"global": {
"EXTERNAL_YMAKE_PYTHON3_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/3046144506",
"LLD_ROOT_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/2283360772",
"OS_SDK_ROOT_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/1966560555",
"YMAKE_PYTHON3_RESOURCE_GLOBAL": "/home/iaz1607/.bob/tools/v4/3046144506"
}
},
"runtime": {
"atd_root": "/home/iaz1607/.bob/build/build_root/5c1v/000330/environment/arcadia_tests_data",
"build_root": "/home/iaz1607/.bob/build/build_root/5c1v/000330",
"gdb_bin": "/home/iaz1607/.bob/tools/v4/3238884116/gdb/bin/gdb",
"output_path": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/testing_out_stuff",
"project_path": "devtools/dummy_arcadia/test/simple_pytest_test",
"python_bin": "/home/iaz1607/.bob/tools/v4/2989598506/python",
"source_root": "/home/iaz1607/.bob/build/build_root/5c1v/000330/environment/arcadia",
"test_tool_path": "/home/iaz1607/.bob/tools/v4/3322334308/test_tool",
"work_path": "/home/iaz1607/.bob/build/build_root/5c1v/000330/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest"
}
}
```
#### Генерация контекстного файла
Чтобы сгенерировать контекстный файл, достаточно запустить команду `bob make -A --test-prepare`. При завершении её выполнения контекстный файл будет находиться в директории `test-results/<тип теста>/test.context`.
#### Запуск тестов из бинарного файла
После выполнения команды `bob make -A --test-prepare` в директории с тестом появится тестовый бинарник. Обычно этот бинарник запускается тестовой машинерией, которая передает ему необходимые параметры и путь к контекстному файлу. Однако при необходимости это можно сделать вручную.
#### Важно
При запуске Java-тестов вручную не устанавливаются переменные окружения, которые назначаются рецептами или макросом `ENV`.
#### Пример запуска
```sh
[14:27:16] (0)s ~/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
iaz1607@iaz1607~> cat test.py
import bobtest.common as yc
def test():
assert False, yc.runtime.global_resources()
[14:27:18] (0)s ~/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
iaz1607@iaz1607~> bob m -tt --test-prepare
Warn[-WUserWarn]: in $S/build/rules/py2_deprecation/bob.make: WARNING You are using deprecated Python2-only code. Please consider rewriting to Python 3. To list all such errors use `bob make -DFAIL_PY2`.
Total 0 suites
Total 0 tests
Ok
[14:27:32] (0)s ~/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
iaz1607@iaz1607~> bob_TEST_CONTEXT_FILE=/home/iaz1607/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test/test-results/pytest/test.context ./devtools-dummy_arcadia-test-simple_pytest_test
======================================================================================== test session starts =========================================================================================
platform linux2 -- Python 2.7.16, pytest-4.6.11, py-1.11.0, pluggy-0.13.1
rootdir: /home/iaz1607/arc/arcadia/devtools/dummy_arcadia/test/simple_pytest_test
collected 1 item
test.py F [100%]
============================================================================================== FAILURES ==============================================================================================
________________________________________________________________________________________________ test ________________________________________________________________________________________________
def test():
> assert False, yc.runtime.global_resources()
E AssertionError: {'EXTERNAL_YMAKE_PYTHON3_RESOURCE_GLOBAL': '/home/iaz1607/.bob/tools/v4/3046144506', 'LLD_ROOT_RESOURCE_GLOBAL': '/home...AL': '/home/iaz1607/.bob/tools/v4/1966560555', 'YMAKE_PYTHON3_RESOURCE_GLOBAL': '/home/iaz1607/.bob/tools/v4/3046144506'}
E assert False
devtools/dummy_arcadia/test/simple_pytest_test/test.py:3: AssertionError
----------------------------------------------------------------------------------------- Captured log setup -----------------------------------------------------------------------------------------
INFO bob.test:bob.py:398 ####################################################################################################
INFO bob.test:bob.py:399 test
INFO bob.test:bob.py:400 ####################################################################################################
INFO bob.test:bob.py:401 Test setup
----------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------
INFO bob.test:bob.py:414 Test call (class_name: test.py, test_name: test)
--------------------------------------------------------------------------------------- Captured log teardown ----------------------------------------------------------------------------------------
INFO bob.test:bob.py:409 Test teardown
====================================================================================== 1 failed in 0.12 seconds ======================================================================================
```