Thứ tự thực hiện các bài kiểm tra trong TestNG


76

Làm cách nào để tùy chỉnh thứ tự thực hiện các bài kiểm tra trong TestNG?

Ví dụ:

public class Test1 {
  @Test
  public void test1() {
      System.out.println("test1");
  }

  @Test
  public void test2() {
      System.out.println("test2");
  }

  @Test
  public void test3() {
      System.out.println("test3");
  }
}

Trong bộ phần mềm trên, thứ tự thực hiện các bài kiểm tra là tùy ý. Đối với một lần thực thi, đầu ra có thể là:

test1
test3
test2

Làm cách nào để thực hiện các bài kiểm tra theo thứ tự mà chúng đã được viết?

Câu trả lời:


84

Điều này sẽ hoạt động.

@Test(priority=1)
public void Test1() {

}

@Test(priority=2)
public void Test2() {

}

@Test(priority=3)
public void Test3() {

}

prioritykhuyến khích lệnh thực hiện nhưng không đảm bảo mức độ ưu tiên trước đó đã hoàn thành. test3có thể bắt đầu trước khi test2hoàn thành. Nếu cần đảm bảo thì hãy khai báo phụ thuộc.

Không giống như các giải pháp khai báo phụ thuộc, các bài kiểm tra sử dụng prioritysẽ thực thi ngay cả khi một bài kiểm tra không thành công. Vấn đề này với các phụ thuộc có thể được giải quyết @Test(...alwaysRun = true...)theo tài liệu .


65

Trong TestNG, bạn sử dụng dependOnMethods và / hoặc dependOnGroups:

@Test(groups = "a")
public void f1() {}

@Test(groups = "a")
public void f2() {}

@Test(dependsOnGroups = "a")
public void g() {}

Trong trường hợp này, g () sẽ chỉ chạy sau khi f1 () và f2 () đã hoàn thành và thành công.

Bạn sẽ tìm thấy rất nhiều ví dụ trong tài liệu: http://testng.org/doc/documentation-main.html#test-groups


Tuy nhiên, giải pháp của Cedric có một số hạn chế khi làm việc với Plugin TestNG Eclipse, phiên bản. 5.9.0.4 vì nó bắt đầu mỗi lần chạy TestCase hiển thị thông báo rằng các nhóm không được hỗ trợ bởi plugin này.
honzajde

2
dependsOnGroupscực kỳ hữu ích nhưng đối với tôi dường như TestNG đang bỏ qua prioritykhi cả hai được kết hợp với nhau.
G. Demecki

29

Để giải quyết tình huống cụ thể được đề cập:

@Test
public void Test1() {

}

@Test (dependsOnMethods={"Test1"})
public void Test2() {

}

@Test (dependsOnMethods={"Test2"})
public void Test3() {

}

7

Nếu bạn không muốn sử dụng @Test(priority = )tùy chọn trong TestNG, bạn có thể sử dụng thư viện javaassist và TestNG IMethodInterceptorđể ưu tiên các bài kiểm tra theo thứ tự mà các phương pháp kiểm tra được xác định trong lớp kiểm tra. Điều này dựa trên giải pháp được cung cấp ở đây .

Thêm người nghe này vào lớp thử nghiệm của bạn:

package cs.jacob.listeners;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;

public class PriorityInterceptor implements IMethodInterceptor {
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {

    Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
        private int getLineNo(IMethodInstance mi) {
        int result = 0;

        String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName();
        String className  = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName();
        ClassPool pool    = ClassPool.getDefault();

        try {
            CtClass cc        = pool.get(className);
            CtMethod ctMethod = cc.getDeclaredMethod(methodName);
            result            = ctMethod.getMethodInfo().getLineNumber(0);
        } catch (NotFoundException e) {
            e.printStackTrace();
        }

        return result;
        }

        public int compare(IMethodInstance m1, IMethodInstance m2) {
        return getLineNo(m1) - getLineNo(m2);
        }
    };

    IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
    Arrays.sort(array, comparator);
    return Arrays.asList(array);
    }
}

Điều này về cơ bản tìm ra số dòng của các phương thức và sắp xếp chúng theo thứ tự tăng dần của số dòng của chúng, tức là thứ tự mà chúng được xác định trong lớp.


1
Đây là giải pháp thực sự nếu bạn phải di chuyển hàng trăm bài kiểm tra từ
sáu

Điều này giải quyết vấn đề bảo toàn thứ tự trong trường hợp khi bạn không sử dụng cờ phụ thuộc trong mã.
Ankit Gupta

7

Dùng cái này:

public class TestNG
{
        @BeforeTest
        public void setUp() 
        {
                   /*--Initialize broowsers--*/

        }

        @Test(priority=0)
        public void Login() 
        {

        }

        @Test(priority=2)
        public void Logout() 
        {

        }

