Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义在Intellij中运行junit测试的顺序?_Java_Intellij Idea_Junit_Integration Testing - Fatal编程技术网

Java 如何定义在Intellij中运行junit测试的顺序?

Java 如何定义在Intellij中运行junit测试的顺序?,java,intellij-idea,junit,integration-testing,Java,Intellij Idea,Junit,Integration Testing,我有一个脆弱的junit测试,只有在运行所有测试时才会失败。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明它 如果我运行所有测试,它将运行“错误设置”,然后运行“错误设置后失败的测试”。它还运行许多不相关的、缓慢的测试。但如果我使用一个模式只运行这两个,它会运行“错误设置后失败的测试”,然后运行“错误设置”。结果,两者都通过了 如何仅按顺序运行“错误设置”和“错误设置后失败的测试”?根据: 根据设计,JUnit没有指定测试方法的执行顺序 调用。到目前为止,这些方法只是按顺序调用 由反

我有一个脆弱的junit测试,只有在运行所有测试时才会失败。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明它

如果我运行所有测试,它将运行“错误设置”,然后运行“错误设置后失败的测试”。它还运行许多不相关的、缓慢的测试。但如果我使用一个模式只运行这两个,它会运行“错误设置后失败的测试”,然后运行“错误设置”。结果,两者都通过了

如何仅按顺序运行“错误设置”和“错误设置后失败的测试”?

根据:

根据设计,JUnit没有指定测试方法的执行顺序 调用。到目前为止,这些方法只是按顺序调用 由反射API返回。然而,使用JVM顺序是不明智的 由于Java平台没有指定任何特定的顺序 事实上,JDK 7返回了或多或少的随机顺序。当然 编写良好的测试代码不会采用任何顺序,但有些会采用,并且 在某些情况下,可预测的故障优于随机故障 平台

从版本4.11开始,JUnit默认情况下将使用确定性,但不是 可预测,顺序(MethodSorters.DEFAULT)。更改测试 执行顺序只是使用@FixMethodOrder注释测试类 并指定一个可用的MethodSorter:

@FixMethodOrder(methodsorter.JVM)
:将测试方法保留在 JVM返回的命令。此顺序可能因运行而异

@FixMethodOrder(methodsorter.NAME\u升序)
:对测试方法进行排序 按方法名称,按字典顺序排列


您可以使用
methodsorter.NAME\u ASCENDING
并更改方法名称以匹配您的特定顺序。我知道您使用它只是为了调试,但是依赖于您的测试方法执行顺序是一种测试味道,JUnit不能对测试方法执行顺序提供更精细的控制,单元测试应该是独立的,所以大多数框架不能保证或强制执行它们的运行顺序。但是,既然您想以我过去所做的最简单的方式强制执行一个命令,那么就需要创建一个“一次性”测试套件或测试方法,以我希望的任何顺序调用测试。单元测试是方法,只需调用它们。如果您要处理数十个测试,这很容易做到,如果您要处理数百个或数千个测试,这一点都不吸引人


尝试尽可能地隔离脆弱的交互,然后在一次性调用方法中交换交互较差的测试顺序。

正如Ali Dehghani所说,您可以通过

@FixMethodOrder(MethodSorters.NAME_升序):对测试方法进行排序 按方法名称,按字典顺序排列

代码:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public ApplicationTest() {
        super(MainActivity.class);
    }

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    void t1AttachUI(){
        // testing code goes here
    }

    @Test
    void t2InitializeViews(){
        // testing code goes here
    };

    @Test
    void t3SettingValues(){
        // testing code goes here
    };

    @Test
    void t4Validation(){
        // testing code goes here
    };

    @Test
    void t3AfterButtonPress(){
        // testing code goes here
    };
}
@FixMethodOrder(methodsorter.NAME\u升序)
公共类应用程序测试扩展了ActivityInstrumentationTestCase2{
公共应用程序测试(){
超级(MainActivity.class);
}
@统治
public ActivityTestRule mActivityTestRule=新的ActivityTestRule(MainActivity.class);
@试验
void t1AttachUI(){
//测试代码在这里
}
@试验
void t2InitializeViews(){
//测试代码在这里
};
@试验
void t3设置值(){
//测试代码在这里
};
@试验
无效验证(){
//测试代码在这里
};
@试验
void t3AfterButtonPress(){
//测试代码在这里
};
}

您应该修复test@Lashane我需要知道问题所在以修复测试。这个问题是关于了解问题是什么。通常“调试”是解决问题的方法,运行所有测试,找到失败的地方,在之前放置断点-找出它实际失败的原因,什么状态/变量导致它,找到此状态更改的地方,放置断点并运行所有测试again@Lashane我一般都这么做,但是在这种情况下,调试这个问题是一种非常低效的方法。很酷,这很有帮助。最后,我只是手动将@Ignore放在所有内容上(暂时)这对这个场景没有帮助,因为这个问题跨越多个类。这对这个场景没有帮助,因为这个问题跨越多个类。命名t1,t2。。。只能工作到t9。命名t01,t02。。。工作到t99。