ã¹ãŒããŒã¯ã©ã¹ã®@Test
ã¡ãœããã¯ãã¹ãŒããŒã¯ã©ã¹ãç¶æ¿ãããµãã¯ã©ã¹ã®æ°ã«é¢ä¿ãªã1åå®è¡ãããŸãã
@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");
}
}
ãããã®ãã¹ãã¯ã次ã®ãããªTestNGxmlãã¡ã€ã«ãã䞊è¡ããŠå®è¡ããŠããŸãã
<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>
PSgithubã®åé¡ã§ã³ãŒããç·šéããã®ã¯éåžžã«æªãã§ã...å¥ã®å Žæã«ç§»åããŠãã ããã
@ vlad230
PSgithubã®åé¡ã§ã³ãŒããç·šéããã®ã¯éåžžã«æªãã§ã...å¥ã®å Žæã«ç§»åããŠãã ããã
Markdownã«æ £ããããã«æéãè²»ãããããšæããããããŸããã ããã«ããããã©ãŒããããšãšãã«ã³ãŒãã¹ãããããéåžžã«ç°¡åã«è¿œå ã§ããŸãã
ããã§ããªãã®åé¡ãç解ããŠããã®ãããããããŸããã æçµçã«ãåã¯ã©ã¹ã¯åºæ¬ã¯ã©ã¹ã®ã¡ãœãããååŸããŸãã ãŸããTestNGã¢ãããŒã·ã§ã³ãä»ããããŠããå Žåã¯ããã¹ãŠã®åã¯ã©ã¹ã«å¯ŸããŠå®è¡ãããŸãã ãããTestNGã®åäœã§ãã ã€ãŸããTestNGã¯èšèšã©ããã«æ©èœããŠãããšèšããŸãã
@ juherr-ããªãã®èãã¯ïŒ
@krmahadevanãã©ãŒãããããŠãããŠããããšã:)
ããã§ããªãã®åé¡ãç解ããŠããã®ãããããããŸããã æçµçã«ãåã¯ã©ã¹ã¯åºæ¬ã¯ã©ã¹ã®ã¡ãœãããååŸããŸãã ãŸããTestNGã¢ãããŒã·ã§ã³ãä»ããããŠããå Žåã¯ããã¹ãŠã®åã¯ã©ã¹ã«å¯ŸããŠå®è¡ãããŸãã ãããTestNGã®åäœã§ãã ã€ãŸããTestNGã¯èšèšã©ããã«æ©èœããŠãããšèšããŸãã
ç§ã«èšãããã°ãã¹ãŒããŒã¯ã©ã¹ã§ãã¹ããè€æ°åå®è¡ããŠãæå³ããããŸããã
ãããçŸåšã®TestNGã®äºæ³ãããåäœã§ããå Žåã¯ãæ¹åã®ããã«ãããè¿œå ã§ããŸãã
èšèšã©ããã«æ©èœããŸãã
baseMethod
ãã¹ããç¬èªã®ã¯ã©ã¹ã«ç§»åããŠã¿ãŸãããïŒ
@ vlad230
ç§ã«èšãããã°ãã¹ãŒããŒã¯ã©ã¹ã§ãã¹ããè€æ°åå®è¡ããŠãæå³ããããŸããã
æ£ç¢ºã«äœãéæããããšããŠããŸããïŒ ã·ããªãªã詳ãã説æãããã説æãããããŠããã ããã°å¹žãã§ãã
ãããçŸåšã®TestNGã®äºæ³ãããåäœã§ããå Žåã¯ãæ¹åã®ããã«ãããè¿œå ã§ããŸãã
ãã®ã«ãŠã³ã¿ãŒãçŽæçã§ããããããããæ¡åŒµæ©èœãšããŠåãäžãããããã©ããã¯ããããŸããã åºæ¬çã«ãåã¯ã©ã¹ãããã€ååšããŠããŠããåºæ¬ã¯ã©ã¹ã®ã¡ãœããã1åã ãå®è¡ããå Žåã¯ã次ã®ããã«ããŠããã¹ããããžã§ã¯ãã§ä»æ¥å®è¡ã§ããŸãã
org.testng.IHookable
å®è£
ããŠããããŸãrun()
ã¡ãœããå
ã«ãåºæ¬ã¯ã©ã¹ã®ã¡ãœããããã§ã«å®è¡ãããŠãããã©ããããã§ãã¯ããå®è¡ãããŠããªãå Žåã¯å®è¡ããç·šéãã§ãã¯ãè¿œå ããŸããããããµã³ãã«ã§ã
åºæ¬ã¯ã©ã¹ã®ã¡ãœããã1åã ãå®è¡ããå¿ èŠãããããšã瀺ãããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹
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以äžã®ãã¹ãã¡ãœãããæã€å
ã®ãåºæ¬ã¯ã©ã¹ããè€æ°ã®å°ããªãåã¯ã©ã¹ãã«åå²ããŠããããã®å°ããªã¯ã©ã¹ãä»ã®ã¹ã¬ããã«åæ£ãããããã«ããå¿
èŠããããŸããã / executorsã
@krmahadevanã¯è©³çŽ°ãªè§£æ±ºçã«æè¬ããŸãããç§ã«ã¯å°ãé¢åã«èŠããŸãã TestNGã¯ã«ã¹ã¿ãã€ãºã§ããã®ã§ããããããã©ã«ãã®åäœãšèŠãªããããšæããŸãã
åºæ¬ã¯ã©ã¹ãããã¹ãã絶ããåå®è¡ããå¿
èŠã¯ãªããšæããŸãã ã»ããã¢ãã/ãã£ã¢ããŠã³ã®åé¡ã§ããå Žåã¯ããã€ã§ã@ Before / @Afterã䜿çšã§ããŸããããã¯ãåºæ¬ã¯ã©ã¹ã®åã¯ã©ã¹ã®åã«æ¯ååå®è¡ãããŸãã
ã¯ããåäœã¯æ§æå¯èœã ãšæããŸãã
å®éãåã€ã³ã¹ã¿ã³ã¹ããšã«èŠªãã¹ããå®è¡ãããŠãŒã¹ã±ãŒã¹ã¯èŠã€ãããŸããã
çµ±åãã¹ãã®ããã«ãã¹ãç¶æ
ãå€æŽãããããšãå€ãããããã¹ããžã®çŽæ¥ã®äŸåé¢ä¿ïŒ dependsOnMethods
ïŒããªãéãã
@krmahadevan WDYTïŒ
@ vlad230
詳现ãªè§£æ±ºçã«æè¬ããŸãããç§ã«ã¯å°ãé¢åã«èŠããŸã
ããªãã®ãŠãŒã¹ã±ãŒã¹ããéåžžãšã¯å°ãç°ãªã£ãŠèŠããŸãã ããã«ãç§ã¯ããªãã«ãããã©ã®ããã«è¡ãããããšãã§ãããã®å®éçãªäŸãäžããŸããã ããªããããå¿ èŠãããã®ã¯ããããæ¡çšããããã«åºã¥ããŠæ§ç¯ããããšã ãã§ãã
TestNGã¯ã«ã¹ã¿ãã€ãºã§ããã®ã§ããããããã©ã«ãã®åäœãšèŠãªããããšæããŸãã
ããããããã¯ç§ã®æèŠã§ã¯ã§ããŸããã ãã¹ãã¯åžžã«å®è¡ãããããšãç®çãšããŠããŸãã ããããåºæ¬ã¯ã©ã¹ã«ååšãããããšãã£ãŠãããããéžæçã«å®è¡ããå¿ èŠããããšããæå³ã§ã¯ãããŸããã TestNGã¯ã«ã¹ã¿ãã€ãºã§ããŸãã ããããããã¯TestNGããã¹ãŠã®ã«ã¹ã¿ãã€ãºããµããŒãããå¿ èŠããããšããæå³ã§ã¯ãããŸããã ãŠãŒã¶ãŒãèªåã®ããŒãºã«åãããŠã«ã¹ã¿ãã€ãºããæäœã§ããããã«ããæ¹æ³ãæäŸããå¿ èŠãããã ãã§ãã ç§ãå ±æãããµã³ãã«ã¯ãTestNGãå€æŽããã«ãããã®ã«ã¹ã¿ãã€ãºãé©çšããäŸã§ãã
åºæ¬ã¯ã©ã¹ãããã¹ãã絶ããåå®è¡ããå¿ èŠã¯ãªããšæããŸãã ã»ããã¢ãã/ãã£ã¢ããŠã³ã®åé¡ã§ããå Žåã¯ãåžžã«@ Before / @afterã䜿çšã§ããŸããããã¯ãåºæ¬ã¯ã©ã¹ã®åã¯ã©ã¹ã®åã«æ¯ååå®è¡ãããŸãã
ç§ã«ãšã£ãŠãããã¯ç©äºãèŠãäžã€ã®æ¹æ³ã«ãããŸããã ç¹å®ã®ã¡ãœãããæ¯åå®è¡ããå¿
èŠããªãå Žåã¯ã @Test
ã¢ãããŒã·ã§ã³ã䜿çšããªãã§ãã ããã @BeforeTest
ïŒ <test>
ã¿ã°ããšã«1åã ãå®è¡ãããïŒã@BeforeSuite
ïŒ <suite>
ããšã«1åã ãå®è¡ãããïŒãªã©ã®æ§æã¢ãããŒã·ã§ã³ãéåžžã«ããŸã䜿çšã§ããŸãã
åºæ¬ã¯ã©ã¹ã®ãã¹ãã¡ãœãããæ¬åœã«ãã¹ãã¡ãœããã§ãããã©ããã¯ããããŸããã ç§ã«ã¯ããã¹ããå®è¡ããããã«æºããã»ããã¢ããæ¡ä»¶ã確ç«ããæ§æã®ããã«èãããŸãã
@ juherr-ããã§ã®ãŠãŒã¹ã±ãŒã¹ã«åæãããã©ããã¯ãã@Test
ã¢ãããŒã·ã§ã³ã§ã¯ãªããæ§æã¢ãããŒã·ã§ã³ã䜿çšããå¿
èŠããããŸãã
å®è£ åŽã§ã¯ãç¹ã«äººã ãå®è¡ã®æ段ãšããŠã°ã«ãŒãã䜿çšãå§ãããšãã«ãããã¯ã³ãŒãããŒã¹ã«å€ãã®æ··ä¹±ãè¿œå ãããšæããŸãã
ããã«ãçŸåšTestNGïŒäŸãšããŠå ±æããŠããŸãïŒå ã§ãããè¡ãæ¹æ³ããã§ã«ãããšæããŠããŸãã ãªãããã掻çšããªãã®ã§ããïŒ ããã¯1åéãã®ãŠãŒã¹ã±ãŒã¹ã®ããã§ãããTestNGã®éåžžã®äœ¿çšæ¹æ³ã«é©åããŠããªãããã§ãã
@krmahadevanç³ãèš³ãããŸããããããªãã¯ç§ãããããšããŠããããšãç解ããŠããªãã£ããšæããŸãã
芪ã¯ã©ã¹ïŒBaseTest-äŸïŒDashboardTestïŒã«ã¯ãçŸåš15åã®ãã¹ããããã3ã€ã®åã¯ã©ã¹ïŒäŸïŒDashboardFilterTestãDashboardTreeTestãDashboardEditorTestïŒããããããããã«ãã¹ãããããŸãã ç§ã®æçš¿ã§èª¬æããã¢ãããŒãã䜿çšãããšããã¹ããå®è¡ãããã³ã«ããããã®15ã®ãã¹ãã3åå®è¡ããïŒã€ãŸãã3x15 = 45ã®ãã¹ããå®è¡ãããŸãïŒã䟡å€ããªããªããå®è¡æéãç¡é§ã«é·ããªããŸãã 15åã®ãã¹ãã
芪ã¯ã©ã¹ã«ãããã¹ãããåã¯ã©ã¹ããã®ãã¹ããå®è¡ããããã³ã«åå®è¡ãããããšã¯ããŸã æå³ããªããšæããŸãã TestNGã®ããã©ã«ãã®åäœã§ã¯ãæ¡åŒµããŠããåã¯ã©ã¹ã®æ°ã«é¢ä¿ãªãã芪ã¯ã©ã¹ãããã¹ãã¡ãœããã1åå®è¡ããããšããå§ãããŸãã
ãããã§ããªãã®ãªããç§ã¯ç解ããŠããŸãã ãšã«ããããããšãã
@ 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ãã¹ãããŸãã¯ããã§ãªããã¹ãããã§ãã¯ãããªã©ïŒãç¹å®ã®ã«ããŽãªã«åœãŠã¯ãŸãããæ··åãããŠããŸãïŒã
確ãã«ã@ Test以å€ã®ãã¹ãã¯ã©ã¹ãäœæããããšã¯ã§ããŸããïŒå¥åŠã§ã誰ãã誀ã£ãŠããã«ãã¹ããè¿œå ããå¯èœæ§ããããŸãïŒããã®åé¡ãåé¿ããã ãã§ãããïŒ
@ vlad230
'DashboardTest'ã«ã¯ãåã¯ã©ã¹ã«ãå¿ èŠãªãã«ããŒã¡ãœããïŒopenDashboardïŒïŒãcreateDashboardïŒïŒãªã©ïŒãšsetup / teardown / cleanupïŒ@ Before / @ afterïŒã¡ãœãããå«ãŸããŠããŸãã ãããã£ãŠãåã¯ã©ã¹ã§ã³ãŒããè€è£œããå¿ èŠã¯ãããŸããã
æå³ããã ã¯ãããããã¯åºæ¬ã¯ã©ã¹å ã«éåžžã«ããŸãååšã§ãããããæ§æã¡ãœããã¯åã¯ã©ã¹ã§ã䜿çšã§ããããã«ãªããŸãã
ã¯ãããDashboardTestãã®äžéšã®ãã¹ãã¯ä»ã®ç¹å®ã®ã¯ã©ã¹ã«ç§»åã§ããŸãããããäžè¬çã§ãããããããã«æ®ããŠãããããšæããŸããïŒããšãã°ãããã·ã¥ããŒãã®å šäœçãªå€èŠ³ãåºæ¬çãªCRUDãã¹ãããŸãã¯ããã§ãªããã¹ãããã§ãã¯ãããªã©ïŒãç¹å®ã®ã«ããŽãªã«åœãŠã¯ãŸãããæ··åãããŠããŸãïŒã
ããã§ãããã¹ãŠã®æ±çš@Test
ã¡ãœãããå«ãGenericDashboardTest extends DashboardTest
ãšããã¯ã©ã¹ãäœæã§ããŸãã
確ãã«ã@ test以å€ã®ãã¹ãã¯ã©ã¹ãäœæããããšã¯ã§ããŸããïŒå¥åŠã§ã誰ãã誀ã£ãŠããã«ãã¹ããè¿œå ããå¯èœæ§ããããŸãïŒããã®åé¡ãåé¿ããã ãã§ãããïŒ
ãŸããããã¯ã³ãŒãã¬ãã¥ãŒãããã«ããã®ã§ã¯ãããŸãã:)ãã®ãããªæ»ããé²ãããã«ã åºæ¬ã¯ã©ã¹ïŒããªãã説æãããã®ããïŒã¯ãäžè¬çãªäžè¬çãª@Test
ã¡ãœãããå«ãå¿
èŠã¯ãããŸããã ãã«ããŒãšæ§æã ããå容ããããšãã§ããåºæ¬ã¯ã©ã¹ãæ¡åŒµããŠäžè¬çãªãã¹ãã¡ãœãããå容ãããã1ã€ã®ãã¹ãã¯ã©ã¹ãäœæã§ããŸãã ããã¯ç®åã®æ··ä¹±ã解決ããã¯ãã§ãã
_èšèšã©ããã«æ©èœãã_ãšãã解決çã§ãã®åé¡ã解決ããŸã