Tìm hiểu về testNG framework (Phần 6)

17. Retry Failed Tests in TestNG

TestNG là một framework kiểm thử tuyệt vời. Nó cung cấp rất nhiều tính năng có thể giúp chúng ta tạo ra những frameworks mạnh mẽ và dễ bảo trì. Trong chương này, chúng ta sẽ học Làm thế nào để thử lại các phép thử không thành công trong TestNG.

Bạn phải thấy thất bại ngẫu nhiên trong quá trình chạy thử tự động. Những lỗi này có thể không nhất thiết là do lỗi sản phẩm. Những thất bại này có thể là do những lý do sau

*** Sự cố trình duyệt ngẫu nhiên hoặc trình duyệt trở nên không phản hồi

  • Các vấn đề máy ngẫu nhiên
  • Các sự cố máy chủ như sự chậm trễ bất ngờ trong phản hồi từ máy chủ**

Những thất bại này mang tính genuine và cần được điều tra, nhưng các lỗi này không nhất thiết là do lỗi trong sản phẩm. TestNG cung cấp một tính năng tuyệt vời bằng cách sử dụng mà bạn có thể thử lại một trường hợp kiểm thử nhiều lần trước khi tuyên bố nó là Failed. Điều đó có nghĩa là, nếu bạn nhìn thấy lỗi, chỉ có thể tự động chạy lại Testcase để chắc chắn rằng nó luôn bị lỗi. Bằng cách này, nó làm giảm Failed bị sai do những vấn đề ngẫu nhiên và bạn dành nhiều thời gian hơn để gỡ lỗi các lỗi thực.

Trong chương này chúng ta sẽ nghiên cứu làm thế nào chúng ta có thể thực hiện thử lại cơ chế thất bại trong TestNG. Để đạt được điều này, trước tiên chúng ta phải hiểu giao diện org.testng.IRetryAnalyzer. Định nghĩa giao diện là

public interface IRetryAnalyzer {

/**

  • Returns true if the test method has to be retried, false otherwise.
  • @param result The result of the test method that just ran.
  • @return true if the test method has to be retried, false otherwise. */ public boolean retry(ITestResult result); }

Giao diện này chỉ có một method public boolean retry(ITestResult result);

Method này sẽ được gọi khi method test bị failed. Bạn có thể lấy các chi tiết của bài kiểm thử từ ITestResult đầu vào đối số cho phương pháp này, như thể hiện trong định nghĩa phương pháp ở trên. Việc thực hiện phương pháp này phải return True nếu bạn muốn thực hiện lại phép thử không thành công và Fail nếu không muốn thực hiện lại phép thử. Thông thường việc thực hiện giao diện này quyết định xem có bao nhiêu lần để thử lại các bài kiểm thử không thành công dựa trên bộ đếm cố định hoặc logic phức tạp dựa trên yêu cầu của bạn. Một cài đặt đơn giản của giao diện này sẽ như thế này

package Tests;

import org.testng.IRetryAnalyzer; import org.testng.ITestResult;

public class RetryAnalyzer implements IRetryAnalyzer {

int counter = 0;
int retryLimit = 4;
/*
 * (non-Javadoc)
 * @see org.testng.IRetryAnalyzer#retry(org.testng.ITestResult)
 * 
 * This method decides how many times a test needs to be rerun.
 * TestNg will call this method every time a test fails. So we 
 * can put some code in here to decide when to rerun the test.
 * 
 * Note: This method will return true if a tests needs to be retried
 * and false it not.
 *
 */

@Override
public boolean retry(ITestResult result) {

	if(counter < retryLimit)
	{
		counter++;
		return true;
	}
	return false;
}

}

Bây giờ chúng ta có một thực hiện đơn giản của IRetryAnalyzer. Xem xét kỹ hơn việc thực hiện phương pháp thử lại, phương pháp này đảm bảo rằng một bài kiểm tra không thành công được thử lại 4 lần. Điều này là bởi vì chúng tôi đã chỉ định retryLimit = 4; Cho phép xem cách chúng ta có thể sử dụng nó, có hai cách để bao gồm thử lại các phân tích trong các xét nghiệm của bạn

1. Bằng cách chỉ định giá trị retryAnalyzer trong @Test annotation

2. Bằng cách thêm Retry analyzer trong thời gian chạy bằng cách thực hiện trên các giao diện Listener

Chỉ định thuộc tính retryAnalyzer trong chú thích @Test

Chúng ta có thể làm điều này bằng cách sử dụng cú pháp sau @Test (retryAnalyzer = "IRetryAnalyzer Implementing class"). Dưới đây là mã để làm điều đó

import org.testng.Assert; import org.testng.annotations.Test;

