DolphinDB内置的单元测试框架,具备编写用例、执行用例和输出测试报告的能力。和其他语言的测试框架类似,DolphinDB的测试框架有声明测试用例和assert。以下是DolphinDB中avg的测试用例。
@testing:case="function_avg" assert 1, eqObj(avg 1 2 3, 2.000,3) assert 2, eqObj(avg 2 3.5 4, 3.167, 3) assert 3, eqObj(avg true false, 0.5, 1) x=1 NULL NULL NULL 3; assert 4, eqObj(avg x, 2.0);
DolphinDB还有异常测试用例,用于验证代码是否按照期望抛出异常。DolphinDB具有两类异常:syntaxError和exception。DolphinDB运行代码的过程是,先对代码进行语法解析,如果发现变量、函数未定义等错误时,将报告syntaxError,不会执行代码;解析成功后,才会逐行执行代码,执行代码中出现的问题就是exception。
下面是syntaxError的用例,2019.00.28是一个非法日期,DolphinDB无法解析该日期,抛出了syntaxError的错误。
@testing:case="test_syntaxError", syntaxError=1 a=2019.00.28
下面是exception的用例,代码中没有语法错误,但是向量相加要求长度必须相等,因此执行代码时会抛出异常,属于exception。
@testing:case="test_function_add_size_incompatible",exception=1 a=[1, 2, 3] b=[1, 2] a+b
DolphinDB本身提供了Java,Python等编程语言的接口,那为什么还要使用DolphinDB自身的脚本语言来编写测试用例呢?原因有三:(一)便于定位问题。使用Java或Python来编写DolphinDB的测试用例,会增加测试的复杂度,如果发现问题,难以判断是api还是server端的bug。(二)测试用例执行效率高。直接在server端执行用例,测试数据集无需传输到客户端,减少了执行耗时。(三)DolphinDB的混合范式编程让测试用例的代码非常简洁。测试时需要涵盖所有数据类型,通过DolphinDB的一些高阶函数,可以写出非常简洁的测试用例。下面是sum函数覆盖所有数值类型的测试用例。通过each函数,将sum函数应用到各个类型的数组,并验证结果的正确性。
@testing:case="function_sum" def f(dtype){ vec = dtype(9 -1 23 NULL NULL NULL 1 -10 13 -2) expected = double(33) return eqObj(double(sum(vec)), expected) } types=[char, short, int,long, float, double] assert 1, each(f, types)