我正在大型网站上工作,每周至少更新一次(新功能添加,内容更改等)。然而,如果在目前,测试从来没有像应该那样彻底。所以一周前我开始研究自动化测试和硒。使用Selenium设置自动化测试框架
我读过,如果你想要做正确的话,不要单纯依靠硒元素。编程你的测试提供了更多的选择。我对第三方PHP绑定感到不舒服,所以我很快跳过了使用java编程测试。
现在我的问题围绕着如何巧妙地设置将要运行测试的系统。我的想法是以下几点:
- 测试将/应该完全自主
- 不过我想有某种主要应用循环所有这些测试和运行它们陆续
- 主要应用一个应该全天候运行或者至少由cronjob或其他东西定期开始运行
- 测试应尽可能在多个浏览器(或模拟客户端)中运行。到目前为止,我通过各自的WebDrivers使用FF,IE和Chrome。
- 我想命名一些文件夹并收集该文件夹中的所有测试。那么主应用程序就会采取该文件夹中的任何内容并运行它。那么每个人都会创建他们的测试并将它们放在该文件夹中,这样他们就会被添加到队列中
- 有一种方法可以用selenium ide创建测试,导出它们并立即与我的main应用程序(即它们无需任何修改即可正确运行)。好吧,我知道我说过,硒的缺点很少,但我觉得这是一些简单测试的好开始。另外,没有任何编程知识的人仍然可以使用它。就像现在一样,我将用selenium ide创建的测试导出为“Java/JUnit 4/WebDriver”,并更改了一些代码(将WebDriver作为参数传递)。
这里是我的“主应用程序”的代码:
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中所有的专家,所以不要被不好的形式被推迟(如主要方法的长时间抛出声明)。
现在,我的问题:
- 是我的整个概念,我上面制定,好吗?那就是:让一个主应用程序运行所有测试以及一个可以随时添加/删除测试的队列。或者还有其他关于这方面最佳实践的方法吗?你能想到什么其他概念/架构?
- 有没有一种方法可以用selenium ide创建测试,导出它们,并且它们可以立即与主应用程序一起工作,而无需进行任何修改?
- 好吧,因为我发布的代码,你可能想疯了,批评,;-)我打开各种建议。
- 是否有可能与硒运行不同版本的IE浏览器(或任何浏览器,就此而言)?它可能只是运行我已经安装的浏览器版本。所以如果我想测试一个浏览器的不同版本,我必须调用远程机器,这意味着硒电网?我真的只是猜测,现在:)
更好地使用像Hudson/Jenkins这样的持续集成服务器,这样提供java文件的人就可以上传它们,并且你可以上传java文件名,以便它们能够被它们给出。 – 2012-08-10 13:38:45