单元测试的条件派生
Conditional Derivation for Unit Testing
我正在编写封装硬件驱动程序(用户空间)的单元测试,我使用的设计模式如下:
class uio
{
virtual uint32_t readbit(...);
virtual bool writebit(...);
// other driver related functions
// ...
};
class uio_test : public uio
{
virtual uint32_t readbit(...) override { /* don't talk to hardware, send back test data */ }
virtual bool writebit(...) override { /* don't talk to hardware, write test data */ }
};
class spi : public uio
{
// spi related functions
};
class i2c : public uio
{
// i2c related functions
};
我的问题是如何去使spi和uio正确地从uio或uio_test继承取决于模块(真正的程序与gtest)。我已经看了条件语句,例如:
template<bool test>
class spi : public std::conditional<test, uio_test, uio>
,这将适用于所有对象都直接从main派生的世界。
/* main.cpp */
spi<false> s;
s.init();
s.writebit();
/* gtest_main.cpp */
spi<true> s;
ASSERT_TRUE(s.init());
ASSERT_EQ(/* read/write test bits, etc*/);
然而,uio派生对象在整个程序的其他专门化类中使用,并且我看不到条件构造的好方法,例如:
class temperature_monitor
{
createBuses();
spi<???>* spictrl_;
};
/* perhaps derive test classes, easy since most high level objects are singletons */
temperature_monitor::createBuses()
{
if (testmode)
spictrl_ = new spi<true>;
else
spictrl_ = new spi<false>;
}
希望这对每个人来说都很清楚。我先回答几个问题,然后再问:
。预处理条件呢?
。不,如果可能的话,永远不要。
。为什么要为像spi这样的低级驱动编写单元测试?
。为什么不呢,有一些内部逻辑在运行,我宁愿在单元测试中捕获错误,也不愿花一天时间调试一个愚蠢的遗漏0。
我认为你需要的是一个策略模式。uio
提供了一个非虚接口和一个指向实现的指针。您认为有一个虚拟接口,并向uio
对象提供一个普通或测试实例,而不是试图在中间插入继承。使用策略模式甚至允许您插入其他实现。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在没有太多条件句的情况下,我如何避免被零除
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 基于多个条件处理地图中的所有元素
- 如何委托派生类使用其父构造函数?
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 有没有办法将派生类作为 if-else 语句中的条件传递?
- 有条件地将基类引用参数视为派生类并将其返回
- 如何有条件地调用 B::f 仅当派生自 C++11 中的 B 时
- 使用某些条件初始化派生类中的基类成员变量
- 如何在给定指向派生类型的指针的情况下有条件地将指针强制转换为基类型
- 派生类中的搜索函数,循环条件
- 在最派生类型上的条件断点
- 单元测试的条件派生