我正在开发大型网站,每周至少更新一次(更新新功能,更改内容等)。然而,如果在任何情况下,测试从未像它应该的那样彻底。所以一周前我开始研究自动化测试和硒。
我读到如果你想做得对,不要仅仅依靠硒。编程测试提供了更多选择。我对第三方PHP绑定感到不舒服,所以我很快就跳过使用java编程测试。
现在我的问题围绕如何巧妙地设置将运行测试的系统。我的想法如下:
以下是我的“主要应用程序”的代码:
import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
public class SeleniumTest {
public static void main(String[] args) throws
ClassNotFoundException, InstantiationException,IllegalAccessException,
NoSuchMethodException, SecurityException, IllegalArgumentException,
InvocationTargetException {
String[] drivers = {
"org.openqa.selenium.firefox.FirefoxDriver",
"org.openqa.selenium.ie.InternetExplorerDriver",
"org.openqa.selenium.chrome.ChromeDriver"
};
Class params[] = {WebDriver.class};
String testFolderName = "lookhere";
while (true) {
//get all .java files from some folder. those will be the tests to run
File testFolder = new File(testFolderName);
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
};
String[] tests = testFolder.list(filter);
if (tests == null) {
System.exit(0);
}
for(int i=0; i<drivers.length; i++) {
//loop through different drivers, instantiate them
Class webDriverClass = Class.forName(drivers[i]);
WebDriver driver = (WebDriver) webDriverClass.newInstance();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
for (int j=0; j<tests.length; j++) {
//loop through tests, instantiate them
String currentTestName = tests[j].replace(".java", "");
Class testClass = Class.forName(currentTestName);
Object test = testClass.newInstance();
Method methods[] = testClass.getDeclaredMethods();
Method fn;
//run every method that starts with "test" (usually just one)
//also run setUp, passing the driver object
for(int k=0; k<methods.length; k++) {
if (methods[k].getName().startsWith("test")) {
fn = testClass.getDeclaredMethod(methods[k].getName());
fn.invoke(test);
} else if(methods[k].getName().equals("setUp")) {
fn = testClass.getDeclaredMethod("setUp", params);
fn.invoke(test, driver);
}
}
}
driver.quit();
}
}
}
}
正如你可能看到的那样,我根本不是java的专家,所以不要被糟糕的形式推迟(比如主方法的long throws-declaration)。
现在,我的问题:
答案 0 :(得分:0)
我会使用TestNG来编排测试而不是主方法,它允许参数化作为前面的答案状态,如果你使用selenium GRID 2,你可以在许多不同的浏览器上并行运行测试/操作系统版本组合
我还会考虑使用PageObjects&amp; amp;来建模测试用例。 PageFactories,这将进一步帮助进行封装和健壮的测试。
答案 1 :(得分:0)
尽管我没有完整的解决方案,但我确实有一些经验可以考虑:
希望这会有所帮助。
答案 2 :(得分:-1)
你的概念还可以,但你如何实现它是远离它的。
您的一个标准是不断变化的网页。对于这个Selenium IDE是没用的。您将经常更新您的测试用例。
错误地假设如何编写测试用例。
由于测试用例是在普通计算机上运行的,因此无法轻松地针对不同版本的浏览器类型运行。每个版本都需要不同的机器。
所以我的解决方案是
如前所述,为每个网页创建一个类,其中包含您要使用的每个元素的函数。还可以创建帮助程序类来组织流程。这会大大降低您的维护时间。它只需要在几个类而不是每个测试用例中更新。
对于日程安排和概述,我会从Jenkins运行测试。这允许您为不同类型的操作系统,浏览器等设置作业。 Jenkins支持在slave上运行测试用例。因此,每个从属服务器可以为您要测试的每种类型的浏览器提供不同版本。
对于真正高级的我会动态创建虚拟机,以便使用VMWare或KVM作为从属设备。这将允许您在每次开始测试运行时设置所需的确切服务器类型。您可以为每种类型的操作系统设置创建映像,并在Jenkins中启动作业时通过选项决定从哪个映像创建虚拟机。