单元测试实施解惑(二)? 别“桩”了!
作者:网络转载 发布时间:[ 2012/9/27 11:08:08 ] 推荐标签:
我在《单元测试实施解惑(一)》中指出,使用象Cmockery这样的测试框架,将所需测试的模块通过打桩的方法实施单元测试并不是有效的方法。在这篇文章中,让我们一同来探索更好的方法。在继续探索之前,让我从传统单元测试开始引入所主张的方法。
代码所示的分别是某内存池模块(mpool.c)和双向链表模块(dll.c)的代码片断,现在让我们聚焦于为内存池模块的mpool_buffer_alloc函数实施单元测试。由于该函数使用到了双向链表模块的dll_pop_head函数,因此,我们需要对dll_pop_head函数进行打桩。(注:实际上还得对global_interrupt_disable和global_interrupt_enable两函数打桩,但为了简化我们只以dll_pop_head为例)
mpool.c
void* mpool_buffer_alloc (mpool_handle_t _handle)
{
interrupt_level_t level;
mpool_node_t *p_node;
level = global_interrupt_disable ();
if (is_invalid_handle (_handle)) {
global_interrupt_enable (level);
return null;
}
p_node = (mpool_node_t *)dll_pop_head (&_handle->free_buffer_);
if (0 == p_node) {
_handle->stats_nobuf_ ++;
global_interrupt_enable (level);
return null;
}
global_interrupt_enable (level);
p_node->in_use_ = true;
return (void *)p_node->addr_;
}
dll.c
dll_node_t *dll_pop_head (dll_t *_p_dll)
{
dll_node_t *p_node = _p_dll->head_;
if (p_node != 0) {
_p_dll->count_--;
_p_dll->head_ = p_node->next_;
if (0 == _p_dll->head_) {
_p_dll->tail_ = 0;
}
else {
p_node->next_->prev_ = 0;
}
p_node->next_ = 0;
p_node->prev_ = 0;
}
return p_node;
}
为了便于理解,下面代码示例了一个简化了的桩和mpool_buffer_alloc函数的测试用例。请注意,测试用例中的handle实参假设之前通过mpool_init函数所获得,代码中同样为了简化并未列出。
stub_dll.c
dll_node_t *g_p_node;
dll_node_t *dll_pop_head (dll_t *_p_dll)
{
return g_p_node;
}
test_mpool.c
void test_mpool_buffer_alloc ()
{
mpool_node_t mnode;
// set up test environment
mnode.addr_ = 0x5A5A5A5A;
mnode.in_use_ = false;
// do test
g_p_node = &mnode.node_;
UNITEST_EQUALS (mpool_buffer_alloc (handle), 0x5A5A5A5A);
g_p_node = 0;
UNITEST_EQUALS (mpool_buffer_alloc (handle), 0);
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11