昇腾社区首页
中文
注册

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. 包含必要的测试桩文件和测试依赖的头文件,如:
    1
    #include "udf_stub.h" #include "udf_read_file.h" #include "udf_test_utils.h" 
    
  2. 包含待测文件,以下以测试add_flow_func.cpp文件为例:
    1
    #include "add_flow_func.cpp" 
    
  1. 构造输入数据和预期的输出数据:在testcase/udf_add/data下面新增数据文件和预期的输出数据文件,填入对应数据,数据之间用空格分开,如:
    1
    20 40 60 20 40
    
  1. 调用如下接口读取数据或者预期结果。
    1
    uint32_t input[data_num] = {0};bool status = ReadFile(data_path, input, 10);
    
  2. 构造测试用例,如下以udf_add为例。
    1. 构造用户的UDF函数类对象。
      1
      std::unique_ptr<AddFlowFunc> udf_add(new AddFlowFunc); 
      
    2. 构造MetaParams对象并根据需要设置相关参数(MetaParamsMock是继承MetaParams的桩对象)。
      1
      std::shared_ptr<MetaParamsMock> params = std::make_shared<MetaParamsMock>();  params->Attr("out_type", TensorDataType::DT_UINT32);
      
    3. 测试Init函数。
      1
      udf_add->Init(params);
      
    4. 构造UDF运行的上下文MetaRunContextMock对象(MetaRunContextMock是继承MetaRunContext的桩对象)。
      1
      std::shared_ptr<MetaRunContextMock> runContext1 = std::make_shared<MetaRunContextMock>();
      
    5. 构造UDF运行的输入数据。
      1
      runContext1->Input({data_types, shapes, (void *)input}); runContext1->Input({data_types, shapes, (void *)input});
      
    6. 从运行的上下文中获取指定输出队列的数据。
      1
      void *output = GET_UDF_OUTPUT(runContext1, 0); EXPECT_NE(output, nullptr);
      
    7. 校验输出数据是否符合预期。
      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);
      

UT编译和执行

  1. 根据CANN软件包的安装路径设置ASCEND_HOME_PATH环境变量,不设置默认ASCEND_HOME_PATH值为/usr/local/Ascend。

    export ASCEND_HOME_PATH=CANN包安装路径

  2. 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
    )
  3. 修改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}
    )
    
  4. 修改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}
    )
    
  5. 将tools目录下的googletest-release-1.8.0.tar.gz解压缩到当前目录。
    cd tools
    tar -zvxf googletest-release-1.8.0.tar.gz
  6. 编译测试用例。
    cd script
    chmod +x build.sh
    ./build.sh