[JAVA] Accélérez le temps d'exécution de Selenium avec l'annotation ClassRule de JUnit

introduction

Lors des tests avec Selenium, il est courant (je pense) de démarrer / arrêter le navigateur pour chaque méthode de test. Cependant, je voulais le raccourcir car le temps d'exécution augmenterait considérablement si le navigateur était redémarré à chaque fois.

Je pense qu'il existe différentes méthodes, mais cette fois je l'ai essayé avec l'annotation ClassRule de JUnit4. Si vous le déclarez dans ClassRule, new / quit de WebDriver peut être défini pour chaque classe de test, il sera donc raccourci en conséquence.

↓ Concernant la règle / la règle de classe, celle-ci est plus facile à comprendre. http://qiita.com/Chayata/items/dd31e22bca6df6c91793

la mise en oeuvre

Pour utiliser l'annotation Rule, vous devez implémenter une classe dédiée et l'utiliser comme champ de méthode de test. Pour plus de détails, reportez-vous à ce référentiel (https://github.com/knakamatsu/SeleniumJUnitRuleSample)

Côté règle

Implémentez la classe en héritant ExternalResouce et générez WebDriver en tant que champ de la classe. Étant donné que la méthode after remplacée devient le post-traitement de la jonction, implémentez la sortie de WebDriver dans after.

WebDriverRule.java


public class WebDriverRule extends ExternalResource {

	private WebDriver driver;
	public WebDriver getDriver() {
		return getInstance();
	}

	@Override
	protected void after() {
		this.driver.quit();
	}

	private WebDriver getInstance(){
		if(this.driver == null){
			this.driver = new ChromeDriver();
		}
		return this.driver;
	}
}

Côté exécution des tests

La classe Rule implémentée peut être utilisée à la fois dans @Rule et @ClassRule, et elles sont les suivantes. Lorsqu'il est déclaré avec @ClassRule, avant / après correspond au pré-traitement et au post-traitement pour chaque classe (@BeforeClass et @AfterClass) Lorsqu'il est déclaré avec @Rule, avant / après correspond au pré-traitement et au post-traitement pour chaque méthode (@setUp et @tearDown)

Test.java


public class classSample {
	@ClassRule
	public static WebDriverRule dr = new WebDriverRule();

	@Test
	public void test(){
		WebDriver d = dr.getDriver();
		d.get("https://www.google.co.jp/");
		WebElement el = d.findElement(By.cssSelector("input[aria-label='Chercher']"));
		el.sendKeys("chrome test.");
	}
}

Comparaison

QS_20170513-195323.png Implémentation avec @ClassRule sur la face supérieure et @Rule sur la face inférieure. Les deux tests sont identiques. Dans la classe de test réalisée avec l'échantillon, il y a une différence d'environ 10 secondes. Dans le cas de ClassRule, le navigateur est lancé uniquement pour la première méthode de test, donc plus il y a de méthodes de test, plus il est efficace. Dans l'environnement de test, il a fallu environ 5 secondes pour démarrer le navigateur.

Résumé

Cela dépend de la cible du test, mais le redémarrage du navigateur pour chaque méthode de test est souvent excessif, il est donc préférable de le faire. Cependant, il est difficile de le remarquer même si une dépendance est créée entre les méthodes de test (comme des informations restant dans le cookie et se déplaçant accidentellement), alors soyez prudent.

Recommended Posts

Accélérez le temps d'exécution de Selenium avec l'annotation ClassRule de JUnit
Le test JUnit 5 Gradle génère une erreur avec l'annotation Lombok