Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何测试容器类?_Unit Testing_Testing - Fatal编程技术网

Unit testing 如何测试容器类?

Unit testing 如何测试容器类?,unit-testing,testing,Unit Testing,Testing,我有一个类ListContainer。 用于列表的a类容器,允许3种操作: 加 除去 getNotValid(返回无效元素的列表) 该列表在类中是私有的,因此我无法检查add-really-add元素。 您认为我应该如何测试添加功能 根据我的意见,我应该通过getNotValid检查它 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; Container::Container() { } void Container::add(Elemen

我有一个类
ListContainer
。 用于列表的a类容器,允许3种操作:

  • 除去
  • getNotValid(返回无效元素的列表)
  • 该列表在类中是私有的,因此我无法检查add-really-add元素。 您认为我应该如何测试添加功能

    根据我的意见,我应该通过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;
    }
    
    pthread\u mutex\u t mutex=pthread\u mutex\u初始值设定项;
    容器::容器(){
    }
    空容器::添加(元素){
    pthread_mutex_lock(&mutex);
    列表。推回(元素);
    pthread_mutex_unlock(&mutex);
    }
    void容器::删除(未签名的int-elementId){
    pthread_mutex_lock(&mutex);
    列表::迭代器;
    for(it=list.begin();it!=list.end();+it){
    如果(element->id==elementId){//TODO是真正的检查吗
    删除(它);
    }
    }
    pthread_mutex_unlock(&mutex);
    }
    列表容器::getNotValid(){
    列出结果;
    pthread_mutex_lock(&mutex);
    列表::迭代器;
    for(it=list.begin();it!=list.end();+it){
    如果(元素->isNotValid()){
    结果。将_向后推(*it);
    }
    }
    pthread_mutex_unlock(&mutex);
    返回结果;
    }
    
    测试私人物品从来都不是必要的。在这个列表中添加和删除,一定会产生一些可衡量的效果。测试包含
    ListContainer
    的类应该会告诉您
    ListContainer
    是否工作正常


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

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


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

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

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

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

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

    ListContainer c = new ListContainer();
    c.add("x");
    assertEquals("[x]", c.toString());
    

    类通常通过其公共接口进行测试,或者(使用集成测试)通过测试特定操作对某些应用程序状态的影响进行测试

    如果私有列表只允许API用户检索无效项,那么我认为您只需要使用
    add
    remove
    getNotValid
    方法测试列表


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

    是否使用“有效”进行了任何操作列表中的项还是列表纯粹用于返回无效项?getNotValid删除并返回无效元素只是要小心一点,因为人们喜欢更改
    toString()
    ,这会破坏测试。我和你一样,认为我们应该尽最大努力通过公共API进行测试,因此,在本例中,测试将添加无效元素remove,并检查getnotvalid是否返回nothing。附加测试将基于公共api进行。