关闭

单元测试实施解惑(二)— 别“桩”了!

发表于:2012-9-27 11:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李云    来源:51Testing软件测试网采编

  我在《单元测试实施解惑(一)》中指出,使用象Cmockery这样的测试框架,将所需测试的模块通过打桩的方法实施单元测试并不是最有效的方法。在这篇文章中,让我们一同来探索更好的方法。在继续探索之前,让我从传统单元测试开始引入所主张的方法。

  图1中所示的分别是某内存池模块(mpool.c)和双向链表模块(dll.c)的代码片断,现在让我们聚焦于为内存池模块的mpool_buffer_alloc函数实施单元测试。由于该函数使用到了双向链表模块的dll_pop_head函数,因此,我们需要对dll_pop_head函数进行打桩。(注:实际上还得对global_interrupt_disable和global_interrupt_enable两函数打桩,但为了简化我们只以dll_pop_head为例)

  1. mpool.c 
  2. void* mpool_buffer_alloc (mpool_handle_t _handle) 
  3.     interrupt_level_t level; 
  4.     mpool_node_t *p_node; 
  5.      
  6.     level = global_interrupt_disable (); 
  7.     if (is_invalid_handle (_handle)) { 
  8.         global_interrupt_enable (level); 
  9.         return null; 
  10.     } 
  11.     p_node = (mpool_node_t *)dll_pop_head (&_handle->free_buffer_); 
  12.     if (0 == p_node) { 
  13.         _handle->stats_nobuf_ ++; 
  14.         global_interrupt_enable (level); 
  15.         return null; 
  16.     } 
  17.     global_interrupt_enable (level); 
  18.     p_node->in_use_ = true
  19.     return (void *)p_node->addr_; 

  20. dll.c 
  21. dll_node_t *dll_pop_head (dll_t *_p_dll) 
  22.     dll_node_t *p_node = _p_dll->head_; 
  23.     if (p_node != 0) { 
  24.         _p_dll->count_--; 
  25.         _p_dll->head_ = p_node->next_; 
  26.         if (0 == _p_dll->head_) { 
  27.             _p_dll->tail_ = 0; 
  28.         } 
  29.         else { 
  30.             p_node->next_->prev_ = 0; 
  31.         } 
  32.         p_node->next_ = 0; 
  33.         p_node->prev_ = 0; 
  34.     } 
  35.      
  36.     return p_node; 
  37. }

图1

  为了便于理解,图2示例了一个简化了的桩和mpool_buffer_alloc函数的测试用例。请注意,测试用例中的handle实参假设之前通过mpool_init函数所获得,图中同样为了简化并未列出。

  1. stub_dll.c 
  2. dll_node_t *g_p_node; 
  3. dll_node_t *dll_pop_head (dll_t *_p_dll) 
  4.     return g_p_node; 
  5. test_mpool.c 
  6. void test_mpool_buffer_alloc () 
  7.     mpool_node_t mnode; 
  8.     // set up test environment 
  9.     mnode.addr_ = 0x5A5A5A5A; 
  10.     mnode.in_use_ = false
  11.     // do test 
  12.     g_p_node = &mnode.node_; 
  13.     UNITEST_EQUALS (mpool_buffer_alloc (handle), 0x5A5A5A5A); 
  14.     g_p_node = 0; 
  15.     UNITEST_EQUALS (mpool_buffer_alloc (handle), 0); 
  16. }

图2

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号