我刚刚发现在创建一些CRUD测试时,你无法在一次测试中设置数据并在另一次测试中读取数据(数据在每次测试之间重新设置为初始化)。
我要做的就是(C)用一个测试来创建一个对象,然后用(R)用下一个测试来创建它。 JUnit是否有办法做到这一点,或者它是否在意识形态上编码,以便不允许测试相互依赖?
答案 0 :(得分:20)
那么,对于单元测试,你的目标应该是测试最小的孤立代码片段,通常是按方法测试。
因此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");
}
}
答案 1 :(得分:12)
JUnit推动独立测试。一种选择是将两个逻辑测试放入一个@Test方法中。
部分创建TestNG是为了在测试中允许这些类型的依赖关系。它强制执行测试依赖项的本地声明 - 它以有效顺序运行测试,并且不运行依赖于失败测试的测试。有关示例,请参阅http://testng.org/doc/documentation-main.html#dependent-methods。
答案 2 :(得分:3)
这些测试需要多长时间?如果不是很多,那么为什么要出汗呢。当然你会不必要地创造一些物品,但这会花多少钱呢?
@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);
}
答案 3 :(得分:3)
JUnit是独立测试。但是,如果你没有办法,你可以使用"静态"存储它的实例。
static String storage;
@Test
public void method1() {
storage = "Hello"
}
@Test
public void method2() {
Assert.assertThat(something, is(storage));
}
答案 4 :(得分:2)
在这个基本例子中,变量在测试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是:blah