cunit单元测试
以md5测试为例子,练习了cunit这个单元测试工具。 要写一个测试用例,只需要遵循用例的框架编写就好了。 我们应该要清楚自己编写的函数的输入是什么,输出是什么。然后使用cunit的断言看结果是否符合预期,是的话测试通过,否则说明编码有问题。 就这次将要编写的md5为例,需要测试两个函数,一个是输入字符串,输出计算后的md5值,另一个是输入文件路径,输出文件的md5值。所以用例是否通过的条件就是计算的md5值是否正确。 先来看看main函数 :::c int main(int argc, const char *argv[]) { return run_test(); } 没什么特别的,就是运行了run_test这个函数。 再来看看run_test :::c int run_test() { if(CU_initialize_registry()) { exit(EXIT_FAILURE); } else { AddTests(); /**** Automated Mode ***************** CU_set_output_filename("TestMax"); CU_list_tests_to_file(); CU_automated_run_tests(); //************************************/ /*********basic mode**************/ // CU_basic_set_mode(CU_BRM_VERBOSE); // CU_basic_run_tests(); /*********console mode**************/ CU_console_run_tests(); CU_cleanup_registry(); return CU_get_error(); } } 开始变得有趣了,我们看到运行cunit,先要执行CU_initialize_registry(),成功后运行我们写的AddTests添加测试用例,接着运行测试模式,这里有三种,我用了第三种控制台模式。最后return退出。 接着来看看我们的AddTests做了什么工作。 :::c void AddTests() { assert(NULL != CU_get_registry()); assert(!CU_is_test_running()); if(CUE_SUCCESS != CU_register_suites(suites)) { exit(EXIT_FAILURE); } } 原来AddTests的动作就是注册suites。那么什么是suites? :::c CU_TestInfo testcase[] = { {"test for md5", test_md5_null}, {"test for md5 a", test_md5_a}, {"test for md5 letter", test_md5_letter}, CU_TEST_INFO_NULL }; CU_TestInfo testcase2[] = { {"test for md5 file", test_md5_file}, CU_TEST_INFO_NULL }; int suite_success_init(void) { return 0; } int suite_success_clean(void) { return 0; } CU_SuiteInfo suites[] = { {"test suite 1", suite_success_init, suite_success_clean,testcase}, {"test suite 2", suite_success_init, suite_success_clean,testcase2}, CU_SUITE_INFO_NULL }; 从下往上看,suites 其实就是记录SuiteInfo的结构体,这里有两个suite,分别是suite1和suite2,而suite1中包含三个测试用例,suite2中包含一个。...