public class Test001 {

@Test(retryAnalyzer = Tests.RetryAnalyzer.class)
public void Test1()
{
	Assert.assertEquals(false, true);
}

@Test
public void Test2()
{
	Assert.assertEquals(false, true);
}

}

Nếu chúng tôi chạy thử nghiệm này, chúng tôi sẽ nhận được kết quả sau

Bạn có thể thấy rằng Test1 đã được chạy 4 lần và nó đã được đánh dấu chỉ thất bại ở lần chạy cuối cùng. Nó đã được chạy 4 lần bởi vì các phân tích thử lại. Tuy nhiên, nhìn vào Test2 chúng ta có thể thấy rằng nó chỉ chạy một lần. Điều này hiển nhiên vì chúng tôi không bao giờ chỉ định một thử lại cho Test2.

Cho phép xem xét cách thứ hai để thêm RetryAnalyzer vào thử nghiệm của bạn.

Chỉ định retryAnalyzer trong thời gian chạy

Trong trường hợp này bạn sẽ cần phải thực hiện giao diện ITestAnnotationTransformer. Giao diện ITestAnnotationTransformer thuộc loại rộng các giao diện được gọi là TestNG Listeners. Bạn có thể đọc về họ nhiều hơn ở đây. Định nghĩa giao diện này sẽ như sau public class AnnotationTransformer implements IAnnotationTransformer {

@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
	// TODO Auto-generated method stub
}

}

Giao diện này được sử dụng để thêm chú thích vào các phương pháp kiểm tra của bạn trong thời gian chạy. Phương pháp chuyển đổi được gọi là cho mỗi lần kiểm tra trong quá trình chạy thử. Một sự thực hiện đơn giản của giao diện này có thể giúp chúng tôi thiết lập lại phân tích như thế này package Tests;

import java.lang.reflect.Constructor; import java.lang.reflect.Method;

import org.testng.IAnnotationTransformer; import org.testng.annotations.ITestAnnotation;

public class AnnotationTransformer implements IAnnotationTransformer {

@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
	annotation.setRetryAnalyzer(RetryAnalyzer.class);
}

}

Một khi chúng ta đã thực hiện IAnnotationTransformer, chúng ta chỉ cần thêm nó như là một người nghe trong chạy testng xml. Như thế này

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="RetryFailedTests" verbose="1" > <listeners> <listener class-name="Tests.AnnotationTransformer"/> </listeners> <test name="RetryMulitple"> <classes> <class name="Tests.Test001"/> </classes> </test> </suite>

Bây giờ chúng ta không phải chỉ định thuộc tính retryAnalyzer trong @Test annotation. Các bài kiểm tra được cập nhật sẽ như thế này package Tests;

import org.testng.Assert; import org.testng.annotations.Test;

public class Test001 {

@Test
public void Test1()
{
	Assert.assertEquals(false, true);
}

@Test
public void Test2()
{
	Assert.assertEquals(false, true);
}

}

Bây giờ bạn có thể chạy thử nghiệm và xem cả hai Test1 và Test2 được thực hiện lại 4 lần mỗi lần bằng TestNG. Đây là khá nhiều về chủ đề này. Trong phần tiếp theo, chúng ta sẽ thấy cách chúng ta có thể sử dụng Chú thích Java tùy chỉnh để xác định giới hạn số lần thử lại trong bài kiểm tra trực tiếp.

18. Implement IRetryAnalyzer to Retry Failed Test in TestNG Framework

Trong bài đăng trước đây của chúng tôi về Retry Failed tests in TestNG chúng tôi đã thảo luận về IRetryAnalyzer Interface và nhiều cách khác nhau trong đó chúng tôi có thể chỉ định Retry Analyzer cho một bài kiểm tra. Trong bài này, chúng ta sẽ xem xét Làm thế nào để Thực hiện IRetryAnalyzer để Retry Failed tests in TestNG Framework theo cách thiết kế có ý thức nhất, để chúng ta có thể kiểm tra các bài kiểm tra có thể duy trì và dễ dàng. Bài viết này sẽ yêu cầu bạn phải có một sự hiểu biết tốt về Java Annotations. Chúng tôi sẽ tạo một chú thích tùy chỉnh mà chúng tôi sẽ sử dụng trên @ Test Method để chúng tôi có thể chỉ định lại số lần thử lại trực tiếp trong Kiểm thử

Giả sử rằng bạn đã đi qua các bài viết được liên kết đã có. Cần phải hiểu những gì được viết ở đây.

1) Các bước để tạo chú thích Java Annotation

Điều đầu tiên chúng ta phải làm là tạo ra một Java annotation mà chúng ta sẽ chú thích phương pháp thử nghiệm của chúng ta. Cho phép nói tên của chú thích là RetryCountIfFailed. Chú thích này là một chú thích Java thuần túy. Đây là mã để làm điều đó

