UT测试
功能描述
UT测试主要用于验证UDF实现文件(*.cc)功能的正确性。
目录结构
├ ut // UDF工作目录 │├ build // ut编译路径 //编译完成后产生该目录 │├ common // ut通用实现文件 ││├ data_utils.h // tensor data计算相关的头文件,如获取tensor中元素个数,data size等 ││├ data_utils.cpp // tensor data计算相关的实现文件 │├ include // udf的桩函数头文件目录 ││├ udf_stub.h // udf的打桩头文件 │├ script // ut编译脚本目录 ││├ build.sh // ut的编译文件 │├ src // 运行ut的源码目录 ││├ main.cpp // 运行ut的源码文件 │├ testcase // ut用例目录 ││├ udf_add // udf_add UDF样例的ut用例目录 │││├ data // udf_add ut用例的输入输出数据文件目录 ││││├ flow_func_add_input.txt // udf_add ut用例的输入数据文件 ││││├ flow_func_add_expert.txt // udf_add proc1 ut用例的期望输出数据文件 ││││├ flow_func_add_expert2.txt // udf_add proc2 ut用例的期望输出数据文件 │││├ src // udf_add ut用例的实现文件目录 ││││├ add_flow_func_test.cpp // udf_add ut用例的实现文件 ││├ udf_add_depend // udf_add_depend UDF样例的ut用例目录 │││├ data // udf_add ut用例的输入输出数据文件目录 ││││├ flow_func_add_depend_input.txt // udf_add_depend ut用例的输入数据文件 ││││├ flow_func_add_depend_expert.txt // udf_add_depend ut用例的期望输出数据文件 │││├ src // udf_add_depend ut用例的实现文件目录 ││││├ add_flow_func_depend_test.cpp // udf_add_depend ut用例的实现文件 ││├ udf_call_add_nn // udf_call_add_nn UDF样例的ut用例目录 │││├ data // udf_add ut用例的输入输出数据文件目录 ││││├ udf_call_add_nn_input.txt // udf_call_add_nn ut用例的输入数据文件 │││├ src // udf_call_add_nn ut用例的实现文件目录 ││││├ call_nn_flow_func_test.cpp // udf_call_add_nn ut用例的实现文件 ││├ CMakeLists.txt // ut用例编译CMakeLists文件 │├ tools // ut的googletest工具文件目录 ││├ googletest-release-1.8.0.tar.gz // googletest文件,该文件是第三方开源的
UT测试用例编写
如下以编译udf_add的UT测试用例add_flow_func_test.cpp为例,介绍如何编写测试用例。
- 包含必要的测试桩文件和测试依赖的头文件,如:
1
#include "udf_stub.h" #include "udf_read_file.h" #include "udf_test_utils.h"
- 包含待测文件,以下以测试add_flow_func.cpp文件为例:
1
#include "add_flow_func.cpp"
- 构造输入数据和预期的输出数据:在testcase/udf_add/data下面新增数据文件和预期的输出数据文件,填入对应数据,数据之间用空格分开,如:
1
20 40 60 20 40
- 调用如下接口读取数据或者预期结果。
1
uint32_t input[data_num] = {0};bool status = ReadFile(data_path, input, 10);
- 构造测试用例,如下以udf_add为例。
- 构造用户的UDF函数类对象。
1
std::unique_ptr<AddFlowFunc> udf_add(new AddFlowFunc);
- 构造MetaParams对象并根据需要设置相关参数(MetaParamsMock是继承MetaParams的桩对象)。
1
std::shared_ptr<MetaParamsMock> params = std::make_shared<MetaParamsMock>(); params->Attr("out_type", TensorDataType::DT_UINT32);
- 测试Init函数。
1
udf_add->Init(params);
- 构造UDF运行的上下文MetaRunContextMock对象(MetaRunContextMock是继承MetaRunContext的桩对象)。
1
std::shared_ptr<MetaRunContextMock> runContext1 = std::make_shared<MetaRunContextMock>();
- 构造UDF运行的输入数据。
1
runContext1->Input({data_types, shapes, (void *)input}); runContext1->Input({data_types, shapes, (void *)input});
- 从运行的上下文中获取指定输出队列的数据。
1
void *output = GET_UDF_OUTPUT(runContext1, 0); EXPECT_NE(output, nullptr);
- 校验输出数据是否符合预期。
1
void *output = GET_UDF_OUTPUT(runContext1, 0); EXPECT_NE(output, nullptr); bool compare = CompareResult((unsigned int *)output, output_exp1, data_num); EXPECT_EQ(compare, true);
- 构造用户的UDF函数类对象。
UT编译和执行
- 根据CANN软件包的安装路径设置ASCEND_HOME_PATH环境变量,不设置默认ASCEND_HOME_PATH值为/usr/local/Ascend。
- CMakeLists.txt文件的整体结构如下。
cmake_minimum_required(VERSION 3.15) project(udf_ut) set(CMAKE_CXX_STANDARD 11) if(DEFINED ENV{ASCEND_HOME_PATH}) set(ASCEND_HOME_PATH $ENV{ASCEND_HOME_PATH}) message(STATUS "Read ASCEND_HOME_PATH from ENV: ${ASCEND_HOME_PATH}") else() set(ASCEND_HOME_PATH /usr/local/Ascend) message(STATUS "Default ASCEND_HOME_PATH=${ASCEND_HOME_PATH}, you can export ASCEND_HOME_PATH to set this environment") endif() set(UDF_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..) set(TESTCASE_DIR ${UDF_DIR}/ut/testcase) # add gtest include(FetchContent) FetchContent_Declare( googletest # Specify the commit you depend on and update it regularly. URL ${UDF_DIR}/ut/tools/googletest-release-1.8.0.tar.gz ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) FetchContent_GetProperties( googletest ) # add src file set(udf_src ) set(udf_llt_src ${udf_src} ) add_library(udf_llt STATIC ${udf_llt_src} ) # add udf llt include file set(udf_llt_include ${googletest_SOURCE_DIR}/googletest/include ${googletest_SOURCE_DIR}/googlemock/include xxxx ) set(flow_func_inc_dir "${ASCEND_HOME_PATH}/latest/x86_64-linux/include/flow_func") # add link so path target_include_directories(udf_llt PUBLIC ${udf_llt_include} ${flow_func_inc_dir} ) target_compile_options(udf_llt PUBLIC -g -Dgoogle=ascend_private -DRUN_TEST ) target_link_libraries(udf_llt PUBLIC #${ASCEND_HOME_PATH}/latest/x86_64-linux/lib64/stub/x86_64/libflow_func.so -ldl -lpthread -lgtest -lgmock ) # add ut testcast files set(udf_ut_files ) add_executable(udf_ut ${udf_ut_files} ) target_link_libraries(udf_ut PRIVATE -Wl,--whole-archive ${ASCEND_HOME_PATH}/latest/x86_64-linux/lib64/stub/x86_64/libflow_func.so udf_llt -Wl,--no-whole-archive -lpthread -lgcov ) target_compile_definitions(udf_ut PUBLIC google=ascend_private RUN_TEST )
- 修改CMakeLists.txt文件中的udf_src变量,添加待测试的udf源文件。示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# add src file set(udf_src ${UDF_DIR}/ut/src/main.cpp ${UDF_DIR}/ut/common/data_utils.cpp ${UDF_DIR}/ut/utils/udf_read_file.cpp ${UDF_DIR}/ut/utils/udf_test_utils.cpp #add udf src file path that to be tested ${UDF_DIR}/udf_add/add_flow_func.cpp ${UDF_DIR}/udf_add_depend/add_depend.cpp ${UDF_DIR}/udf_add_depend/add_flow_func_depend.cpp ${UDF_DIR}/udf_call_add_nn/call_nn_flow_func.cpp ) set(udf_llt_src ${udf_src} )
- 修改CMakeLists.txt文件中的udf_ut_files变量,添加测试用例文件。示例如下:
1 2 3 4 5 6 7 8 9 10
# add ut testcast files set(udf_ut_files ${TESTCASE_DIR}/udf_add/src/add_flow_func_test.cpp ${TESTCASE_DIR}/udf_add_depend/src/add_flow_func_depend_test.cpp ${TESTCASE_DIR}/udf_call_add_nn/src/call_nn_flow_func_test.cpp ) add_executable(udf_ut ${udf_ut_files} )
- 将tools目录下的googletest-release-1.8.0.tar.gz解压缩到当前目录。
cd tools tar -zvxf googletest-release-1.8.0.tar.gz
- 编译测试用例。
cd script chmod +x build.sh ./build.sh
父主题: UDF开发