【发布时间】:2017-09-24 07:21:21
【问题描述】:
我正在尝试使用 testng.xml...,看起来 Device Farm 忽略了整个文件。
我的例子很简单。我有一个实例化测试类的工厂类,这就是我的 xml 文件的样子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
<test name="test">
<classes>
<class name="Factory"/>
</classes>
</test>
</suite>
我什至尝试手动排除方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
<test name="test">
<classes>
<class name="Factory"/>
<class name="TestSingleUrl">
<methods>
<exclude name="testCorrectSiteKey"/>
<exclude name="testIsTagImplemented"/>
<exclude name="testHttpsScheme"/>
<exclude name="testCorrectTagName"/>
<exclude name="testCorrectBootstrapPath"/>
</methods>
</class>
</classes>
</test>
</suite>
但我得到一个“无法调用方法:要么使其成为静态,要么创建一个非参数构造函数”。这意味着 Device Farm 正在尝试运行 TestSingleUrl 类中的方法。但是调用这些测试的应该是工厂
有谁知道我们如何让 Device Farm 接受我们的 xml 文件?
这是我的工厂类:
public class Factory{
private String targetSiteKey;
//Data Provider that consumes the first line, which contains the target sitekey of the tag
@DataProvider(name = "urlProvider")
public Iterator<Object[]> createData() throws IOException {
List<String> lines = IOUtils.readLines(new InputStreamReader(this.getClass().getResourceAsStream("Urls.csv")));
List<Object[]> objectArrays = lines.stream().map(x -> new Object[]{x}).collect(Collectors.toList());
Iterator<Object[]> itr = objectArrays.iterator();
targetSiteKey = itr.next()[0].toString();
return itr;
}
@Factory(dataProvider="urlProvider")
public Object[] creatingTests(String url){
System.out.println(System.currentTimeMillis());
String siteKey=null;
String path = null;
String tagName = null;
WebElement browsi;
try{
RemoteWebDriver driver = DriverWrapper.getDriver();
driver.get(url);
browsi = driver.findElement(By.id("browsi-tag"));
tagName = browsi.getTagName();
siteKey = browsi.getAttribute("data-sitekey");
path = browsi.getAttribute("src");
}catch(Exception ignored){}
finally{
return new Object[] {new TestSingleUrl(targetSiteKey,siteKey,path,tagName,url)};
}
}
}
这是我的 TestSingleUrl 类:
public class TestSingleUrl {
private String targetSiteKey,siteKey,path,tagName,url;
public TestSingleUrl(String targetSiteKey,String siteKey, String path, String tagName,String url){
this.targetSiteKey = targetSiteKey;
this.siteKey=siteKey;
this.path=path;
this.tagName=tagName;
this.url=url;
}
@Test
public void testCorrectSiteKey(){
System.out.println(url);
Assert.assertEquals(siteKey, targetSiteKey);
}
@Test
public void testIsTagImplemented(){
System.out.println(url);
Assert.assertFalse(siteKey.isEmpty());
Assert.assertFalse(tagName.isEmpty());
Assert.assertFalse(path.isEmpty());
}
@Test
public void testHttpsScheme(){
System.out.println(url);
Assert.assertTrue(path.contains("https"));
}
@Test
public void testCorrectTagName(){
System.out.println(url);
Assert.assertEquals(tagName,"script");
}
@Test
public void testCorrectBootstrapPath(){
System.out.println(url);
Assert.assertTrue(path.contains("middycdn-a.akamaihd.net/bootstrap/bootstrap.js"));
}
}
我认为我收到的错误消息是因为设备场正在尝试使用它找到的 @Test 注释运行每个方法。如果它正在读取我的 xml 文件,它就不会发生。
【问题讨论】:
-
你能分享一下Factory和TestSingleUrl吗?看起来你错误地实现了工厂模式。
-
嘿@RocketRaccoon ,我只是把课程。我不认为我的课程有错误..因为我可以在本地设备上运行它..问题是当我将它发送到设备场时。
-
你是如何在那里执行它的?
-
稍微了解一下 AWS Device Farm。那么,您是否尝试过将 testng.xml 放在 *-test.jar 依赖项的根目录下?另外,您的代码看起来不错,我认为这是 AWS 的配置问题。
-
我正在使用 *-test.jar 根目录下的 testng.xml 文件创建 zip 文件,我正在使用带有 Surefire 插件和其他插件的 Maven。我看到他们不支持每个 Testng 功能,但他们说他们支持基本的 xml 配置(比如要运行的类)。但我已经尝试了好几天......