gpt4 book ai didi

java - 多个参数化 JUnit 测试的最佳实践

转载 作者:行者123 更新时间:2023-12-02 06:18:42 25 4
gpt4 key购买 nike

通常,一个 Java 类具有多个我们想要使用 JUnit 进行测试的公共(public)方法。当我们可以使用参数化技术时,会发生什么?

我们是否应该为要使用参数化参数测试的每个公共(public)方法保留一个 JUnit 测试类,或者如何将两者保留在一个 JUnit 测试类中?

用于测试公共(public)方法 RegionUtils.translateGeographicalCity(...) 的示例参数化 JUnit 测试类

@RunWith(Parameterized.class)
public class RegionUtilsTest {
private String geographicalCity;
private String expectedAwsRegionCode;

public RegionUtilsTest(final String geographicalCity,
final String expectedAwsRegionCode) {
this.geographicalCity = geographicalCity;
this.expectedAwsRegionCode = expectedAwsRegionCode;
}

@Parameters(name = "translateGeographicalCity({0}) should return {1}")
public static Collection geographicalCityToAwsRegionCodeMapping() {
// geographical city, aws region code
return Arrays.asList(new Object[][] { { "Tokyo", "ap-northeast-1" },
{ "Sydney", "ap-southeast-2" },
{ "North Virginia", "us-east-1" }, { "Oregan", "us-west-2" },
{ "N.California", "us-west-1" }, { "Ireland", "eu-west-1" },
{ "Frankfurt", "eu-central-1" }, { "Sao Paulo", "sa-east-1" },
{ "Singapore", "ap-southeast-1" } });
}

@Test
public void translateGeographicalCityShouldTranslateToTheCorrectAwsRegionCode() {
assertThat(
"The AWS Region Code is incorrectly mapped.",
expectedAwsRegionCode,
equalTo(RegionUtils.translateGeographicalCity(geographicalCity)));
}

@Test(expected = NamedSystemException.class)
public void translateGeographicalCityShouldThroughAnExceptionIfTheGeographicalCityIsUnknown() {
final String randomGeographicalCity = RandomStringUtils
.randomAlphabetic(10);

RegionUtils.translateGeographicalCity(randomGeographicalCity);
}
}

最佳答案

布局:请记住,您不进行“类测试”,而是进行“单元测试”。以有意义的方式组织和命名您的测试,这样不会让您的代码的 future 读者感到惊讶。通常,这意味着在一个测试类中测试所有简单方法,并对每个方法使用一到两个参数化测试。但有时一种方法很复杂,需要更详细的测试,那么为其创建专用的测试文件可能是一个好主意

工具:您需要某种数据提供者。那么通常每个测试都有自己的数据提供者。有时多种方法可以共享同一个数据提供者。遗憾的是,JUnit 在该领域表现不佳。最近出现了一些扩展 JUnit 的库。 JUnit 本身也添加了 @Parameterized、@Theories 等,但仍然很糟糕。因此,如果您无法切换到 TestNG 或 Spock,请尝试以下操作:

关于java - 多个参数化 JUnit 测试的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28646407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com