我在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.我应该怎么做或者我应该做些什么来改进测试用例?
答案 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.完成此功能后,检查是否清除了对象不必要数据的所有字段。