依赖注入在单元测试中的应用
作者:网络转载 发布时间:[ 2012/7/9 15:04:16 ] 推荐标签:
两个或是更多的类通过彼此的合作来实现业务逻辑,此过程中每个对象通过自身获取其合作对象的引用,造成了代码高耦合,难以测试。
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则,用来削减计算机程序的耦合问题。控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI.
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。本文描述了一种依赖注入法在实际测试过程中的应用。
如果被测对象依赖于不可预期的行为,那么其结果往往无法或难以预知。如"被测函数依赖系统时间"这种情况。
被测函数的功能为:取当前系统时间作为随机种子,利用随机数调整数组内元素的顺序。本函数单测的难点在于结果的验证上:存在一定概率,调整后顺序不变。
void reorder(
bsl::deque<uint32_t> &deque)
{
srand(getCurTime());
for (int indexLeft = 0;
indexLeft < deque.size();
++indexLeft)
{
int indexRight = rand()% (deque.size()-indexLeft);
swap(deque[indexLeft],
deque[indexRight]);
}
}
旧的测试代码
注:下面的测试代码存在一定概率使断言失败
TEST_OLD(test_reorder_suite,should_reorder_deque_randomly)
{
bsl::deque<uint32_t> deque;
deque.push_back(1);
deque.push_back(2);
reorder(deque);
EXPECT_EQ(deque[0], 2);
EXPECT_EQ(deque[1], 1);
}
修改后的代码
// 从reorder()中抽离出的函数
void reorder_by_seed(uint32_t seed,
bsl::deque<uint32_t> &deque)
{
srand(seed);
for (int indexLeft = 0;
indexLeft < deque.size();
++indexLeft)
{
int indexRight = rand()
% (deque.size()-indexLeft);
swap(deque[indexLeft],
deque[indexRight]);
}
}
void reorder(
bsl::deque<uint32t> &deque)
{
reorder_by_seed(getCurTime(),
deque);
}
修改后的测试代码
TEST_NEW(test_reorder_by_seed_suite,
should_reorder_deque_by_seed_randomly)
{
bsl::deque<uint32_t> deque;
deque.push_back(1);
deque.push_back(2);
uint32_t seed = 12;
reorder_by_seed(seed, deque);
EXPECT_EQ(deque[0], 2);
EXPECT_EQ(deque[1], 1);
}
修改后的代码拆分成两个函数:内层函数通过传入的种子生成随机数,并以此调整顺序;外层函数只负责传入系统时间。单测时只测内层函数即可。
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则,用来削减计算机程序的耦合问题。控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI.
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。本文描述了一种依赖注入法在实际测试过程中的应用。
如果被测对象依赖于不可预期的行为,那么其结果往往无法或难以预知。如"被测函数依赖系统时间"这种情况。
被测函数的功能为:取当前系统时间作为随机种子,利用随机数调整数组内元素的顺序。本函数单测的难点在于结果的验证上:存在一定概率,调整后顺序不变。
void reorder(
bsl::deque<uint32_t> &deque)
{
srand(getCurTime());
for (int indexLeft = 0;
indexLeft < deque.size();
++indexLeft)
{
int indexRight = rand()% (deque.size()-indexLeft);
swap(deque[indexLeft],
deque[indexRight]);
}
}
旧的测试代码
注:下面的测试代码存在一定概率使断言失败
TEST_OLD(test_reorder_suite,should_reorder_deque_randomly)
{
bsl::deque<uint32_t> deque;
deque.push_back(1);
deque.push_back(2);
reorder(deque);
EXPECT_EQ(deque[0], 2);
EXPECT_EQ(deque[1], 1);
}
修改后的代码
// 从reorder()中抽离出的函数
void reorder_by_seed(uint32_t seed,
bsl::deque<uint32_t> &deque)
{
srand(seed);
for (int indexLeft = 0;
indexLeft < deque.size();
++indexLeft)
{
int indexRight = rand()
% (deque.size()-indexLeft);
swap(deque[indexLeft],
deque[indexRight]);
}
}
void reorder(
bsl::deque<uint32t> &deque)
{
reorder_by_seed(getCurTime(),
deque);
}
修改后的测试代码
TEST_NEW(test_reorder_by_seed_suite,
should_reorder_deque_by_seed_randomly)
{
bsl::deque<uint32_t> deque;
deque.push_back(1);
deque.push_back(2);
uint32_t seed = 12;
reorder_by_seed(seed, deque);
EXPECT_EQ(deque[0], 2);
EXPECT_EQ(deque[1], 1);
}
修改后的代码拆分成两个函数:内层函数通过传入的种子生成随机数,并以此调整顺序;外层函数只负责传入系统时间。单测时只测内层函数即可。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
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热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南