编写测试用例的疑问

时间:2014-01-18 16:38:17

标签: c++ cppunit

我在user.cpp中有一个函数changeUserPassword(),我想对它做一个cppUnit测试。

user.cpp

int User::changeUserPassword()
{
    std::vector<user>::iterator it;
    std::ifstream readFile("info.txt");
    while(readFile >> userName >> password)
    { 
        userDetails.push_back(user(userName,password));
    }
    readFile.close();
    std::cout << "Please enter a user name that the password will be reset \n";
    std::cin >> name;
    it = std::find(userDetails.begin(),userDetails.end(),user(name,name));
    if (it !=userDetails.end())
    {
        std::cout << "Please enter a new password" << std::endl;
        std::cin >> newPassword;
        it->setPassword(newPassword);
        std::ofstream out("tempFile.txt");
        for (it =userDetails.begin(); it !=userDetails.end(); it++) {
            std::cout << it->getUserName() << " " << it->getPassword() << "\n";
            out << it->getUserName() << " " << it->getPassword() << std::endl;
        }
        out.close();
        remove("info.txt");
        rename("tempfile.txt","info.txt");
    }
    else
    {
        it++;
    }
    return 0;
}

testcase.h

#ifndef TESTCASE_H
#define TESTCASE_H
#include "user.h"
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
class csci222TestCase : public CPPUNIT_NS::TestFixture {
    CPPUNIT_TEST_SUITE(testcase);
    CPPUNIT_TEST (testChangePassword);
    CPPUNIT_TEST_SUITE_END();
public:

protected:
    void testChangePassword(void);
private:
    user testChangeUserPassword;
};
#endif  

testcase.cpp

void testcase::testChangePassword(void) {
   std::cout << "\n";
   CPPUNIT_ASSERT_EQUAL(testChangeUserPassword.changeUserPassword(),0);
}

问题是,我觉得我为changeUserPassword()编写测试用例的方式并没有测试任何东西。这更像是运行方法,一旦完成,它将返回0.我应该怎么做或者我应该做些什么来改进测试用例?

2 个答案:

答案 0 :(得分:1)

此功能不适合单元测试。它有启动器的文件和用户输入。你可能真的只想测试一行

it->setPassword(newPassword);

这实际上是“设置”密码的原因。为此,您可以使用给定的密码在单元测试中调用该函数,然后依次执行getPassword()并查看它是否已更改为您所期望的。

如果您确实想要按原样测试该功能,则需要查看存根和/或模拟对象。为此,您需要通过一些简单的依赖注入来重构代码,因此您可以将磁盘文件I / O与一些内存文件I / O交换。但我不建议这条道路。

要解决更具概念性的问题,testChangePassword()函数应检查密码是否已更改。实际上,所有你真正测试的是该函数不会抛出异常。

总而言之,您的单元测试最好应采用以下形式:

user testuser;
testuser.setPassword( "Fred");
std::string pwd = testuser.getPassword();
CPPUNIT_ASSERT_EQUAL( "Fred", pwd);

答案 1 :(得分:0)

在你的情况下,你也应该尝试:
1.多次更改密码 2.将密码更改为相同的密码 3.更改不存在的密码 4.更改非法字符的密码 5.从不存在的文件中读取。
6.从文件中读取无效的数据格式 7.完成此功能后,检查是否清除了对象不必要数据的所有字段。