因为我来过这里已经有一段时间了,我只是想重新熟悉我一直在研究的测试自动化框架。也许这是一个愚蠢的问题,但我会在大声思考的时候把它扔出去。
因为我已经引入了一个配置文件,其中包含excel文件的路径(包含测试数据)并实现了一个基本的Excel读取器来提取这些数据以进行测试,我发现我的初步测试主要是进行大量的完成所有这些设置。
例如:
有很多配置选项但有更简单的方法吗?
我有一个单独的TestBase类,其中包含登录类,我想有些人将这个用户登录信息移到那里,但不确定这是不是一个好主意。
我只是不想陷入困境重复工作是否有人有任何高级别的建议?
答案 0 :(得分:1)
所有这些“设置工作”,你所描述的实际上是非常常见的东西,它是AAA pattern真正起作用的方式:
用于在UnitTest方法中安排和格式化代码的模式
对于高级灯具用法,您可以使用最适合您的案例xUnit Setup pattern。
我完全赞同@Würgspaß的评论。他所描述的内容被称为Object Map,我在过去3年中大量使用它,并在多个自动化项目中取得了巨大成功。
我没有在您的方案中看到任何特定框架的使用,因此我建议您选择一些成熟的框架,例如TestNG和Cucumber JVM。最后一个将提供Context injection,因此您可以始终获得可在场景运行期间共享上下文/状态的干净步骤定义对象。并且您将能够仅重复使用所有重型设置并在所有测试之间共享它。 I/O
操作费用昂贵,可能会在更复杂的情况下导致问题,例如并行执行测试。
至于代码的设计,您可以找到一些非常有用的Selenium's Test design considerations,例如CallWrappers
。
答案 1 :(得分:1)
以下是一个可编译(但未完全编码)的快速而肮脏的示例,您可以如何为Selenium测试类设计基类。
基类定义了一个登录/注销方法,该方法将在测试执行派生测试类之前/之后调用。
从Json文件(基于javax.json)读取数据,并用于定位元素(使用键)和输入数据(使用值)。您可以轻松扩展代码以支持处理其他元素或位置策略(css,xpath)。
请注意,此示例未针对性能进行优化。但它足够快,一开始就可以根据您的需要进行调整(例如,在静态环境中加载急切的数据)。
package myproject;
import java.io.*;
import java.util.*;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.*;
public class MyProjectBaseTest {
protected static WebDriver driver;
@Before
public void before() {
WebDriver driver = new FirefoxDriver();
driver.get("http://myapp");
login();
}
@After
public void after() {
logout();
}
private void login() {
Map<String, String> data = readData("/path/to/testdata/login.json");
Set<String> keys = data.keySet();
for (String key : keys) {
WebDriverWait wait = new WebDriverWait(driver, 20L);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(key)));
final WebElement we = driver.findElement(By.id(key));
if ("input".equals(we.getTagName())) {
we.clear();
we.sendKeys(data.get(key));
}
//else if "button".equals(we.getTagName())
}
}
private void logout() {
//logout code ...
}
private Map<String, String> readData(String filename) {
Map<String, String> data = new HashMap<String, String>();
InputStream is = null;
String key = null;
try {
is = new FileInputStream(filename);
JsonParser parser = Json.createParser(is);
while (parser.hasNext()) {
Event e = parser.next();
if (e == Event.KEY_NAME) {
key = parser.getString();
}
if (e == Event.VALUE_STRING) {
data.put(key, parser.getString());
}
}
parser.close();
}
catch (IOException e) {
//error handling
}
finally {
//close is
}
return data;
}
}