一个单元如何测试C ++序列的所有路径(单个或多个函数或类)?

时间:2016-01-29 03:56:37

标签: c++ unit-testing

我要求建议的实现来测试函数或一组函数是否遵循某个路径。这将提供一种合理的方法来检查状态,并确保以所需和预期的确切方法处理错误。我正在寻找单元测试框架独立讨论。

连连呢?

我已经勾勒出当前的概念作为思考的起点。

注意:此示例极为简化。看起来像一个微不足道的案例,但它很容易扩展到更复杂的检查。

示例中的代码路径的整数跟踪可以根据需要替换为字符串,并且很容易从这里获得更多的奢侈,但我想在继续之前收集其他可能做的事情。

#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时的输出:
成功!

1 个答案:

答案 0 :(得分:0)

我知道您正在寻找建议,以确定您的测试是否导致特定路径的执行。显而易见的解决方案是寻找一种确定路径覆盖的工具:此覆盖分析的结果将告诉您哪些路径已被采用,哪些路径未被采用。当然,这样的工具可以为您完成所有代码工具。

虽然我还没有使用任何此类工具,但似乎有一些:http://archive.oreilly.com/cs/user/view/cs_msg/89669

但是,有一点要记住:如果你的代码真的如此关键以至于你关心路径覆盖,那么仅仅覆盖每条路径是不够的。您应该将此方法与其他技术结合使用,例如等价类分区和边界案例分析 - 这很可能会导致某些路径的大量不同测试用例。