在JUnit 4.10及更低版本中,可以将规则注释为@Rule和@ClassRule.这意味着规则在类之前/之后以及每次测试之前/之后被调用.这样做的一个可能原因是设置昂贵的外部资源(通过@ClassRule调用),然后便宜地重置它(通过@Rule调用).
从JUnit 4.11开始,@ Rule字段必须是非静态的,而@ClassRule字段必须是静态的,因此上述内容不再可能.
有明确的解决方法(例如,明确地将@ClassRule和@Rule职责分离为单独的规则),但是必须强制使用两个规则似乎是一种耻辱.我简要介绍了使用@Rule并推断它是否是第一个/最后一个测试,但我不相信这些信息是可用的(至少,它不能直接在描述中获得).
在JUnit 4.11的单个规则中是否有一种干净整洁的@ClassRule和@Rule功能组合方式?
谢谢,罗恩
我有一个JUnit测试类的JUnit套件.如果在该测试方法上存在某个注释,我想在套件上定义一个规则,以便在运行每个单元测试之前和之后对数据库执行某些操作.
我已经能够在套件和测试类中创建一个@ClassRule,它将在每个类之前执行此操作(这不够好)并且我已经能够使用测试类本身定义测试规则,但是这样是重复的,似乎不是很干.
是否可以在套件中定义每个测试方法规则,还是必须将它们添加到每个测试中?
编辑:为了澄清,我想在套件中声明代码,它将在测试类中的测试方法之间运行(即"围绕").
我正在使用JUnit 4.10来运行测试套件,并且我已经实现了一个"重试失败测试"规则,遵循Matthew Farwell在如何立即重新运行失败的JUnit测试中的精彩笔记?帖子.我用以下代码创建了一个"RetryTestRule"类:
public class RetryTestRule implements TestRule {
private final int retryCount;
public RetryTestRule(int retryCount) {
this.retryCount = retryCount;
}
@Override
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
// retry logic
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
return;
} catch …Run Code Online (Sandbox Code Playgroud) 我们有一个C#/ ASP .Net Web应用程序,由构建服务器(Jenkins)构建和部署.自动部署之前的构建步骤之一是确保所有自动化测试都通过 - 包括使用Selenium 2 WebDriver和NUnit进行的功能测试.
问题:有时候这些测试会随机失败.他们将成功完成100个构建,然后一个失败.它们由于各种原因而失败 - 一个.Click()事件被忽略,元素无法找到,IE有一个糟糕的一天等等.我们有一个AJAX沉重的Web应用程序,因此我们非常依赖WebDriverWaits但我们总是采取在编写测试时考虑到这一点,就像我说测试确实在大部分时间都通过了.
有哪些方法可以避免或解决这个问题?一对夫妇,我想到了:
我正在努力改进现有的自动化Selenium测试系统.我的目标是重复因连接问题而失败的测试.我发现并试图遵循这个线程如何立即重新运行失败的JUnit测试?这表明它非常有用.
在我的情况下,套件由类组成,所以我试图用@ClassRule替换@Rule,以便重复每次尝试@Before和@After部分.对不起我很抱歉,但我应该把这个规则放在哪里?在我的套件课程中?或者在代表测试的类中?
我想弄清楚,如何使用Espresso重新运行失败的测试.我认为从常见的JUnit测试案例来看,这有点复杂,因为您需要在测试开始之前恢复应用中的状态.
我的方法是创建自己的ActivityTestRule,所以我只是从这个类中复制了整个代码,并将其命名为MyActivityTestRule.
在仪器测试的情况下,规则还需要有关我们如何开始活动的信息.我更愿意自己推出它而不是为我做环境.例如:
@Rule
public MyActivityTestRule<ActivityToStartWith> activityRule = new MyActivityTestRule<>(
ActivityToStartWith.class, true, false
);
Run Code Online (Sandbox Code Playgroud)
所以我也在@Before注释方法中启动我的活动:
@Before
public void setUp() throws Exception {
activityRule.launchActivity(new Intent());
}
Run Code Online (Sandbox Code Playgroud)
并在@After注释方法中进行清理:
@After
public void tearDown() throws Exception {
cleanUpDataBaseAfterTest();
returnToStartingActivity(activityRule);
}
Run Code Online (Sandbox Code Playgroud)
这些方法 - setUp(),tearDown()是每次测试运行之前/之后调用的必要条件 - 以确保测试开始期间的应用程序状态是正确的.
在MyActivityTestRule中,到目前为止我做了一些修改.首先是应用方法的变更来自:
@Override
public Statement apply(final Statement base, Description description) {
return new ActivityStatement(super.apply(base, description));
}
Run Code Online (Sandbox Code Playgroud)
这对我来说是未知的,但是事情,如ActivityStatement放在ActivityTestRule有super.apply方法,因此也包装测试语句UiThreadStatement:
public class UiThreadStatement extends Statement {
private final Statement mBase;
private final boolean mRunOnUiThread;
public UiThreadStatement(Statement base, boolean runOnUiThread) {
mBase = base; …Run Code Online (Sandbox Code Playgroud) 用例很简单:我想在使用@Test注释的JUnit测试中的每个方法之前运行一些样板代码和我的自定义注释(让我们称之为@Mine).
我不想使用以下方法(括号中的解释):
我想这只留给我反思,这对我很好.我想通过使用@Before并通过Thread.getCurrentThread()等获得当前的方法,但不知怎的,我觉得这个解决方案有点脏,因为我必须在这个方法中再次制作锅炉板代码来激发反射(和避免任何不必要的代码是首先的目标).
也许你有其他一些想法?
我有一个使用Geb和Spock的Grails应用程序的功能测试.偶尔,功能测试将因超时或其他偶发行为而失败.在之前使用TestNG的项目中,我有一个retryAnalyzer只是在测试执行期间触发重试,以查看它是否两次都失败(然后真实失败).
如何让Spock重试失败的测试?
java ×6
junit ×6
junit4 ×3
android ×1
aop ×1
cucumber ×1
geb ×1
grails ×1
groovy ×1
jenkins ×1
junit-rule ×1
reflection ×1
spock ×1
testing ×1
unit-testing ×1