μμ ν΄λμ€μ @Test
λ©μλλ μμ ν΄λμ€λ₯Ό μμνλ νμ ν΄λμ€μ μμ κ΄κ³μμ΄ ν λ²λ§ μ€νλ©λλ€.
@Test
λ©μλλ κ° νμ ν΄λμ€μ ν¨κ» μ€νλ©λλ€.
public class BaseTest extends SetupClass{
@BeforeClass...
@BeforeMethod...
@AfterClass...
@AfterMethod....
<strong i="22">@Test</strong>
public void baseMethod(){
System.out.println("base method");
}
}
public class Test1 extends BaseTest{
<strong i="25">@Test</strong>
public void test1(){
System.out.println("test1");
}
}
public class Test2 extends BaseTest{
<strong i="28">@Test</strong>
public void test2(){
System.out.println("test2");
}
}
λ€μκ³Ό κ°μ TestNG xml νμΌμμ μ΄λ¬ν ν μ€νΈλ₯Ό λ³λ ¬λ‘ μ€ννκ³ μμ΅λλ€.
<suite name="Regression Suite" verbose="1" parallel="classes" thread-count="4">
<parameter name="project" value="TestPrj"/>
<parameter name="server" value="QA01"/>
<test name="QA01 TestPrj">
<parameter name="environment" value="macos"/>
<groups>
<run>
<include name="regression"/>
</run>
</groups>
<packages>
<package name="test"/>
</packages>
</test>
</suite>
μΆμ github λ¬Έμ μμ μ½λλ₯Ό νΈμ§νλ κ²μ λ§€μ° λμ©λλ€... λ€λ₯Έ κ²μΌλ‘ μ΄λνμμμ€.
@vlad230
μΆμ github λ¬Έμ μμ μ½λλ₯Ό νΈμ§νλ κ²μ λ§€μ° λμ©λλ€... λ€λ₯Έ κ²μΌλ‘ μ΄λνμμμ€.
Markdownμ μ΅μν΄μ§λ λ° μκ°μ ν μ ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μμ μ§μ κ³Ό ν¨κ» μ½λ μ‘°κ°μ λ§€μ° μ½κ² μΆκ°ν μ μμ΅λλ€.
μ¬κΈ°μμ κ·νμ λ¬Έμ λ₯Ό μ΄ν΄νκ³ μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. κΆκ·Ήμ μΌλ‘ μμ ν΄λμ€λ κΈ°λ³Έ ν΄λμ€ λ©μλλ κ°μ Έμ΅λλ€. κ·Έλ¦¬κ³ TestNG μ£ΌμμΌλ‘ μ£Όμμ΄ λ¬λ¦° κ²½μ° λͺ¨λ νμ ν΄λμ€μ λν΄ μ€νλ©λλ€. μ΄κ²μ΄ TestNGμ λμμ λλ€. λ°λΌμ TestNGκ° μ€κ³λ λλ‘ μλνκ³ μλ€κ³ λ§νκ³ μΆμ΅λλ€.
@juherr - λΉμ μ μκ°μ?
@krmahadevan ν¬λ§·
μ¬κΈ°μμ κ·νμ λ¬Έμ λ₯Ό μ΄ν΄νκ³ μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. κΆκ·Ήμ μΌλ‘ μμ ν΄λμ€λ κΈ°λ³Έ ν΄λμ€ λ©μλλ κ°μ Έμ΅λλ€. κ·Έλ¦¬κ³ TestNG μ£ΌμμΌλ‘ μ£Όμμ΄ λ¬λ¦° κ²½μ° λͺ¨λ νμ ν΄λμ€μ λν΄ μ€νλ©λλ€. μ΄κ²μ΄ TestNGμ λμμ λλ€. λ°λΌμ TestNGκ° μ€κ³λ λλ‘ μλνκ³ μλ€κ³ λ§νκ³ μΆμ΅λλ€.
λΉμ μ΄ λμκ² λ¬»λλ€λ©΄, μνΌ ν΄λμ€μμ ν
μ€νΈλ₯Ό μ¬λ¬ λ² μ€ννλ κ²μ μλ―Έκ° μμ΅λλ€.
μ΄κ²μ΄ μ§κΈ TestNGμ μμλλ λμμ΄λΌλ©΄ κ°μ μΌλ‘ μΆκ°ν μ μμ΅λλ€.
μ€κ³λ λλ‘ μλν©λλ€.
μ체 ν΄λμ€μμ baseMethod
ν
μ€νΈλ₯Ό μ΄λνμ§ μλ μ΄μ λ 무μμ
λκΉ?
@vlad230
λΉμ μ΄ λμκ² λ¬»λλ€λ©΄, μνΌ ν΄λμ€μμ ν μ€νΈλ₯Ό μ¬λ¬ λ² μ€ννλ κ²μ μλ―Έκ° μμ΅λλ€.
μ νν 무μμ λ¬μ±νλ €κ³ ν©λκΉ? μλ리μ€λ₯Ό μμΈν μ€λͺ νκ±°λ μ€λͺ νλ λ° λμμ΄ λλ€λ©΄ μ’μ κ²μ λλ€.
μ΄κ²μ΄ μ§κΈ TestNGμ μμλλ λμμ΄λΌλ©΄ κ°μ μΌλ‘ μΆκ°ν μ μμ΅λλ€.
λ° μ§κ΄μ μ΄κΈ° λλ¬Έμ κ°μ μ¬νμΌλ‘ λ°μλ€μ¬μ§μ§ νμ μ΄ μμ§ μμ΅λλ€. κΈ°λ³Έ ν΄λμ€ λ©μλκ° μΌλ§λ λ§μ μμ ν΄λμ€κ° μλμ§μ κ΄κ³μμ΄ κΈ°λ³Έμ μΌλ‘ μ νν ν λ²λ§ μ€νλκΈ°λ₯Ό μνλ€λ©΄ λ€μμ μννμ¬ μ€λ ν μ€νΈ νλ‘μ νΈμμ μνν μ μμ΅λλ€.
org.testng.IHookable
ꡬνrun()
λ©μλ λ΄μμ κΈ°λ³Έ ν΄λμ€ λ©μλκ° μ΄λ―Έ μ€νλμλμ§ νμΈνκ³ μ€νλμ§ μμ κ²½μ° μ€ννλ νΈμ§ κ²μ¬λ₯Ό μΆκ°ν©λλ€.μ¬κΈ° μνμ΄ μμ΅λλ€
κΈ°λ³Έ ν΄λμ€ λ©μλκ° ν λ²λ§ μ€νλμ΄μΌ ν¨μ λνλ΄λ λ§μ»€ μΈν°νμ΄μ€
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE})
public <strong i="20">@interface</strong> RunOnce {
}
λ€μμ μν μΆμ κΈ° μ±κΈν€μ λλ€.
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class StateTracker {
private static final StateTracker instance = new StateTracker();
private final Map<String, Object> runOnceData = new ConcurrentHashMap<>();
private StateTracker() {}
public static StateTracker getInstance() {
return instance;
}
boolean canExecute(Method method) {
RunOnce runOnce = method.getAnnotation(RunOnce.class);
String methodName = method.getName();
boolean execute = true;
if (runOnce != null) {
if (runOnceData.containsKey(methodName)) {
execute = false;
} else {
runOnceData.put(methodName, new Object());
}
}
return execute;
}
}
κΈ°λ³Έ ν΄λμ€λ λ€μκ³Ό κ°μ΅λλ€.
import org.testng.IHookCallBack;
import org.testng.IHookable;
import org.testng.ITestResult;
import org.testng.annotations.Test;
public class BaseTest implements IHookable {
<strong i="27">@Test</strong>
<strong i="28">@RunOnce</strong>
public void baseclassTestMethod() {
System.err.println("Base class test method executed");
}
<strong i="29">@Override</strong>
public void run(IHookCallBack callBack, ITestResult testResult) {
boolean execute =
StateTracker.getInstance()
.canExecute(testResult.getMethod().getConstructorOrMethod().getMethod());
if (execute) {
callBack.runTestMethod(testResult);
} else {
testResult.setStatus(ITestResult.SKIP);
testResult.setThrowable(new RuntimeException("Intentionally skipping"));
}
}
}
νμ ν΄λμ€λ λ€μκ³Ό κ°μ΅λλ€.
import org.testng.annotations.Test;
public class ChildClass1 extends BaseTest {
<strong i="33">@Test</strong>
public void childTest() {
System.err.println(getClass().getName() + ".childTest() executed");
}
}
import org.testng.annotations.Test;
public class ChildClass2 extends BaseTest {
<strong i="36">@Test</strong>
public void childTest() {
System.err.println(getClass().getName() + ".childTest() executed");
}
}
ν
μ€νΈ κ²°κ³Όλ₯Ό μ 리νκ³ @RunOnce
μ¬μ©νμ¬ μ£Όμμ΄ λ¬λ¦° 건λλ΄ ν
μ€νΈλ₯Ό μ κ±°νλ νν°λ§ λ©μ»€λμ¦μ μΆκ°ν΄μΌ ν©λλ€.
@krmahadevan
μ νν 무μμ λ¬μ±νλ €κ³ ν©λκΉ? μλ리μ€λ₯Ό μμΈν μ€λͺ νκ±°λ μ€λͺ νλ λ° λμμ΄ λλ€λ©΄ μ’μ κ²μ λλ€.
μ¬λ¬ ν΄λμ€(κΈ°λ₯κ³Ό κ΄λ ¨λ)μμ ν
μ€νΈλ₯Ό λΆλ¦¬νλ €κ³ ν©λλ€. μλ₯Ό λ€μ΄, λΉμ μ μΈ‘λ©΄μ λ°λΌ κΈ°λ³Έ ν΄λμ€μμ ν
μ€νΈλ₯Ό μ§μ μΈ‘λ©΄ λ€λ₯Έ λμ°λ―Έ λ©μλλ₯Ό λ°λΌ @Before λ° @After λ°©λ² (μ ν
μ€νΈ)μ ν΄λΉ κΈ°λ₯μ λν μ€μ λΆλΆμ΄μλ "κΈ°λ³Έ ν΄λμ€"λ₯Ό κ°μ§κ³ "μμ ν΄λμ€μμ ν
μ€νΈ ". λ°λΌμ μ΄ λ°©λ²μΌλ‘ μμ ν΄λμ€μ μ ν
μ€νΈλ₯Ό μΆκ°νκ³ μμ ν΄λμ€μ μ½λλ₯Ό 볡μ νμ§ μμ΅λλ€.
κΈ°λ³Έ ν΄λμ€μλ ν΄λΉ κΈ°λ₯μ λ³΄λ€ μΌλ°μ μΈ λΆλΆμ ν
μ€νΈνλ λͺ κ°μ§ ν
μ€νΈ λ©μλκ° μκ³ μμ ν΄λμ€μλ λ³΄λ€ κ΅¬μ²΄μ μΈ ν
μ€νΈκ° μμ΅λλ€.
ν΄λμ€λ₯Ό λ³λ ¬λ‘ μ€ννμ¬ ν
μ€νΈ μ€ν μκ°μ μ΅μ ννλ €κ³ νκΈ° λλ¬Έμ 50κ° μ΄μμ ν
μ€νΈ λ©μλκ° μλ μλ "κΈ°λ³Έ ν΄λμ€"λ₯Ό μ¬λ¬ κ°μ λ μμ "μμ ν΄λμ€"λ‘ λΆν νμ¬ μ΄λ¬ν λ μμ ν΄λμ€κ° λ€λ₯Έ μ€λ λμ λ°°ν¬λλλ‘ ν΄μΌ νμ΅λλ€. /μ€νμ.
@krmahadevan μ μμΈν μ루μ
μ λν΄
κΈ°λ³Έ ν΄λμ€μμ ν
μ€νΈλ₯Ό μ§μμ μΌλ‘ λ€μ μ€νν νμκ° μμ΅λλ€. μ€μ /ν΄μ λ¬Έμ μΈ κ²½μ° νμ @Before/ @After λ₯Ό μ¬μ©ν μ μμΌλ©° κΈ°λ³Έ ν΄λμ€μ μμ ν΄λμ€ μ΄μ μ λ§€λ² λ€μ μ€νλ©λλ€.
μ, λμμ ꡬμ±ν μ μλ€κ³ μκ°ν©λλ€.
μ¬μ€, κ° μμ μΈμ€ν΄μ€μ λν΄ λΆλͺ¨ ν
μ€νΈλ₯Ό μ€ννλ €λ μ¬μ© μ¬λ‘λ₯Ό μ°Ύμ§ λͺ»νμ΅λλ€.
ν
μ€νΈ μνκ° ν΅ν© ν
μ€νΈμμ μμ£Ό μμ λκΈ° λλ¬Έμ ν
μ€νΈ( dependsOnMethods
)μ λν μ§μ μ μΈ μ’
μμ±μ΄ μλ ν.
@krmahadevan WDYT?
@vlad230
μμΈν μ루μ μ λν΄ λλ¨ν κ°μ¬νμ§λ§ λμκ² μ‘°κΈ λ²κ±°λ‘κ² λ³΄μ λλ€
κ·νμ μ¬μ© μ¬λ‘λ μΌλ° κ²κ³Ό μ½κ° λ€λ₯΄κ² 보μ λλ€. λμ±μ΄ λλ κ·Έκ²μ΄ μ΄λ»κ² μ΄λ£¨μ΄μ§ μ μλμ§μ λν μ€μ μλ₯Ό μ μνμ΅λλ€. λΉμ μ΄ν΄μΌ ν μΌμ μ΄κ²μ μ±ννκ³ μ΄κ²μ κΈ°λ°μΌλ‘νλ κ²μ λλ€.
TestNGλ μ¬μ©μ μ μν μ μμΌλ―λ‘ κΈ°λ³Έ λμμΌλ‘ λ³΄κ³ μΆμ΅λλ€.
μλμ. μ μκ°μλ κ·Έλ κ² ν μ μμ΅λλ€. ν μ€νΈλ νμ μ€νλμ΄μΌ ν©λλ€. κΈ°λ³Έ ν΄λμ€μ μλ€κ³ ν΄μ μ νμ μΌλ‘ μ€νν΄μΌ νλ κ²μ μλλλ€. TestNGλ μ¬μ©μ μ μν μ μμ΅λλ€. κ·Έλ¬λ μ΄κ²μ΄ TestNGκ° λͺ¨λ μ¬μ©μ μ μλ₯Ό μ§μν΄μΌ νλ€λ κ²μ μλ―Ένμ§λ μμ΅λλ€. μ¬μ©μκ° νμμ λ§κ² μ¬μ©μ μ μνκ³ μμ ν μ μλ λ°©λ²μ μ 곡νκΈ°λ§ νλ©΄ λ©λλ€. λ΄κ° 곡μ ν μνμ TestNGλ₯Ό λ³κ²½ν νμ μμ΄ μ΄λ¬ν μ¬μ©μ μ μλ₯Ό μ μ©ν μμ λλ€.
κΈ°λ³Έ ν΄λμ€μμ ν μ€νΈλ₯Ό μ§μμ μΌλ‘ λ€μ μ€νν νμκ° μμ΅λλ€. μ€μ /ν΄μ λ¬Έμ μΈ κ²½μ° νμ @Before/ @after λ₯Ό μ¬μ©ν μ μμΌλ©° κΈ°λ³Έ ν΄λμ€μ μμ ν΄λμ€ μ΄μ μ λ§€λ² λ€μ μ€νλ©λλ€.
λμκ² κ·Έκ²μ μ¬λ¬Όμ 보λ ν κ°μ§ λ°©λ²μΌ λΏμ
λλ€. νΉμ λ©μλκ° λ§€λ² μ€νλμ§ μμμΌ νλ€λ©΄ @Test
μ£Όμμ μ¬μ©νμ§ μμμΌ ν©λλ€. @BeforeTest
( <test>
νκ·ΈλΉ ν λ²λ§ μ€νλ¨) λλ @BeforeSuite
( <suite>
λΉ ν λ²λ§ μ€νλ¨)μ κ°μ κ΅¬μ± μ£Όμμ λ§€μ° μ μ¬μ©ν μ μμ΅λλ€
κΈ°λ³Έ ν΄λμ€μ ν μ€νΈ λ©μλκ° μ€μ λ‘ ν μ€νΈ λ©μλμΈμ§ νμ€νμ§ μμ΅λλ€. λμκ² κ·Έκ²λ€μ ν μ€νΈκ° μ€νλκΈ° μν΄ μΆ©μ‘±λ μ€μ 쑰건μ μ€μ νλ ꡬμ±μ²λΌ λ€λ¦½λλ€.
@juherr - μ¬κΈ°μ μ¬μ© μ¬λ‘μ λμνλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. λ°κ²¬λ μμΉμ κ΄κ³μμ΄ ν
μ€νΈλ₯Ό μ€νν΄μΌ ν©λλ€. λͺ¨λ μμ ν΄λμ€μ λν΄ μ€νλλ κ²μ μνμ§ μλ μλ리μ€κ° μλ κ²½μ° @Test
μ£Όμμ΄ μλ κ΅¬μ± μ£Όμμ μ¬μ©ν΄μΌ ν©λλ€.
ꡬν μΈ‘λ©΄μμ, νΉν μ¬λλ€μ΄ μ€ν μλ¨μΌλ‘ κ·Έλ£Ήμ μ¬μ©νκΈ° μμν λ μ½λλ² μ΄μ€μ λ§μ νΌλμ΄ μΆκ°λ κ²μ΄λΌκ³ μκ°ν©λλ€.
λν νμ¬ TestNG λ΄μμ μ΄λ―Έ μ΄ μμ μ μνν μ μλ λ°©λ²μ΄ μλ€κ³ μκ°ν©λλ€(μλ‘ κ³΅μ νμ΅λλ€). μ κ·Έκ²μ νμ©νμ§ μμ΅λκΉ? μ΄κ²μ μΌνμ± μ¬μ© μ¬λ‘λ‘ λ³΄μ΄λ©° TestNGκ° μ¬μ©λλ μΌλ°μ μΈ λ°©μμ λ§μ§ μλ κ² κ°μ΅λλ€.
@krmahadevan μ£μ‘ν©λλ€λ§ μ κ° νλ €λ κ²μ μ΄ν΄νμ§ κ°μ΅λλ€ .
λ΄ μμ ν΄λμ€(BaseTest - μ: DashboardTest)μλ νμ¬ 15κ°μ ν
μ€νΈκ° μκ³ κ°κ° λ΄λΆμ ν
μ€νΈκ° μλ 3κ°μ νμ ν΄λμ€(μ: DashboardFilterTest, DashboardTreeTest, DashboardEditorTest)κ° μμ΅λλ€. λ΄ κ²μλ¬Όμμ μ€λͺ
ν μ κ·Ό λ°©μμ μ¬μ©νμ¬ ν
μ€νΈλ₯Ό μ€νν λλ§λ€ ν΄λΉ 15κ°μ ν
μ€νΈκ° 3λ² μ΄μ μ€νλ©λλ€(μ¦, 3x15 = 45κ°μ ν
μ€νΈκ° μ€νλ¨). 15λ² ν
μ€νΈ.
λλ μ¬μ ν λΆλͺ¨ ν΄λμ€μ μλ ν μ€νΈκ° μμ ν΄λμ€μμ ν μ€νΈκ° μ€νλ λλ§λ€ λ€μ μ€νλλ κ²μ λ§μ΄ λμ§ μλλ€κ³ μκ°ν©λλ€. TestNGμ κΈ°λ³Έ λμμ κ·Έκ²μ νμ₯νλ μμ ν΄λμ€μ μμ κ΄κ³μμ΄ λΆλͺ¨ ν΄λμ€μμ ν μ€νΈ λ©μλλ₯Ό ν λ² μ€ννλ κ²μ μ νΈν©λλ€.
μ΄κ²μ΄ λΆκ°λ₯νλ€λ©΄ μ΄ν΄ν©λλ€. μ΄μ¨λ κ°μ¬ν©λλ€.
@vlad230
μΆκ° 컨ν μ€νΈλ₯Ό μΆκ°ν΄ μ£Όμ μ κ°μ¬ν©λλ€.
λ΄ μμ ν΄λμ€(BaseTest - μ: DashboardTest)μλ νμ¬ 15κ°μ ν μ€νΈκ° μκ³ κ°κ° λ΄λΆμ ν μ€νΈκ° μλ 3κ°μ νμ ν΄λμ€(μ: DashboardFilterTest, DashboardTreeTest, DashboardEditorTest)κ° μμ΅λλ€. λ΄ κ²μλ¬Όμμ μ€λͺ ν μ κ·Ό λ°©μμ μ¬μ©νμ¬ ν μ€νΈλ₯Ό μ€νν λλ§λ€ ν΄λΉ 15κ°μ ν μ€νΈκ° 3λ² μ΄μ μ€νλ©λλ€(μ¦, 3x15 = 45κ°μ ν μ€νΈκ° μ€νλ¨). 15λ² ν μ€νΈ.
μ΄ κ²½μ° DashboardFilterTest, DashboardTreeTest, DashboardEditorTest
κ° DashboardTest
νμ₯νλ μ΄μ λ 무μμ
λκΉ? DashboardTest
ν
μ€νΈλ μ¬κΈ°μμ μμ μ κ·Ό λ°©μμ νμ©νλ λμ μ체 ν΄λμ€μ μμ΄μΌ νλ κ² κ°μ΅λλ€. κΈ°λ³Έ ν΄λμ€λ λͺ¨λ κ³΅ν΅ ν
μ€νΈ λ©μλλ₯Ό μ κ±°νκ³ λ³λμ ν
μ€νΈ ν΄λμ€μ 보κ΄νλλ‘ λ¦¬ν©ν λ§ν΄μΌ νλ©°, DashboardTestλ @Test
μλ μΌλ°μ μΈ λ©μλλ§ ν¬ν¨νλλ‘ λ¦¬ν©ν λ§ν΄μΌ ν©λλ€. μλμ?
μ΄κ²μ΄ λΆκ°λ₯νλ€λ©΄ μ΄ν΄ν©λλ€. μ΄μ¨λ κ°μ¬ν©λλ€.
μνν μ μλμ§ μ¬λΆμ λν λ¬Έμ κ° μλλλ€(ꡬν κ³Όμ λ λ³λμ μ£Όμ μ). νμ§λ§ μ λ μ¬μ ν μ¬μ© μ¬λ‘ μ체μ μ ν¨μ±μ μ΄ν΄νλ λ° μ΄λ €μμ κ²ͺκ³ μμ΅λλ€.
@krmahadevan
μ΄ κ²½μ°
DashboardFilterTest, DashboardTreeTest, DashboardEditorTest
κ°DashboardTest
νμ₯νλ μ΄μ λ 무μμ λκΉ?DashboardTest
ν μ€νΈλ μ¬κΈ°μμ μμ μ κ·Ό λ°©μμ νμ©νλ λμ μ체 ν΄λμ€μ μμ΄μΌ νλ κ² κ°μ΅λλ€. κΈ°λ³Έ ν΄λμ€λ λͺ¨λ κ³΅ν΅ ν μ€νΈ λ©μλλ₯Ό μ κ±°νκ³ λ³λμ ν μ€νΈ ν΄λμ€μ 보κ΄νλλ‘ λ¦¬ν©ν λ§ν΄μΌ νλ©°, DashboardTestλ@Test
μλ μΌλ°μ μΈ λ©μλλ§ ν¬ν¨νλλ‘ λ¦¬ν©ν λ§ν΄μΌ ν©λλ€. μλμ?
'DashboardTest'μλ μμ ν΄λμ€μλ νμν λμ°λ―Έ λ©μλ(μ: openDashboard(), createDashboard() λ±)μ setup/teardown/cleanup(@Before/@After) λ©μλκ° ν¬ν¨λμ΄ μμ΅λλ€. λ°λΌμ μμ ν΄λμ€μ μ½λλ₯Ό 볡μ ν νμκ° μμ΅λλ€.
μ, 'DashboardTest'μ μΌλΆ ν
μ€νΈλ λ€λ₯Έ νΉμ ν΄λμ€λ‘ μ΄λν μ μμ§λ§ λ μΌλ°μ μ΄κΈ° λλ¬Έμ μ¬κΈ°μ μ μ§νκ³ μΆμμ΅λλ€(μ: λμ보λμ μ 체 λͺ¨μ νμΈ, κΈ°λ³Έ CRUD ν
μ€νΈ λλ μΌλΆ ν
μ€νΈλ ' t νΉμ λ²μ£Όμ μ ν©νκ±°λ νΌν©).
λ¬Όλ‘ , @Testκ° μλ ν μ€νΈ ν΄λμ€λ₯Ό κ°μ§ μ μμ§λ§(λΉλ‘ μ΄μνκ³ λκ΅°κ°κ° μ€μλ‘ μ¬κΈ°μ ν μ€νΈλ₯Ό μΆκ°ν μ μμ§λ§) μ΄ λ¬Έμ λ₯Ό νΌνκΈ° μν κ²μ λλ€. λ§μ΅λκΉ?
@vlad230
'DashboardTest'μλ μμ ν΄λμ€μλ νμν λμ°λ―Έ λ©μλ(μ: openDashboard(), createDashboard() λ±)μ setup/teardown/cleanup(@Before/@after) λ©μλκ° ν¬ν¨λμ΄ μμ΅λλ€. λ°λΌμ μμ ν΄λμ€μ μ½λλ₯Ό 볡μ ν νμκ° μμ΅λλ€.
μ΄κ²μ μλ―Έκ° μμ΅λλ€. κ·Έλ¦¬κ³ λ€, κΈ°λ³Έ ν΄λμ€ λ΄μ λ§€μ° μ μμ£Όν μ μμΌλ―λ‘ κ΅¬μ± λ°©λ²μ μμ ν΄λμ€μμλ μ¬μ©ν μ μμ΅λλ€.
μ, 'DashboardTest'μ μΌλΆ ν μ€νΈλ λ€λ₯Έ νΉμ ν΄λμ€λ‘ μ΄λν μ μμ§λ§ λ μΌλ°μ μ΄κΈ° λλ¬Έμ μ¬κΈ°μ μ μ§νκ³ μΆμμ΅λλ€(μ: λμ보λμ μ 체 λͺ¨μ νμΈ, κΈ°λ³Έ CRUD ν μ€νΈ λλ μΌλΆ ν μ€νΈλ ' t νΉμ λ²μ£Όμ μ ν©νκ±°λ νΌν©).
μ¬μ ν λͺ¨λ μΌλ° @Test
λ©μλλ₯Ό ν¬ν¨νλ GenericDashboardTest extends DashboardTest
λΌλ ν΄λμ€λ₯Ό λ§λ€ μ μμ΅λλ€.
λ¬Όλ‘ , @testκ° μλ ν μ€νΈ ν΄λμ€λ₯Ό κ°μ§ μ μμ§λ§(λΉλ‘ μ΄μνκ³ λκ΅°κ°κ° μ€μλ‘ μ¬κΈ°μ ν μ€νΈλ₯Ό μΆκ°ν μ μμ§λ§) μ΄ λ¬Έμ λ₯Ό νΌνκΈ° μν κ²μ λλ€. λ§μ΅λκΉ?
κΈμ, κ·Έκ²μ΄ μ½λ 리뷰μ λͺ©μ μ΄ μλκ² λκ° :) μ΄λ¬ν λ―Έλλ¬μ§μ λ°©μ§νκΈ° μν¨μ΄λ€. κΈ°λ³Έ ν΄λμ€(μ€λͺ
ν λ΄μ©)μλ μΌλ°μ μΈ μΌλ° @Test
λ©μλκ° ν¬ν¨λ νμκ° μμ΅λλ€. λμ°λ―Έμ ꡬμ±λ§ μ μμ©ν μ μμΌλ©° κΈ°λ³Έ ν΄λμ€λ₯Ό νμ₯νκ³ μΌλ° ν
μ€νΈ λ©μλλ₯Ό μμ©νλ ν
μ€νΈ ν΄λμ€λ₯Ό νλ λ κ°μ§ μ μμ΅λλ€. κ·Έκ²μ λΉλ©΄ν νΌλμ ν΄κ²°ν΄μΌν©λλ€.
_μ€κ³λ λλ‘ μλ_μΌλ‘ ν΄κ²°νμ¬ μ΄ λ¬Έμ λ₯Ό μ’ λ£ν©λλ€.