【问题标题】:Advice on Unit Tests关于单元测试的建议
【发布时间】:2016-07-07 20:43:49
【问题描述】:

我想在几个代码块上创建一些单元测试,但不确定我应该测试什么,单元测试对我来说是新的,我通过示例学习得更好。这是有问题的代码。

public static String buildAddressStreet(Address address)
{
  if(address.getAddressLines().size() > 0)
  {
     return address.getAddressLines().get(0);
  }
  else
  {
     return StringUtils.EMPTY;
  }
}

 public static Collection<Payment> collectFraudPayments(WebOrder order)
{
  return streamPaymentsFilterForFraud(order).collect(Collectors.toList());
}

private static Stream<Payment> streamPaymentsFilterForFraud(WebOrder order)
{
  return order.getPayments().stream()
     .filter(i -> i.getPayMethod().isCreditCard())
     .filter(i -> (!StringUtils.startsWith(i.getFraudStatusCode(), "A") ||  FraudStatusCode.isPossibleFraud(i.getDecisionResponse())) );
}

public static String getAddressLocation(Address address, int location)
{
  if(location < 3)
  {
     if(address.getAddressLines().size() >= location+1)
     {
        return address.getAddressLines().get(location);
     }
  }

  return null;
}

public static String getCommerceCustomerNumber(WebOrder order)
{
     Customer customer = findCustomer(order);

  if(customer != null)
  {
     return customer.getId();
  }
  else
  {
     return null;
  }
}

public static String buildCustomerName(WebOrder order)
{
  Optional<? extends Customer> foundCustomer =   order.getItems().stream().findFirst().map(i -> i.getShipping());

  if(!foundCustomer.isPresent())
  {
     foundCustomer = order.getPayments().stream().findFirst();
  }

  return buildCustomerName(foundCustomer.orElse(null));
}
public static String buildCustomerName(Customer customer)
 {
  StringBuilder sb = new StringBuilder();

  if(customer != null)
  {
     if(StringUtils.isNotBlank(customer.getAddress().getFirstName()))
     {
        sb.append(customer.getAddress().getFirstName()).append(' ');
     }
     if(StringUtils.isNotBlank(customer.getAddress().getMiddleName()))
     {
        sb.append(customer.getAddress().getMiddleName()).append(' ');
     }
     if(StringUtils.isNotBlank(customer.getAddress().getLastName()))
     {
        sb.append(customer.getAddress().getLastName()).append(' ');
     }
     if(StringUtils.isNotBlank(customer.getAddress().getCompanyName()))
     {
        sb.append(customer.getAddress().getCompanyName()).append(' ');
     }

  }

  return sb.toString().trim();
}

我知道这很可能,我不希望为我编写的代码只是一个想法或示例,说明如何测试它。我之前写过基本测试,但其中一些让我有点难过。谢谢

【问题讨论】:

标签: java unit-testing


【解决方案1】:

单元测试有一些规则:

  1. Test None - 当输入为无或为零时进行测试
  2. 测试一 - 在输入为 1 或长度为 1 等时进行测试。
  3. Test Many - 在输入大于一或大于一时进行测试
  4. 首先测试 - 测试当您的输入是第一件事时会发生什么
  5. 最后测试 - 测试当您的输入是最后一件事时会发生什么
  6. 测试所有代码路径 - 由于您拥有所有这些 if 语句,请测试 if 语句的所有组合。

查看测试效果的一个好方法是使用代码覆盖率工具并查看测试中出现了多少次以及哪些行被命中。对于 java 尝试使用JaCoCo

【讨论】:

  • 谢谢,这对我来说已经足够了。我真的很感激!
【解决方案2】:

开始进行单元测试的更好方法是确定您希望代码做什么,然后编写测试以确保它可以完成这些事情,然后才编写代码。理想的单元测试将有一个涵盖每一行代码、每个 if 语句和边缘情况的测试用例,而 Eli Sadoff 提供的答案几乎涵盖了这些情况。

【讨论】:

  • 非常感谢,我刚刚进入已经编写好的代码。在学校里,最好的做法是先写测试,再写代码,但事实并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2015-04-25
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多