1

我有一堂课ListContainer。该类是一个列表容器并允许 3 个操作:

  1. 添加
  2. 消除
  3. getNotValid(返回无效元素列表)。

该列表在类中是私有的,因此我无法检查添加是否真正添加元素。你认为我应该如何测试添加功能?

我认为我应该通过 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;
}
4

4 回答 4

1

编写一个无法测试的类很容易。在您的情况下,该类没有任何公共 API 来测试它。这意味着除了检查您可以调用这三个方法并且它们不会引发异常之外,您不能编写任何严肃的测试。

另一方面,您不应该仅仅为了使类可测试而添加方法。注意should not - 它不是must not。如果您认真对待测试,那么拥有足够有用的测试比保持 API 简单更重要。

在你的情况下,添加一个方法是有意义的size()——当你添加/删除元素时,列表的大小应该改变。

或者添加一个toString()方法。这在调试和编写测试时很有用:

ListContainer c = new ListContainer();
c.add("x");
assertEquals("[x]", c.toString());
于 2012-07-24T12:53:14.473 回答
1

类通常通过其公共接口或(使用集成测试)通过测试某个操作将对某些应用程序状态产生的影响进行测试。

如果私有列表只是允许 API 的用户检索无效项目,那么我会说您只需要使用add,removegetNotValid方法测试列表。

如果以某种方式使用了有效项目(例如写入文件系统或数据库),那么您应该通过集成测试来测试该类,并确保对应用程序状态的预期效果确实正在发生。

于 2012-07-24T12:55:44.573 回答
0

测试私人的东西从来没有必要。从该列表中添加和删除必须有一些可衡量的效果。测试包含 的类ListContainer应该会告诉您 是否ListContainer正常工作。

也许您可以添加一些额外的代码以便更容易评论?

于 2012-07-24T12:51:44.030 回答
0

客户如何add看到操作ListContainer?假设我使用您的课程,添加一个项目..然后呢?在这种状态下如何使用它?我可以观察到任何行为变化吗?状态变化?添加项目的属性更改?我应该能够观察到一些变化,这是你在测试时应该关注的。可观察到的变化

或者,您可以公开private单元测试列表(通过更改它们在测试类/程序集方面的可见性)。

于 2012-07-24T12:52:25.767 回答