- Sphere Engine overview
- Compilers
- Overview
- API
- Widgets
- Resources
- Problems
- Overview
- API
- Widgets
- Handbook
- Resources
- Containers
- Overview
- Glossary
- API
- Workspaces
- Handbook
- Resources
- RESOURCES
- Programming languages
- Modules comparison
- Webhooks
- Infrastructure management
- API changelog
- FAQ
What you will learn?
The guide provided by this document covers the following topics:
- usage of unit test scenario,
- usage of IO testing scenario,
- configuration file config.json,
- scripts for scenario stages,
- usage of project utilities.
Build error example
In this example, we show how to handle the situation with the project failing during the build stage. We will
consider a hypothetical advanced multi-file C++ application with the Makefile. So, we assume the following:
- there is a
Makefilefile in the workspace ($SE_PATH_WORKSPACE) directory, - the build process is performed by calling
./configureandmakecommands, - the successful build produces a binary file
appin the workspace ($SE_PATH_WORKSPACE) directory, - there is a
runscenario launching the application.
config.json
{
(...)
"scenarios": {
// run scenario for run button
"run": {
"stages": {
"build": {
"command": ".sphere-engine/build.sh"
},
"run": {
"command": ".sphere-engine/run.sh"
}
},
"output": {
"type": "console"
}
}
},
(...)
Script .sphere-engine/build.sh
#!/bin/bash
./configure && make
BUILD_EXIT_CODE="$?"
if [ $BUILD_EXIT_CODE -ne 0 ]; then
echo "Build failed"
se_utils_cli scenario_result status "BE"
elif [[ ! -f app ]]; then
echo "Build failed - application binary is missing"
se_utils_cli scenario_result status "BE"
elif [[ ! -x app ]]; then
se_utils_cli debug_log "Warning: application binary is not executable"
chmod +x app
echo "Build successful"
else
echo "Build successful"
fi
Script .sphere-engine/run.sh
#!/bin/bash
./app
Unit tests example
This is an example of a hypothetical Java application using mvn build automation tool. We assume the following:
- there is a
pom.xmlfile in the workspace ($SE_PATH_WORKSPACE) directory, - the application has
jUnitunit tests generating areport.xmlreport to the$SE_PATH_WORKSPACE/targetdirectory, - there is a
runscenario launching unit tests, - there is a
testscenario evaluating the application:- the test of the the application is successful if at least one unit test passes,
- the score is equal to the percentage of passing unit tests.
config.json
{
(...)
"scenarios": {
// run scenario for run button
"run": {
"stages": {
"build": {
"command": ".sphere-engine/build.sh"
},
"run": {
"command": ".sphere-engine/run.sh"
}
},
"output": {
"type": "console"
}
},
// test scenario for test button
"test": {
"stages": {
"build": {
"command": ".sphere-engine/build.sh"
},
"run": {
"command": ".sphere-engine/run.sh"
},
"test": {
"command": ".sphere-engine/test.sh"
// or alternatively for Python stage script:
// "command": "python3 .sphere-engine/test.py"
},
"post": {
"command": ".sphere-engine/post.sh"
}
},
"output": {
"type": "tests"
}
}
},
(...)
}
Script .sphere-engine/build.sh
#!/bin/bash
mvn install -DskipTests
MAVEN_BUILD_EXIT_CODE="$?"
if [ $MAVEN_BUILD_EXIT_CODE -ne 0 ]; then
echo "Build failed"
se_utils_cli scenario_result status "BE"
else
echo "Build successful"
fi
Script .sphere-engine/run.sh
#!/bin/bash
mvn test
Script .sphere-engine/test.sh
#!/bin/bash
if [ -f $SE_PATH_WORKSPACE/target/report.xml ]; then
cp "$SE_PATH_WORKSPACE/target/report.xml" "$SE_PATH_UNIT_TESTS_REPORT"
else
se_utils_cli debug_log "Missing unit test report file"
se_utils_cli scenario_result status "FAIL"
exit 0;
fi
se_utils_cli evaluate UnitTestsEvaluator
Script .sphere-engine/test.py
Note: this is an alternative Python variant of the bash script test.sh presented above.
from se_utils.evaluator import UnitTestsEvaluator
from se_utils.validator import XUnitValidator
from se_utils.converter import XUnitConverter
from se_utils import environment
custom_ut_report_path=f'{environment.path.workspace}/target/report.xml'
UnitTestsEvaluator(
validator=XUnitValidator(ut_report_path=custom_ut_report_path),
converter=XUnitConverter(ut_report_path=custom_ut_report_path),
).run()
Script .sphere-engine/post.sh
#!/bin/bash
FINAL_STATUS="$(se_utils_cli scenario_result status)"
if [[ "$FINAL_STATUS" == "BE" ]]; then
se_utils_cli debug_log "BUILD STAGE OUTPUT"
se_utils_cli debug_log < "$SE_PATH_STAGE_BUILD_STDOUT"
se_utils_cli debug_log "BUILD STAGE ERROR"
se_utils_cli debug_log < "$SE_PATH_STAGE_BUILD_STDERR"
fi
Input output example
This is an example of a hypothetical C++ console application. We assume the following:
- this application reads data from the
stdinstream and produce output to thestdoutstream, - there is a reference pair of an input file and an output file called a TEST CASE,
- the output file of the TEST CASE is a correct answer for the input file of the TEST CASE,
- the input file is located in the
$SE_PATH_TEST_CASESdirectory as a file of the name0.in, - the output file is located in the
$SE_PATH_TEST_CASESdirectory as a file of the name0.out,
- there is a
runscenario launching an application with the input file provided to thestdinstream, - there is a
testscenario evaluating the application:- the application is also executed with the input file provided to the
stdinstream, - the output data (generated by the console application) is stored in a default location (i.e.,
$SE_PATH_STAGE_RUN_STDOUT), - the output data is expected to match the output data of the TEST CASE.
- the application is also executed with the input file provided to the
config.json
{
(...)
"scenarios": {
// run scenario for run button
"run": {
"stages": {
"build": {
"command": ".sphere-engine/build.sh"
},
"run": {
"command": ".sphere-engine/run.sh"
}
},
"output": {
"type": "console"
}
},
// test scenario for test button
"test": {
"stages": {
"build": {
"command": ".sphere-engine/build.sh"
},
"run": {
"command": ".sphere-engine/run.sh",
// this is to redirect output data to the $SE_PATH_STAGE_RUN_STDOUT file
"redirect_streams_to": "files"
},
"test": {
"command": ".sphere-engine/test.sh"
// or alternatively for Python stage script:
// "command": "python3 .sphere-engine/test.py"
}
},
"output": {
"type": "tests"
}
}
},
(...)
}
Script .sphere-engine/build.sh
#!/bin/bash
g++ -o app app.cpp
COMPILATION_EXIT_CODE="$?"
if [ $COMPILATION_EXIT_CODE -ne 0 ]; then
echo "Compilation failed"
se_utils_cli scenario_result status "BE"
else
echo "Compilation successful"
fi
Script .sphere-engine/run.sh
#!/bin/bash
./app < "$SE_PATH_TEST_CASES/0.in"
Script .sphere-engine/test.sh
#!/bin/bash
# both user output and model output files are in their default location
# so there is no need for additional configuration
se_utils_cli evaluate IOEvaluator
Script .sphere-engine/test.py
Note: this is an alternative Python variant of the bash script test.sh presented above.
from se_utils.evaluator import IOEvaluator
# both user output and model output files are in their default location
# so there is no need for additional configuration
IOEvaluator().run()