在测试之间传递JUnit数据

我刚刚发现,在创建一些CRUD测试时,您无法在一次测试中设置数据,并在另一次测试中读取数据(数据在每次测试之间设置回初始化)。

我所要做的就是(C)用一个测试来创建一个对象,然后用(R)用下一个测试来创建它。 JUnit是否有办法做到这一点,或者它是否在意识形态上编码,以便不允许测试相互依赖?

那么,对于unit testing,你的目标应该是测试最小的孤立的代码片段,通常是按方法测试。 因此testCreate()是一个测试用例, testRead()是另一个。 但是,没有什么可以阻止您创建testCreateAndRead()来一起测试这两个函数。 但是如果测试失败,那么测试失败的代码单元是什么? 你不知道。 那些测试更像是集成测试,应该区别对待。

如果你真的想这样做,可以创建一个静态类变量来存储testCreate()创建的对象,然后在testRead()使用它。

因为我不知道你在谈论什么版本的Junit,所以我只拿起古老的Junit 3.8:

完全丑陋但有效:

 public class Test extends TestCase{ static String stuff; public void testCreate(){ stuff = "abc"; } public void testRead(){ assertEquals(stuff, "abc"); } } 

JUnit推动独立测试。 一种选择是将两个逻辑测试放入一个@Test方法中。

部分创建TestNG是为了在测试中允许这些类型的依赖关系。 它强制执行测试依赖项的本地声明 – 它以有效顺序运行测试,并且不运行依赖于失败测试的测试。 有关示例,请参见http://testng.org/doc/documentation-main.html#dependent-methods 。

JUnit是独立测试。 但是,如果没有办法,可以使用“静态”实例来存储它。

 static String storage; @Test public void method1() { storage = "Hello" } @Test public void method2() { Assert.assertThat(something, is(storage)); } 

这些测试需要多长时间? 如果不是很多,那么为什么要出汗呢。 当然你会不必要地创造一些物体,但这需要多少钱?

 @Test void testCreateObject() { Object obj = unit.createObject(); } @Test void testReadObject() { Object obj = null; try { obj = unit.createObject(); // this duplicates tests aleady done } catch (Exception cause) { assumeNoException(cause); } unit.readObject(obj); } 

在这个基本示例中,变量在测试A中更改,并且可以在测试B中使用

 public class BasicTest extends ActivityInstrumentationTestCase2 { public BasicTest() throws ClassNotFoundException { super(TARGET_PACKAGE_ID, launcherActivityClass); } public static class MyClass { public static String myvar = null; public void set(String s) { myvar = s; } public String get() { return myvar; } } private MyClass sharedVar; @Override protected void setUp() throws Exception { sharedVar = new MyClass(); } public void test_A() { Log.d(S,"run A"); sharedVar.set("blah"); } public void test_B() { Log.d(S,"run B"); Log.i(S,"sharedVar is: " + sharedVar.get()); } } 

输出结果是:

跑A

跑B

sharedVar是:等等