2013-12-09 17 views
7

Tôi muốn sử dụng lại một số thử nghiệm tích hợp cho mục đích thử tải. Tôi thực hiện một quy tắc được tham số hóa bằng cách chú thích:Song song việc thực thi thử nghiệm trong một @Rule

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Parallel { 

    int invocations() default 1; 

    int rampUpTime() default 0; 
} 

Thực hiện quy tắc của tôi chú thích được đánh giá và một tuyên bố được thiết lập, trong đó có một phương pháp đánh giá như thế:

@Override 
public void evaluate() throws Throwable { 
    ScheduledExecutorService exe = Executors.newScheduledThreadPool(invocations); 

    for (int i = 0; i < invocations; i++) { 
     ScheduledFuture<?> scheduledFuture = exe.schedule(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        invocated++; 

        // Request test = Request.method(description.getTestClass(), description.getMethodName()); 
        // new JUnitCore().run(test); 

        statement.evaluate(); 
       } catch (Throwable e) { 
        e.printStackTrace(); 
       } 
      } 
     }, i * rampUpTime, this.timeUnit); 
     futures.add(scheduledFuture); 
    } 
} 

Vì vậy, cuộc gọi evaluate được gói trong một số Runnable() và được lên lịch như được mô tả trong chú thích. Điều này là: Trong quy tắc của tôi, chỉ có lịch trình diễn ra, người chạy không biết (hoặc quan tâm) về tất cả các runables mà chỉ chạy miễn là cần thiết để thiết lập toàn bộ bộ thử nghiệm. Vì vậy, tôi đang cố gắng để thêm các cuộc gọi đến evalute() để thử nghiệm Á hậu. Thử đầu tiên là sử dụng JUnitCore.run(...) mà tất nhiên kết thúc trong một đệ quy.

Lần thử tiếp theo là thu thập tất cả các tương lai và chờ cho đến khi hoàn thành. Điều này làm việc tốt trên một cơ sở thử nghiệm, nhưng tôi muốn thực hiện một bộ thử nghiệm toàn bộ song song. Và trong báo cáo thử nghiệm của tôi, tôi chỉ thấy bài kiểm tra được thực hiện một lần. Vì vậy, sau đó tôi nghĩ rằng tôi sử dụng một bộ tham số với một ngữ cảnh (một đối tượng thu thập tất cả các tương lai từ tất cả các bài kiểm tra) như tham số, nhưng tôi đã không tìm thấy một cách để thúc đẩy đối tượng ngữ cảnh này để kiểm tra, mỗi bài kiểm tra phải có thông số riêng.

Tôi hiện đang yêu cầu một cách để thêm nhiều lần thực hiện từ quy tắc của tôi vào nhân tố thử nghiệm đang thực thi nó.

+0

'LoadTest' từ http://www.clarkware.com/software/JUnitPerf.html có thể giúp –

+1

Tại sao không sử dụng công cụ nhấn mạnh chuyên dụng? một cái gì đó như jMeter hoặc Gatling? – Chiron

+0

Tại sao không chỉ đơn giản là tái sử dụng các bài kiểm tra tích hợp hiện có? Tôi biết rằng có thể chạy thử nghiệm JUnit trong JMeter, nhưng nó rất đau đớn. Các bài kiểm tra tích hợp là các bài kiểm tra đơn vị Plugin Eclipse và nó có thể xây dựng ứng dụng với khung kiểm thử nhật thực bao gồm và sử dụng nó trong JMeter. – CodeSeavers

Trả lời

2

Nếu tôi hiểu chính xác bạn, bạn đang cố gắng kiểm soát hành vi thực hiện của nhân tố thử nghiệm. A TestRule có thể bị hạn chế để đạt được mục tiêu đó. Nhưng làm thế nào về viết Runner của riêng bạn kiểm soát dòng chảy thực hiện của bài kiểm tra đơn vị của bạn? Chỉ cần xem qua số ParentRunner of JUnit. Từ đó, bạn sẽ nhận được một ý tưởng khá tốt về cách lập lịch trình cơ bản hoạt động và có thể triển khai phiên bản org.junit.experimental.ParallelComputer của riêng bạn.

+0

Tôi sẽ làm điều đó. – CodeSeavers

Các vấn đề liên quan