我要求建议的实现来测试函数或一组函数是否遵循某个路径。这将提供一种合理的方法来检查状态,并确保以所需和预期的确切方法处理错误。我正在寻找单元测试框架独立讨论。
连连呢?
我已经勾勒出当前的概念作为思考的起点。
注意:此示例极为简化。看起来像一个微不足道的案例,但它很容易扩展到更复杂的检查。
示例中的代码路径的整数跟踪可以根据需要替换为字符串,并且很容易从这里获得更多的奢侈,但我想在继续之前收集其他可能做的事情。
#include <QDebug>
#include <QtGlobal>
#include <QVector>
#define RUN_TEST
#ifdef RUN_TEST
#define inheritTestableOnly : public Testable
#define inheritTestableToo , public Testable
#define appendCodePath(a) addCodePath(a)
#else
#define inheritTestableOnly
#define inheritTestableToo
#define appendCodePath(a)
#endif
class Testable
{
public:
void addCodePath(qint64 newCode)
{
codePath.append(newCode);
}
void clearCodePath()
{
codePath.clear();
}
QVector<qint64> const & getCodePath() const
{
return codePath;
}
private:
QVector<qint64> codePath;
};
class ToTest inheritTestableOnly
{
public:
ToTest(){}
virtual ~ToTest(){}
void testFunction(bool pathSelect1, bool pathSelect2)
{
bool pathSelect3 = false;
if(pathSelect1)
{
if(pathSelect2)
{
appendCodePath(1);
}
else
{
appendCodePath(-2);
pathSelect3 = true;
}
}
else
{
appendCodePath(-1);
}
if(pathSelect3)
{
qDebug() << "Success!";
appendCodePath(2);
}
}
};
int main(int argc, char *argv[])
{
ToTest t;
#ifdef RUN_TEST
t.testFunction(true, true);
qDebug() << t.getCodePath();
t.clearCodePath();
qDebug() << t.getCodePath();
t.testFunction(false, false);
qDebug() << t.getCodePath();
t.clearCodePath();
qDebug() << t.getCodePath();
t.testFunction(true, false);
qDebug() << t.getCodePath();
t.clearCodePath();
qDebug() << t.getCodePath();
#else
t.testFunction(true, true);
t.testFunction(false, false);
t.testFunction(true, false);
#endif
return 0;
}
定义RUN_TEST时的输出:
QVector(1)
QVector()
QVector(-1)
QVector()
成功了!
QVector(-2,2)
未定义RUN_TEST时的输出:
成功!
答案 0 :(得分:0)
我知道您正在寻找建议,以确定您的测试是否导致特定路径的执行。显而易见的解决方案是寻找一种确定路径覆盖的工具:此覆盖分析的结果将告诉您哪些路径已被采用,哪些路径未被采用。当然,这样的工具可以为您完成所有代码工具。
虽然我还没有使用任何此类工具,但似乎有一些:http://archive.oreilly.com/cs/user/view/cs_msg/89669
但是,有一点要记住:如果你的代码真的如此关键以至于你关心路径覆盖,那么仅仅覆盖每条路径是不够的。您应该将此方法与其他技术结合使用,例如等价类分区和边界案例分析 - 这很可能会导致某些路径的大量不同测试用例。