我正在处理每周至少一次更新(添加新功能、更改内容等)的大型网站。然而,即使有测试,也永远不会像应有的那样彻底。所以一周前我开始研究自动化测试和硒。
我读到,如果你想做对,不要仅仅依赖 selenium ide。对测试进行编程提供了更多选择。我对第三方 PHP 绑定完全不满意,所以我很快跳到使用 java 来编写测试。
现在我的问题围绕着如何巧妙地设置将运行测试的系统。我的想法如下:
- 测试将/应该是完全自主的
- 尽管如此,我还是希望有某种主应用程序来循环所有这些测试并一个接一个地运行它们
- 主应用程序应该 24/7 运行,或者至少通过 cronjob 或其他东西定期启动
- 测试应该在尽可能多的浏览器(或模拟客户端??)中运行。到目前为止,我通过各自的 WebDrivers 使用 FF、IE 和 chrome。
- 我想命名一些文件夹并收集该文件夹中的所有测试。然后,主应用程序将只获取该文件夹中的任何内容并运行它。然后每个人都会创建他们的测试并将它们放在那个文件夹中,这样它们就会被添加到队列中
- 如果有一种方法可以使用 selenium ide 创建测试,将它们导出并立即与我的主应用程序一起使用(即它们无需任何修改即可正确运行)。好的,我知道我说过,不建议使用 selenium ide,但我觉得这是一些简单测试的良好开端。此外,没有任何编程知识的人仍然可以使用它。就像现在一样,我将使用 selenium ide 创建的测试导出为“Java / JUnit 4 / WebDriver”并更改一些代码(将 WebDriver obect 作为参数传递)。
这是我的“主要应用程序”的代码:
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 专家,所以不要被糟糕的形式(比如 main 方法的长抛出声明)推迟。
现在,对于我的问题:
- 是我上面制定的整个概念,好吗?也就是说:让一个主应用程序运行所有测试和一个队列,我可以在其中动态添加/删除测试。还是有其他关于此的最佳实践方法?你还能想到什么其他概念/架构?
- 有没有办法用 selenium ide 创建测试,导出它们,它们可以立即与主应用程序一起使用,而无需任何修改?
- 好的,因为我发布了代码,您可能想发疯并批评它;-) 我愿意接受各种建议。
- selenium 是否可以运行不同版本的 IE(或任何浏览器,就此而言)?它可能只是运行我安装的浏览器版本。所以如果我想测试一个浏览器的不同版本,我必须调用远程机器,这意味着硒网格?我现在真的只是在猜测:)