混合测试自动化框架配置及Maven自动化测试框架结构答疑
2. 针对TestNG+POM+Spring的双项目(fb + fbutil)的困惑解答
先帮你理清两个项目的核心定位,再逐个解决常见困惑:
- fbutil:底层依赖库,封装通用工具、Spring配置、POM基类,所有测试通用的逻辑都放这里
- fb:测试执行层,依赖fbutil,编写具体页面对象、TestNG测试脚本、测试资源文件
常见困惑与解决方案
困惑1:如何在fb项目中调用fbutil的Spring Bean?
- 先把fbutil安装到本地Maven仓库:进入fbutil目录执行
mvn clean install - 在fb的
pom.xml中添加依赖:
<dependency> <groupId>com.yourcompany</groupId> <artifactId>fbutil</artifactId> <version>1.0.0</version> </dependency>
- 在fb的测试类中加载fbutil的Spring配置:
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) // 加载fbutil里的Spring配置 public class BaseTest extends AbstractTestNGSpringContextTests { @Autowired protected WebDriver driver; @Autowired protected ConfigManager configManager; }
后续所有测试类继承BaseTest即可直接使用注入的Bean。
困惑2:POM页面对象如何在两个项目中分工?
- fbutil中写BasePage:封装所有页面通用的方法,比如元素等待、点击、输入:
public class BasePage { @Autowired protected WebDriver driver; protected void waitForElementVisible(By locator) { new WebDriverWait(driver, Duration.ofSeconds(10)) .until(ExpectedConditions.visibilityOfElementLocated(locator)); } protected void clickElement(By locator) { waitForElementVisible(locator); driver.findElement(locator).click(); } }
- fb中写具体页面对象:继承BasePage,定义当前页面的元素和业务方法:
@Component // 交给Spring管理 public class LoginPage extends BasePage { // 从XML加载元素定位,用fbutil的XmlConfigLoader private By usernameInput = By.xpath( XmlConfigLoader.getXmlValue("config/pages/login.xml", "loginPage/usernameInput") ); public void enterUsername(String username) { waitForElementVisible(usernameInput); driver.findElement(usernameInput).sendKeys(username); } public void clickLoginBtn() { clickElement(By.xpath(XmlConfigLoader.getXmlValue("config/pages/login.xml", "loginPage/loginBtn"))); } }
困惑3:TestNG测试套件如何结合配置执行?
在fb的src/test/resources下创建testng.xml,指定测试类和参数:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="FB测试套件" parallel="tests" thread-count="2"> <parameter name="targetEnv" value="dev"/> <test name="登录测试"> <classes> <class name="com.yourcompany.fb.tests.LoginTest"/> </classes> </test> </suite>
然后在测试类中接收参数并初始化:
public class LoginTest extends BaseTest { @Autowired private LoginPage loginPage; @Parameters({"targetEnv"}) @BeforeTest public void setUp(String targetEnv) { String baseUrl = configManager.getBaseUrl(targetEnv); driver.get(baseUrl); } @Test public void testSuccessfulLogin() { loginPage.enterUsername("test_user"); loginPage.enterPassword("test_pass"); loginPage.clickLoginBtn(); // 断言逻辑 } }
困惑4:如何管理多线程下的WebDriver实例?
在fbutil的Spring配置中,把WebDriver配置成线程作用域的Bean,确保每个测试线程有独立的Driver实例:
<bean id="webDriver" class="org.openqa.selenium.chrome.ChromeDriver" scope="thread"> <constructor-arg> <bean class="org.openqa.selenium.chrome.ChromeOptions"> <property name="headless" value="${chrome.headless}"/> <property name="start-maximized" value="true"/> </bean> </constructor-arg> </bean> <!-- 加载属性文件,比如config.properties --> <context:property-placeholder location="classpath:config.properties"/>
困惑5:Maven打包与测试执行流程
- 构建fbutil:进入fbutil目录,执行
mvn clean install,将jar包安装到本地仓库 - 执行fb测试:进入fb目录,执行
mvn clean test,Maven会自动拉取fbutil依赖并执行TestNG测试 - 生成测试报告:在fb的
pom.xml中添加Surefire插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <configuration> <suiteXmlFiles> <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者vivkv
相关产品推荐
相关产品推荐