        @AfterTest
        public void tearDown() 
        {
                //--Close driver--//

        }

}

Thông thường TestNG cung cấp số lượng chú thích, Chúng tôi có thể sử dụng @BeforeSuite, @BeforeTest, @BeforeClass để khởi tạo trình duyệt / thiết lập.

Chúng tôi có thể chỉ định mức độ ưu tiên nếu bạn đã viết số lượng trường hợp thử nghiệm trong tập lệnh của mình và muốn thực thi theo mức độ ưu tiên được chỉ định, sau đó sử dụng: @Test(priority=0) bắt đầu từ 0,1,2,3 ....

Trong khi đó, chúng tôi có thể nhóm số lượng trường hợp kiểm thử và thực thi nó bằng cách nhóm. vì điều đó chúng tôi sẽ sử dụng@Test(Groups='Regression')

Cuối cùng, giống như đóng các trình duyệt, chúng ta có thể sử dụng @AfterTest, @AfterSuite, @AfterClasschú thích.


6
@Test(dependsOnMethods="someBloodyMethod")

3
Tôi có thể chỉ ra rằng đây không phải là một câu trả lời đặc biệt hữu ích - Tôi khuyên bạn nên mở rộng câu trả lời của bạn một cách chi tiết hơn một chút!

4

Nếu tôi hiểu câu hỏi của bạn một cách chính xác ở chỗ bạn muốn chạy các bài kiểm tra theo thứ tự được chỉ định, thì có thể sử dụng TestNG IMethodInterceptor. Hãy xem http://beust.com/weblog2/archives/000479.html về cách tận dụng chúng.

Nếu bạn muốn chạy một số preinitialization, hãy xem IHookable http://testng.org/javadoc/org/testng/IHookable.html và chuỗi liên kết http://groups.google.com/group/testng-users/browse_thread/ thread / 42596505990e8484 / 3923db2f127a9a9c? lnk = gst & q = IHookable # 3923db2f127a9a9c


2

Piggy ủng hộ câu trả lời của người dùng1927494, Trong trường hợp bạn muốn chạy một thử nghiệm trước tất cả những người khác, bạn có thể thực hiện điều này:

@Test()
public void testOrderDoesntMatter_1() {
}

@Test(priority=-1)
public void testToRunFirst() {
}

@Test()
public void testOrderDoesntMatter_2() {
}

2

Bằng cách chỉ định các phương pháp kiểm tra được thực thi trong testNg.xml, chúng ta có thể thực thi các trường hợp kiểm thử theo thứ tự mong muốn

<suite>
<test name="selenium1">
 		<classes>
			<class name="com.test.SeleniumTest" >
			    <methods><include name="methodB"></include>
			        <include name="methodA"></include>
			    </methods>    
			 </class>
		</classes>
 
	</test>
</suite>


1

Bằng cách sử dụng tham số ưu tiên cho @Test, chúng tôi có thể kiểm soát thứ tự thực hiện kiểm tra.


2
Rất tiếc là không có trong TestNG.
Mariusz Jamro

@MariuszJamro Tôi không hiểu tại sao? Prioritytham số vẫn chưa tồn tại trong năm 2012?
G. Demecki

1

Thứ tự của các phương thức trong tệp lớp là không thể đoán trước, vì vậy bạn cần phải sử dụng các phụ thuộc hoặc bao gồm các phương thức của mình một cách rõ ràng trong XML.

Theo mặc định, TestNG sẽ chạy các bài kiểm tra của bạn theo thứ tự chúng được tìm thấy trong tệp XML. Nếu bạn muốn các lớp và phương thức được liệt kê trong tệp này được chạy theo thứ tự không thể xác định được, hãy đặt thuộc tính trật tự bảo tồn thành false


1

Tôi đã gặp phải vấn đề tương tự, lý do có thể là do thực thi song song testng và giải pháp là thêm tùy chọn Ưu tiên hoặc chỉ cần cập nhật keep-order = "true" trong testng.xml của bạn.

<test name="Firefox Test" preserve-order="true">

1
Keep-order = "true", là mặc định trong testng.xml và nó chỉ hoạt động cho thứ tự bạn đã xác định trong testng.xml, vì vậy giải pháp cho vấn đề của bạn chỉ thêm ưu tiên vào @Tests
Kiran

1

Một câu trả lời với một lời giải thích quan trọng:

Có hai tham số của " TestNG " được cho là để xác định thứ tự thực hiện các bài kiểm tra:

@Test(dependsOnGroups= "someGroup")

Và:

@Test(dependsOnMethods= "someMethod")

Trong cả hai trường hợp, các hàm này sẽ phụ thuộc vào phương pháp hoặc nhóm,

Nhưng sự khác biệt:

Trong trường hợp này:

@Test(dependsOnGroups= "someGroup")

