当前位置: 首页 > 知识库问答 >
问题:

为两个方法创建测试用例,其中一个仅在第一个返回true时调用

昌和悦
2023-03-14

我有一个类,在不深入两个细节的情况下,它包含了方法

  1. 公共布尔validateData(Person[]p);
  2. 公共无效进程数据(Person[]p);

通常使用如下:

if(validateData(myData)) {
  processData(myData);
}

使用JUnit并为上述两种方法创建测试用例的最佳方法是什么?我不确定在这种情况下使用之前的@是否正确。我想让每个测试首先调用validateData(myData),然后如果它没有错误地完成并返回true,那么测试应该使用相同的myData调用processData(myData),但这会在测试用例中引入编程逻辑,我认为这不太好。

共有2个答案

翟宾实
2023-03-14

您在评论中提到您担心测试中的冗余。总的来说,这是一个好主意,但是您应该明白“生产”和“测试”代码之间存在细微的区别。

你看,测试代码的主要目的是

a)快速指出故障

b)让您轻松修复它们。

换句话说:如果你的测试类有3个公共方法,那么你的测试类也至少有3个测试方法。但最有可能的是,您的测试类将为您可以通过生产方法进行的每个和任何路径提供测试方法。

是的,这导致了很多测试方法。但关键是:如果其中一个测试失败,你可能只需要30秒就能弄清楚到底发生了什么-而不是:当你整个测试只有一种测试方法时;你必须花相当长的时间来理解你过长的测试中哪一部分实际上失败了。当然,我们需要在“我的测试很容易理解”和“我在到处复制代码”之间取得平衡。这个播客为进一步思考这个话题提供了一些很好的起点。

最后,从可靠的角度来看,也可以考虑拆分生产代码。类应该只负责一件事——仅方法的名称就表明类似乎负责做不止一件事(显然:验证和处理)。请注意,拥有这两个方法也会使您的界面不清楚-该类的用户是否希望在处理之前调用validate;或者“过程”是否也包括验证?

壤驷乐邦
2023-03-14

由于这两种方法都是公共的,因此它们应该各自有自己的单元测试。假设是这样,您可以检查Person[]上的某些内容,以确保processData执行了某些操作。

您可以做的另一件事是重构代码以使用对象而不仅仅是方法,然后您可以模拟对象,并确保根据特定条件调用它们:

public interface IDataProcessor {
    void processData(Data data);
}

public class Foo{
    public Foo(IDataProcessor processor) {
        _processor = processor;
    }

    public void bar(Data data){
        if(validateData(data)){
            _processor.processData(data);
        }
    }

    private boolean validateData(Data data){
        return data != null; // or whatever you want
    }

    private IDataProcessor _processor;
}

public class MockProcessor implements IDataProcessor {
    public MockProcessor(){}

    public void processData(Data data){
        CallFlag = true;
    }

    public bool CallFlag = false;
}

然后,对于单元测试,您可以这样做:

MockProcessor mock = new MockProcessor();
Foo foo = new Foo(mock);
Data data = new Data();
foo.bar(data);
Assert.True(mock.CallFlag);

在C语言中,有一个很好的库称为Moq,它可以很容易地在单元测试中创建接口的模拟实现,而无需自己手动定义接口。Java中可能有类似的功能。

 类似资料:
  • 例如,我有一个超类和一组子类,我想要实现的是创建一个这样的 if 语句: if (一个 我知道,我可以使用构造函数来实现,但我只希望它发生在超类中,基本上,我不希望在创建子类的对象时调用该方法。 这个问题有道理吗?或者这只是我睡眠不足的影响? 我不知道该尝试什么,我实际上被这个卡住了。

  • 一个接口: 两个实现bean: -单件bean并标记为 -原型Bean 在Manager类中: 观察:spring创建了和,然后创建了autowires。 预期:由于已经标记为,spring应该只创建这个bean并自动连接它。spring不需要创建的实例。这对性能/功能没有影响,但这看起来像是浪费的实例创建,只会被丢弃。

  • 测试主页 测试将是一个反复出现的主题,我们将在整个教程系列中一起探讨不同的概念和策略。 我们来开始写第一个测试。现在,我们将在boards应用程序内的tests.py文件中操作 boards/tests.py from django.core.urlresolvers import reverse from django.test import TestCase class HomeTests(

  • 我在WebDriver中的测试有问题。 在第一个包我有2类(页)主页,登录页。 在secound包中,我有test-goToLiginPageTest和LoginTest。 在Gotoligini页面,我检查,我在主页上,并进入登录页面。 在LoginTest中,我检查我是否在登录页面上,并登录。 但来自goToLiginPageTest的两个测试通过,但来自LoginTest的测试失败。 我不确

  • 主要内容:1. 录制,2. 回放,3.保存测试套件在本节中,将学习如何在Selenium ide中创建基本测试用例。Selenium IDE中的整个测试脚本创建过程可分为三个步骤: 录制(记录用户与浏览器的交互) 播放(执行录制的脚本) 保存测试套件 现在,我们将学习如何实施上述三个步骤。 1. 录制 启动Firefox浏览器。 单击浏览器右上角的Selenium图标。 它将启动Selenium IDE的默认界面。 记录一个新的测试项目(选择第一

  • 当有两个公共方法并且一个方法调用同一个类中的另一个公共方法时,测试方法的方法是什么? 在这种情况下,我应该如何编写单元测试? 一个例子 这个例子并没有显示所涉及的方法的复杂性,而是概念的复杂性。 我应该分别测试加法和乘法吗?如果我只测试乘法,我觉得我们错过了不能提供参数的情况。 假设要分别测试和,我应该能够模拟?这怎么可能? 假设要分别测试乘法和加法,我不应该模拟,我应该让加法按原样执行吗。如果是