编写函数测试用例时存在疑问
doubts on writing test case for a function
我在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.在完成函数时,请检查是否清除了对象的所有字段中不必要的数据。
相关文章:
- pybind11 运行测试用例
- GTest,仅参数化测试用例
- 如何使用不同的谷歌模拟运行相同的谷歌测试用例?
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 如何使用值模板编写文档测试用例?
- 用于查找最低共同祖先的代码不适用于某些测试用例
- 为什么给定的代码不适用于所有测试用例?为什么当输入为 7786 时它不起作用?
- GTest - 在不同的参数上运行多个测试用例
- 如何创建演示 /EH 成本的最小测试用例?
- 查找在 4 和问题中代码失败的测试用例
- 如何编写在函数执行过程中垃圾回收的测试用例?
- 括号检查器完美地适用于单个测试用例,但对于所有测试用例,它给出了分段错误?
- 我已经通过了该问题的所有测试用例,甚至是Udebugg上的所有测试用例,并且仍然在UVA在线法官上获得了WA裁决
- 如何使用参数化测试用例
- 相同的测试用例,但代码块和Ideone的输出不同
- 在老板层次结构中查找"top"老板仅适用于某些测试用例
- Eclipse 项目中的 OSCPack 外部库测试用例
- 每次使用不同的fixture多次执行一个测试用例
- 在BOOST test中添加测试套件而不是测试用例
- 如何在谷歌代码堵塞中输入c++代码中的测试用例