Phương thức sẽ phụ thuộc vào toàn bộ nhóm, vì vậy không nhất thiết là ngay sau khi thực thi hàm phụ thuộc, phương thức này cũng sẽ được thực thi, nhưng nó có thể xảy ra sau đó trong quá trình chạy và thậm chí sau khi các thử nghiệm khác chạy.

Điều quan trọng cần lưu ý là trong trường hợp và có nhiều hơn một lần sử dụng trong cùng một bộ thử nghiệm trong tham số này, thì đây là một công thức an toàn cho các vấn đề, bởi vì các phương thức phụ thuộc của toàn bộ bộ thử nghiệm sẽ chạy trước và chỉ sau đó các phương pháp phụ thuộc vào chúng.

Tuy nhiên, trong trường hợp này:

@Test(dependsOnMethods= "someMethod")

Ngay cả khi tham số này được sử dụng nhiều lần trong cùng một tập hợp các thử nghiệm, thì phương thức phụ thuộc sẽ vẫn được thực thi sau khi phương thức phụ thuộc được thực thi ngay lập tức.

Hy vọng nó rõ ràng và giúp đỡ.


0

Có nhiều cách để thực hiện các bài kiểm tra theo một thứ tự nhất định. Mặc dù vậy, thông thường, các bài kiểm tra phải được lặp lại và độc lập để đảm bảo nó chỉ đang kiểm tra chức năng mong muốn và không phụ thuộc vào các tác dụng phụ của mã bên ngoài những gì đang được kiểm tra.

Vì vậy, để trả lời câu hỏi của bạn, bạn sẽ cần cung cấp thêm thông tin, chẳng hạn như TẠI SAO điều quan trọng là phải chạy thử nghiệm theo một thứ tự cụ thể.


19
Có nhiều tình huống mà các phụ thuộc rất hữu ích, đặc biệt là để tích hợp và kiểm tra chức năng. Ví dụ: kiểm tra một trang web: bạn muốn kiểm tra trang đăng nhập trước, rồi đến trang tiếp theo, v.v ... Việc xóa và tạo lại trạng thái từ đầu là không thực tế và dẫn đến kiểm tra rất chậm. Ngoài ra, các phần phụ thuộc cung cấp cho bạn chẩn đoán tốt hơn nhiều, chẳng hạn như "1 lần kiểm tra không thành công, 99 lần kiểm tra bị bỏ qua" thay vì "100 lần kiểm tra không thành công" truyền thống không giúp nhận ra rằng tất cả những lỗi này thực sự là do một lần kiểm tra không thành công.
Cedric Beust

0

Trong trường hợp bạn dependsOnMethodstình cờ sử dụng những thứ khác như , bạn có thể muốn xác định toàn bộ luồng @Test trong tệp testng.xml của mình. AFAIK, thứ tự được xác định trong tệp XML bộ của bạn (testng.xml) sẽ ghi đè tất cả các chiến lược đặt hàng khác.


0

sử dụng: keep-order = "true" enable = "true" sẽ chạy các trường hợp thử nghiệm theo cách bạn đã viết.

<suite name="Sanity" verbose="1" parallel="" thread-count="">   
<test name="Automation" preserve-order="true"  enabled="true">
        <listeners>
            <listener class-name="com.yourtest.testNgListner.RetryListener" />
        </listeners>
        <parameter name="BrowserName" value="chrome" />
        <classes>
            <class name="com.yourtest.Suites.InitilizeClass" />
            <class name="com.yourtest.Suites.SurveyTestCases" />
            <methods>
                <include name="valid_Login" />
                <include name="verifyManageSurveyPage" />
                <include name="verifySurveyDesignerPage" />
                <include name="cloneAndDeleteSurvey" />
                <include name="createAndDelete_Responses" />
                <include name="previewSurvey" />
                <include name="verifySurveyLink" />
                <include name="verifySurveyResponses" />
                <include name="verifySurveyReports" />
            </methods>
        </classes>
    </test>
</suite>

-5

Kiểm tra giống như kiểm tra đơn vị? Để làm gì? Các bài kiểm tra PHẢI độc lập, nếu không .... bạn không thể chạy một bài kiểm tra riêng lẻ. Nếu họ độc lập, tại sao lại can thiệp? Thêm vào đó - "đơn hàng" là gì nếu bạn chạy chúng trong nhiều luồng trên nhiều lõi?


2
Thực sự có thể kết hợp các yếu tố phụ thuộc và song song, hãy xem bài viết này để tìm hiểu cách TestNG thực hiện: beust.com/weblog/2009/11/28/hard-core-multicore-with-testng
Cedric Beust

Mọi người sử dụng JUnit cho rất nhiều thứ ngoài Unit test. Hầu như tất cả những mục đích sử dụng bổ sung đó đều có những lúc bạn cần làm những việc theo một trình tự cụ thể. Đây là một trong những lý do chính để phát triển TestNG, BTW.
Jeffiekins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.