我有一个班级ListContainer
。
该类是列表的容器,允许3个操作:
列表在类中是私有的,所以我无法检查添加真正添加元素。 您认为我应该如何测试添加功能?
我认为我应该通过getNotValid检查它。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Container::Container() {
}
void Container::add(Element element) {
pthread_mutex_lock(&mutex);
list.push_back(element);
pthread_mutex_unlock(&mutex);
}
void Container::remove(unsigned int elementId) {
pthread_mutex_lock(&mutex);
list<Element>::iterator it;
for (it = list.begin(); it != list.end(); ++it) {
if (element->id == elementId) { //TODO is it the real check
list.erase(it);
}
}
pthread_mutex_unlock(&mutex);
}
list<Element> Container::getNotValid() {
list<Element> result;
pthread_mutex_lock(&mutex);
list<Element>::iterator it;
for (it = list.begin(); it != list.end(); ++it) {
if (element->isNotValid()) {
result.push_back(*it);
}
}
pthread_mutex_unlock(&mutex);
return result;
}
答案 0 :(得分:1)
编写一个无法测试的类很容易。在您的情况下,该类没有任何公共API来测试它。这意味着除了检查你是否可以调用这三种方法并且它们不会抛出异常之外,你不能编写任何严肃的测试。
另一方面,您不应仅仅为了使类可测试而添加方法。请注意不应该 - 它不是不能。如果你认真测试,那么拥有足够有用的测试比保持API简单更重要。
在您的情况下,添加size()
方法是有意义的 - 当您添加/删除元素时,列表的大小应该更改。
或添加toString()
方法。这在调试和编写测试时很有用:
ListContainer c = new ListContainer();
c.add("x");
assertEquals("[x]", c.toString());
答案 1 :(得分:1)
通常通过公共接口或(使用集成测试)测试类,通过测试某个操作对某些应用程序状态的影响。
如果私有列表只是允许API的用户检索无效项,那么我会说您只需要使用add
,remove
和{{1来测试列表}} 方法。
如果以某种方式使用有效项(例如写入文件系统或数据库),则应通过集成测试测试该类,并确保对应用程序状态的所需影响确实发生
答案 2 :(得分:0)
永远不需要测试私人物品。添加和删除该列表必须有一些可测量的效果。测试包含ListContainer
的类应该告诉您ListContainer
是否正常工作。
也许你可以添加一些额外的代码,以便更容易评论?
答案 3 :(得分:0)
add
客户如何看待ListContainer
操作?假设我使用你的课程,添加一个项目......然后呢?我如何在这种状态下使用它?我可以观察到任何行为改变吗?国家改变?添加项目的属性更改?我应该能够观察一些更改,这是您在测试时应该关注的内容。 可观察的更改。
或者,您可以为单元测试公开private
列表(通过更改其关于测试类/程序集的可见性)。