TestBench 测试用例中的依赖注入
Dependency Injection in a TestBenchTestCase
我开始使用 TestBench 为我的 Vaadin Flow 应用程序创建集成测试,我要测试的其中一件事是成功登录。为了使用有效凭据测试登录,我需要提供我的凭据。但我真的想避免将我的凭据硬编码到测试用例中。
因此,我想利用 @Value annotation 从我的 settings.xml 中注入我的用户名和密码,但为了做到这一点,我的测试 class 需要spring 托管 bean。
有没有办法让我的 TestBenchTestCase 成为 Spring-managed Bean?还是有更好的方法来实现我的目标?我相信执行成功登录最终会在几乎所有使用 TestBench 的集成测试用例开始时使用?
仅回答问题,您可以使用 @TestPropertySource(locations="...")
和 @RunWith(SpringRunner.class)
,您可以在下面找到一个完整的(尽管如此天真)示例(也是一个小的 intro)。
但是,根据您的最终目标(单元测试、回归、系统、压力等),您可能需要重新考虑您的方法,例如初始 "setup" 部分为系统提供 运行 整个套件所需的任何数据,可能包括创建和授权要使用的专用用户帐户。
1) 代码
package com.example;
import com.vaadin.testbench.TestBenchTestCase;
import com.vaadin.testbench.elements.TextFieldElement;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
@RunWith(SpringRunner.class)
@TestPropertySource(locations = "my-custom-config.properties")
public class SpringTestbenchTest extends TestBenchTestCase {
@Value("${input.text:unknown}")
private String text;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\Kit\Selenium\chromedriver_win32\chromedriver.exe");
setDriver(new ChromeDriver());
}
@After
public void tearDown() throws Exception {
getDriver().quit();
}
@Test
public void shouldTypeTextInInputBox() {
// open the browser
getDriver().get("https://demo.vaadin.com/sampler/#ui/data-input/text-input/text-field");
// wait till the element is visible
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
TextFieldElement textBox = (TextFieldElement) wait.until(ExpectedConditions.visibilityOf($(TextFieldElement.class).first()));
// set the value and check that its caption was updated accordingly
textBox.setValue(text);
assertThat(textBox.getCaption(), is(Math.min(text.length(), 10) + "/10 characters"));
}
}
2) src/test/resources/com/example/my-custom-config.properties
input.text=vaadin
3) 结果
我开始使用 TestBench 为我的 Vaadin Flow 应用程序创建集成测试,我要测试的其中一件事是成功登录。为了使用有效凭据测试登录,我需要提供我的凭据。但我真的想避免将我的凭据硬编码到测试用例中。
因此,我想利用 @Value annotation 从我的 settings.xml 中注入我的用户名和密码,但为了做到这一点,我的测试 class 需要spring 托管 bean。
有没有办法让我的 TestBenchTestCase 成为 Spring-managed Bean?还是有更好的方法来实现我的目标?我相信执行成功登录最终会在几乎所有使用 TestBench 的集成测试用例开始时使用?
仅回答问题,您可以使用 @TestPropertySource(locations="...")
和 @RunWith(SpringRunner.class)
,您可以在下面找到一个完整的(尽管如此天真)示例(也是一个小的 intro)。
但是,根据您的最终目标(单元测试、回归、系统、压力等),您可能需要重新考虑您的方法,例如初始 "setup" 部分为系统提供 运行 整个套件所需的任何数据,可能包括创建和授权要使用的专用用户帐户。
1) 代码
package com.example;
import com.vaadin.testbench.TestBenchTestCase;
import com.vaadin.testbench.elements.TextFieldElement;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
@RunWith(SpringRunner.class)
@TestPropertySource(locations = "my-custom-config.properties")
public class SpringTestbenchTest extends TestBenchTestCase {
@Value("${input.text:unknown}")
private String text;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\Kit\Selenium\chromedriver_win32\chromedriver.exe");
setDriver(new ChromeDriver());
}
@After
public void tearDown() throws Exception {
getDriver().quit();
}
@Test
public void shouldTypeTextInInputBox() {
// open the browser
getDriver().get("https://demo.vaadin.com/sampler/#ui/data-input/text-input/text-field");
// wait till the element is visible
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
TextFieldElement textBox = (TextFieldElement) wait.until(ExpectedConditions.visibilityOf($(TextFieldElement.class).first()));
// set the value and check that its caption was updated accordingly
textBox.setValue(text);
assertThat(textBox.getCaption(), is(Math.min(text.length(), 10) + "/10 characters"));
}
}
2) src/test/resources/com/example/my-custom-config.properties
input.text=vaadin
3) 结果