870920 Menu

JUCE类库分析与检测详解

  • 性能分析:可检测某些代码或函数的平均执行时间,测量结果可输出或保存以供分析。
  • 对错检测(单元检测):检查并校验某个类的成员函数的执行和计算结果是否正确。
  • 性能分析使用PerformanceCounter类,对错检测使用UnitTest和UnitTestRunner类。

PerformanceCounter的使用流程
 在需检测的语句之前创建PerformanceCounter栈对象,假设为pc
 pc.start()
 要检测的代码或函数
 pc.stop()

示例代码:(网站发布,略)

UnitTest和UnitTestRunner使用流程

UnitTest可对计算结果为true或false的表达式进行正确与否的检测。可用于类、函数、表达式的正确性检测而无需专门写测试程序。实现此功能需两个类:
 UnitTest 单元检测,抽象基类
 UnitTestRunner 执行检测

具体步骤有5
1、自定义单元检测类。该类定义在要执行检测的类的cpp源文件的最后,全部内联(类定义与类实现不分离)。该类必须继承自UnitTest类,实现其纯虚函数runTest(),在该函数中首先调用beginTest()函数,通知系统,检测即将开始,然后重复调用expect(),该函数的参数为(所期望的结果为true的表达式或待检测类的某个成员函数的返回值),这些表达式和函数的返回值来源于要执行检测的类。即:

  • 使用编译条件宏控制自定义的单元检测类是否参与编译(如果检测通过后即删除此次检测,则无需这一步)。
  • 自定义的单元检测类继承自抽象基类UnitTest,以全部内联的形式写在要执行检测的类的cpp源文件的最后。
  • runTest()是自定义的单元检测类的成员函数,也是执行单元检测的核心函数。
  • runTest()函数中首先调用beginTest(“…”);开始一组新的检测。
  • 而后重复调用expect()函数,每个expect()代表一个具体的检测。
  • expect()函数的参数用来检测待测类的成员函数运行结果是否正确。

示例:(略)

2、定义一个全局性的静态栈对象,紧接着上面的语句(自定义检测类之后)。该对象的类型为刚刚定义的单元检测类。之所以为全局静态对象,是因为在程序编译时,可确保该对象独立于任何类而位于程序的静态数据区中,以方便UnittestRunner检测器类对已经存在的检测单元进行检测。
static TestForMyClass test;
#endif // 对应单元检测类的UNIT_TESTS宏(可选)

3、执行检测。在使用待测类的类中,或者干脆在JUCEApplication或DocumentWindow类中,运行以下代码:(略)

4、AppConfig.h中定义检测宏:

5、查看检测结果。调试运行,如果检测通过,调试器控制台中将输出“All tests completed successfully(所有检测全部成功)”。如果检测到任何一条expect()的结果为假,则调试器控制台中输出错误消息。如果3中没有调用setAssertOnFailure()函数,或者调用该函数时参数设置为true,则程序直接中断。上例的输出结果为:
——————————————————–
Starting test: MyClass test / 本次检测…
!!! Test 1 failed
!!! Test 3 failed
FAILED!! 2 tests failed, out of a total of 3

6、关于检测宏:可随时注释或取消注释AppConfig.h中的检测宏定义,使该宏所包裹的语句参与或不参与编译。

Result
Result类代表某项操作或处理的两种状态:成功或失败。失败时可给出对应的文本描述。通常将本类对象作为某个函数的返回值。可利用本类使程序中的异常处理功能更加完善。示例:(略)