package CustomAnnotations;

import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME) public @interface RetryCountIfFailed {

// Specify how many times you want to 
// retry the test if failed.
// Default value of retry count is 0
int value() default 0;

} Bạn có thể thấy rằng chỉ có một biến "value" bên trong RetryCountIfFailed annnotation. Giá trị này chỉ định bao nhiêu lần một bài kiểm tra cần phải được thực hiện lại trong trường hợp hỏng hóc. Lưu ý rằng giá trị mặc định được đặt là 0. Ngoài ra, một điểm quan trọng cần chú ý là một chú thích thời gian chạy. Do đó chúng tôi đã xác định

@Retention(RetentionPolicy.RUNTIME)

2) Bước sử dụng Java Annotation được tạo trong TestNG Automation Test

package Tests;

import org.testng.Assert; import org.testng.annotations.Test;

import CustomAnnotations.RetryCountIfFailed;

public class Test001 {

@Test
@RetryCountIfFailed(10)
public void Test1()
{
	Assert.assertEquals(false, true);
}

@Test
public void Test2()
{
	Assert.assertEquals(false, true);
}

}

Chú ý đến cách sử dụng RetryCountIfFailed Annotation. Trước tiên, nó được sử dụng giống như bất kỳ chú thích nào khác bằng cách sử dụng @ ở phía trước tên (@RetryCountIfFailed). Thứ hai, giá trị số được chuyển đến chú thích xác định số lần thử nghiệm không thành công phải được chạy lại. Vì vậy, cách sử dụng thực tế của chú thích trở thành @RetryCountIfFailed (5), trong đó 5 là số lần bạn muốn thử nghiệm này được chạy lại trong trường hợp thất bại. Giá trị này có thể là giá trị Integer.

3) Thực hiện IRetryAnalyzer để thử lại Failed Test trong TestNG Framework

Với chú thích này đang được sử dụng trong các bài kiểm tra của nó thời gian để cập nhật việc thực hiện giao diện IRetryAnalyzer. Có hai điều chúng ta sẽ cần làm sau khi gọi tới IRetryAnalyzer :: retry method xuất hiện

1. Kiểm tra xemTest method mà thử lại được gọi có chú thích RetryCountIfFailed 2. Sau đó so sánh thử lại hiện tại với giá trị của chú thích này. Đây là việc thực hiện mới của lớp RetryAnalyzer package Listeners;

import org.testng.IRetryAnalyzer; import org.testng.ITestResult;

import CustomAnnotations.RetryCountIfFailed;

public class RetryAnalyzer implements IRetryAnalyzer {

int counter = 0;
/*
 * (non-Javadoc)
 * 
 * @see org.testng.IRetryAnalyzer#retry(org.testng.ITestResult)
 * 
 * This method decides how many times a test needs to be rerun. TestNg will
 * call this method every time a test fails. So we can put some code in here
 * to decide when to rerun the test.
 * 
 * Note: This method will return true if a tests needs to be retried and
 * false it not.
 *
 */

@Override
public boolean retry(ITestResult result) {

	// check if the test method had RetryCountIfFailed annotation
	RetryCountIfFailed annotation = result.getMethod().getConstructorOrMethod().getMethod()
			.getAnnotation(RetryCountIfFailed.class);
	// based on the value of annotation see if test needs to be rerun
	if((annotation != null) && (counter < annotation.value()))
	{
		counter++;
		return true;
	}
	return false;
}

}

Quyết định này được thực hiện dựa trên số lượng được chỉ định trong chú thích RetryCountIfFailed. Phần còn lại của mã vẫn như đã được giải thích trong bài trước. Bây giờ cho phép xem bao nhiêu lần Test1 và Test2 được chạy

Ở đây bạn có thể thấy Test1 chạy 10 lần và Test2 chỉ chạy một lần. Tôi hy vọng tôi đã có thể giải thích chi tiết chủ đề này.

Các phần đã tìm hiểu trước đây:

https://viblo.asia/p/tim-hieu-ve-testng-framework-phan-1-aWj53Vyol6m https://viblo.asia/p/tim-hieu-ve-testng-framework-phan-2-gGJ59X6PlX2 https://viblo.asia/p/tim-hieu-ve-testng-framework-phan-3-1VgZvByYZAw https://viblo.asia/p/tim-hieu-ve-testng-framework-phan-4-YWOZreG7KQ0 https://viblo.asia/p/tim-hieu-ve-testng-framework-phan-5-eW65G2q6lDO

Nguồn bài dịch: http://toolsqa.com/selenium-webdriver/testng-multi-browser-cross-browser/


All Rights Reserved