运行 仅在 java 应用程序中使用 @MyTest 进行测试
Running only the tests with @MyTest inside java application
我有一个 TestRunner class:
public class TestRunner {
private String result = "";
public void runTests(List<String> testClassNames) {
for (String testClassName : testClassNames) {
}
}
public String getResult() {
return result;
}
}
然后我有两个测试 classes 并且我应该 运行 只有来自两个 classes 的 @MyTest 测试。 getResult() 应该本质上 return“exampleTest() - OK”或“exampleTest() - FAILED”,具体取决于测试是否通过。测试 class 看起来像这样:
public class ExampleTests1 {
@MyTest (expected = IllegalStateException.class)
public void test1() {
throw new IllegalStateException();
}
@MyTest (expected = IllegalStateException.class)
public void test2() {
throw new RuntimeException();
}
}
我尝试使用 JUnitCore 和 Result 来实现,但找不到将测试方法名称添加到结果中的方法。还有别的办法吗?
在这种情况下你必须使用反射。
这就是 JUnit 内部的工作方式:
因为这听起来像是 homework/assigment 用于教育目的(如果您正在开发“真正的”应用程序 - 那么只需使用 JUnit 或 TestNG,不要自己编写类似的东西 :)),我不会提供完整的解决方案,但这是您应该做的:
- 对于每个由 class 名称标识的 class,您应该得到一个描述此 class 名称的 java.lang.Class。您可以使用
Class.forName(...)
- 那么你应该得到 class 的所有方法(通过反射),每个方法 运行 如下:
2.1 检查方法是否有注解@MyTest
。如果没有 - 不要处理它
2.2 同时检查方法名是否以test
开头(String有startsWith
方法)
2.3 如果发现测试class包含测试方法,那么:
2.3.1 创建一个Test实例Class(可能你可以假设它有no-ops构造函数,然后使用newInstance()
)
2.3.2 运行 方法(再次通过反思)。检查结果/用 try/catch 块包围执行调用以拦截错误。
2.3.3 打印作业中指定的结果:)
我有一个 TestRunner class:
public class TestRunner {
private String result = "";
public void runTests(List<String> testClassNames) {
for (String testClassName : testClassNames) {
}
}
public String getResult() {
return result;
}
}
然后我有两个测试 classes 并且我应该 运行 只有来自两个 classes 的 @MyTest 测试。 getResult() 应该本质上 return“exampleTest() - OK”或“exampleTest() - FAILED”,具体取决于测试是否通过。测试 class 看起来像这样:
public class ExampleTests1 {
@MyTest (expected = IllegalStateException.class)
public void test1() {
throw new IllegalStateException();
}
@MyTest (expected = IllegalStateException.class)
public void test2() {
throw new RuntimeException();
}
}
我尝试使用 JUnitCore 和 Result 来实现,但找不到将测试方法名称添加到结果中的方法。还有别的办法吗?
在这种情况下你必须使用反射。 这就是 JUnit 内部的工作方式:
因为这听起来像是 homework/assigment 用于教育目的(如果您正在开发“真正的”应用程序 - 那么只需使用 JUnit 或 TestNG,不要自己编写类似的东西 :)),我不会提供完整的解决方案,但这是您应该做的:
- 对于每个由 class 名称标识的 class,您应该得到一个描述此 class 名称的 java.lang.Class。您可以使用
Class.forName(...)
- 那么你应该得到 class 的所有方法(通过反射),每个方法 运行 如下:
2.1 检查方法是否有注解@MyTest
。如果没有 - 不要处理它
2.2 同时检查方法名是否以test
开头(String有startsWith
方法)
2.3 如果发现测试class包含测试方法,那么:
2.3.1 创建一个Test实例Class(可能你可以假设它有no-ops构造函数,然后使用newInstance()
)
2.3.2 运行 方法(再次通过反思)。检查结果/用 try/catch 块包围执行调用以拦截错误。
2.3.3 打印作业中指定的结果:)