单元测试应该有多彻底?

时间:2010-08-12 20:44:11

标签: unit-testing

要在下面的ClassA中对方法doSomething(String name)进行单元测试,我应该在返回值上测试哪些内容?

我的第一个想法是测试

      
  1. 在Wrapper上正确设置了name属性
  2.   
  3. Wrapper上的formattedName属性格式正确
  4. 但是第二个想法,我应该在UtilClass.format(String name)的单元测试中测试formattedName的值吗?或者我应该在两个地方都这样做吗?

    public class ClassA  {
      public Wrapper doSomething(String name) {
        Wrapper wrapper = new Wrapper();
        wrapper.setName(name);
    
        wrapper.setFormattedName(UtilClass.format(name));
    
        return wrapper;
      }
    }
    

5 个答案:

答案 0 :(得分:2)

测试优先方法很有意思,它表示在测试失败之前不要编写一行代码 - 然后只编写足够的代码来使测试通过。

如果你遵循这个计划,你最终会得到一些非常彻底的测试。

答案 1 :(得分:0)

由于UtilClass有一个format方法,你应该在该类的单元测试的一部分进行测试。

您对Wrapper类的测试应该是确保它不会以任何方式修改数据,假设它的目的当然是。如果它的目的是修改数据,那么你应该测试它。

答案 2 :(得分:0)

我会测试验证名称和格式化名称是否具有适当的值。要将方法与UtilClass分离,我会使用注入,并使用模拟验证调用UtilClass.format方法。您对格式化名称的测试,然后将检查该值是否等于从模拟返回的结果。我也有(可能是第一个要编写的测试)一个测试,它会在你调用方法时验证你得到一个非null结果。单独测试UtilClass方法。

编辑:我同意@Bill K你绝对应该先写测试。

答案 3 :(得分:0)

由于您在编写单元测试时知道要测试的方法的内部结构,因此您可以在方法本身中获得所需的内容:

  1. 测试参数(如果名字会发生什么 是一个空字符串?或者很长 字符串?)

  2. 测试返回值/对象 (测试以确保此方法不是 返回空引用)

  3. 测试正在修改的数据 方法(调用getName并验证它 设置正确,打电话 getFormattedName来验证此数据 也)。

  4. 这些只是一些初步的想法,可以帮助您开始应该测试的事情。

    要回答你的第二个问题,我的意见是你应该在Wrapper本身的单元测试中测试getFormattedName方法。这样,如果将来更改Wrapper类或getFormattedName方法并且需要更新单元测试,则只需在一个位置跟踪它(在Wrapper单元测试中)。

答案 4 :(得分:0)

我喜欢做黑盒单元测试。所以,在这种情况下,我会测试返回时“做某事”的意思。如果它意味着应该设置和格式化名称,那么我将测试它。

我还将使用null和空字符串作为基本情况进行测试。