-
Notifications
You must be signed in to change notification settings - Fork 2
Setting up googleTest to work with EPICS build process
This is a guide to set up googleTest with EPICS at ISIS. This allows you to write C++ unit tests for your C/C++ code in an IOC.
- googleTest
- Release file
- Building the test runner
- Running your tests
- Adding a target to run tests
- Adding tests to Jenkins
- Sample Test
You will need to have the googleTest support submodule and built the master branch. This will create a gtest.lib which you can link against.
More information on googleTest can be found at https://github.com/abseil/googletest. We are using version 1.8.x currently at ISIS.
Good places to start on how to write tests using googleTest is here.
More advanced usage (including ASSERT_THROWS, ASSERT_NO_THROW and ASSERT_DOUBLE_EQ) can be found here.
Examples can be found here.
Remember to add the path to the Google Test support module in your support module Release file.
GTEST=$(SUPPORT)/googletest/master
Make sure you include the following lines in your Makefile alongside the source code to create a test runner executable.
# googleTest Runner
TESTPROD_HOST += runner
USR_CPPFLAGS += -I$(GTEST)/googletest/include
runner_SRCS += run_all_tests.cc
runner_LIBS += gtestWhere run_all_tests.cc is a file containing the following lines. Make sure to also add all libs needed for the files being tested.
#include "gtest/gtest.h"
int main(int argc, char **argv) {
::testing::InitGoogleTest( &argc, argv );
return RUN_ALL_TESTS();
}
This file will run all your test. It will need to be in the same directory as your tests/code.
You then need to include all the files you need for your tests using
runner_SRCS += #names of test files and source filesIf your tests are in a different directory to your source files, you can add that directory to your SRCs path using
SRC_DIRS += #path to your tests directoryInclude a copy of the following batch file in your top directory to run all your tests. It will create XML reports on your tests in test-reports directory at the top level. Replace IOCNAME by the name of your IOC.
:: Run all tests
@echo off
SET TOP="."
SET Tests_failed=%errorlevel%
:: Change the directory depending on if you have a src sub directory
call IOCNameSup\src\O.windows-x64\runner.exe --gtest_output=xml:%TOP%\test-reports\TEST-IOCName.xml
exit /B %Tests_failed%To run the tests by make test add the following to the top level Makefile of the support module
.PHONY: test
test:
run_tests.batTo have these tests run on Jenkins, add the following to the bottom of the jenkins_build.bat file replacing IOCNAME with the name of your IOC.
:: Run googleTest C++ unit tests for IOCNAME
cd /d %FINAL_DIR%\support\IOCNAME\master\
make test
if %errorlevel% neq 0 (
@echo ERROR: Tests failed in IOCNAME\master
goto ERROR
)Make sure that Jenkins has been configured to look for xUnit test reports and that you have the xunit Jenkins plugin installed.
The following below is a sample test file
#include "gtest/gtest.h"
namespace {
TEST(Sample, this_is_a_sample_test){
ASSERT_EQ(1+1, 2);
}
} // namespace