编写函数测试用例时存在疑问

doubts on writing test case for a function

本文关键字:存在 测试用例 函数      更新时间:2023-10-16

我在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;
}

测试用例.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  

测试用例.cpp

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

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

此函数不是单元测试的好候选者。它为初学者提供了文件和用户输入。你可能真的只想测试

it->setPassword(newPassword);

据推测,这实际上就是"设置"密码的原因。为此,您将在单元测试中使用给定的密码调用函数,然后依次执行getPassword(),看看它是否更改为您所期望的。

如果您真的想按原样测试该函数,则需要查看stub和/或mock对象。为此,您需要通过一些简单的依赖项注入来重构代码,这样您就可以用一些内存文件I/O来交换磁盘文件I/O。但我不建议走这条路。

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

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

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

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