Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单元测试的目的是什么?_C++_Unit Testing_Qt_Testing - Fatal编程技术网

C++ 单元测试的目的是什么?

C++ 单元测试的目的是什么?,c++,unit-testing,qt,testing,C++,Unit Testing,Qt,Testing,出于学习目的,我涉足单元测试领域。我已经使用QT阅读了一些有关此问题的教程,并得出以下结论: class QMyUnitTest : public QObject { Q_OBJECT private: bool isPrime(unsigned int ui); private Q_SLOTS: void myTest(); }; bool QMyUnitTest::isPrime(unsigned int n) { typedef std::map<u

出于学习目的,我涉足单元测试领域。我已经使用QT阅读了一些有关此问题的教程,并得出以下结论:

class QMyUnitTest : public QObject
{
    Q_OBJECT
private:
    bool isPrime(unsigned int ui);
private Q_SLOTS:
    void myTest();
};

bool QMyUnitTest::isPrime(unsigned int n) {
    typedef std::map<unsigned int, bool> Filter;
    Filter filter;

    for(unsigned int ui = 2; ui <= n; ui++) {
        filter[ui] = true;
    }
    unsigned int ui = filter.begin()->first;
    for(Filter::iterator it = filter.begin();
        it != filter.end(); it++) {
        if(it->second) {
            for(unsigned int uj = ui * ui; uj <= n; uj += ui) {
                filter[uj] = false;
            }
        }
        ui++;
    }
    return filter[n];
}

void QMyUnitTest::myTest() {
}

QTEST_MAIN(QMyUnitTest)
#include "tst_myunittest.moc"
QMyUnitTest类:公共QObject
{
Q_对象
私人:
bool-isPrime(未签名的int-ui);
专用Q_插槽:
void myTest();
};
bool QMyUnitTest::isPrime(无符号整数n){
typedef std::map过滤器;
过滤器;
for(unsigned int ui=2;ui-first;
for(Filter::iterator it=Filter.begin();
it!=filter.end();it++){
如果(它->秒){

对于(unsigned int-uj=ui*ui;uj来说,单元测试的目的是验证您编写的代码是否实际执行了它应该执行的操作

要编写正确完整的测试,您需要准确地知道代码应该做什么。然后编写测试以验证:

  • 正常条件(即“正常”、“正常”输入产生预期输出)
  • 边界条件(即仅在规格范围内的输入)
  • 失败条件(即,当输入无效时,您验证代码是否正确失败)
你用一个它不处理的数字来测试你的
isPrime
例程的行为的例子是一个很好的例子。在不知道你的实现的情况下,0、1、2和负值将是
isPrime
例程的很好的测试用例-它们是你在实现算法时可能不会考虑的东西,所以它们是有价值的测试

请注意,验证正常条件并不一定是最容易的部分。在这种情况下,确保算法是完美的需要进行数学分析,然后验证代码是否正确实现了这一点,这有时很难。检查几百个已知值并不一定足够(它可能在第101个值处开始失败)

如果我已经必须知道函数的潜在问题是什么,那么单元测试有什么用呢


你的做法是相反的。不要在编写单元测试时考虑到实现代码。在编写单元测试时考虑到规范。代码必须符合规范,测试必须尽可能确保符合规范。(一旦大部分测试完成,代码覆盖率工具将帮助你找到边界条件。)

只想添加到已列出的内容中:

  • 单元测试将确保您和将来处理您的代码的其他人不会意外地更改代码的行为

  • 如果编写正确,单元测试将是记录代码行为的好方法


请修改标题,使其包含除用于描述问题的标记以外的内容。例如,“单元测试的目的是什么?”感谢您的建议,我对其进行了更改。负数对于
unsigned int
s+1来说并不是很好的例子,因为它无法写出与我的工作完全相同的句子:是和否。有符号到无符号的转换(或相反,或有符号/无符号的比较)在过去已经影响了不止一个C(或C++)开发人员,我看不到这种情况会很快改变。(在这种特定情况下,
-1
只需输入,如果忽略了编译器警告,只需一小段时间即可完成)谢谢你的详细描述,我想我开始明白了。你提到了代码覆盖工具,在搜索之后我发现了很多。你知道一个专门用于入门的工具吗?@nijansen:我只是使用了
gcov
,但确实有很多。这取决于您的工具链和环境非常重要。在这一点上进行一点扩展:代码永远不会像第一次编写时那样被理解。单元测试是一种以自动测试的方式记录有关预期代码行为的知识的方法。因此,这些单元测试是您向未来的维护人员传达的信息是的。尽早编写测试——最好在通过测试的实现代码之前。