2012-04-19 24 views
7

Chúng tôi đang chuyển từ sử dụng TestNG với JBoss nhúng để sử dụng Arquillian bằng máy chủ từ xa.@BeforeClass chú thích gọi phương thức hai lần khi sử dụng Arquillian trên máy chủ từ xa

Chúng tôi đang chạy thử nghiệm đơn giản có phương thức được chú thích bằng @BeforeClass thực hiện một số thiết lập thử nghiệm. Sau nhiều lần đào, có vẻ như phương thức thiết lập đang được gọi hai lần: một lần trên bàn điều khiển nơi chúng tôi đang thực hiện lệnh Maven của chúng tôi để chạy thử nghiệm và một lần nữa khi cuộc thử nghiệm được triển khai đến máy chủ từ xa của chúng tôi và chạy thử nghiệm. Đây là hai JVMS riêng biệt - một chạy bên ngoài vùng chứa và một JVM khác đang chạy bên trong vùng chứa. Sở thích của tôi là chỉ chạy sau.

Đây có phải là hành vi tôi nên mong đợi hoặc có điều gì đó mà tôi có thể bị thiếu không?

Hiện tại, chúng tôi đang thực sự kiểm tra xem chúng tôi có đang ở trong vùng chứa hay không và, nếu có, chúng tôi sẽ chạy mã thiết lập của chúng tôi. Điều này làm việc nhưng tôi muốn biết nếu có một cách tốt hơn.

Một số đoạn mã của chúng tôi (hãy bỏ qua sự đơn giản của mã và thực tế là phương pháp setupComponents thực sự không cần thiết ở đây, có nhiều thử nghiệm phức tạp hơn mà chúng tôi đang di chuyển cần có chức năng này):

public class BaseTest extends Arquillian 
{ 
    private static Log log = LogFactory.getLog(SeamTest.class); 

    @Deployment 
    public static Archive<?> createDeployment() 
    { 
     // snip... basically, we create a test war here 
    } 

    /** 
    * todo - there might be a better way to do this 
    */ 
    private boolean runningInContainer() 
    { 
     try 
     { 
      new InitialContext().lookup("java:comp/env"); 
      return true; 
     } 
     catch (NamingException ex) 
     { 
      return false; 
     } 
    } 

    @BeforeClass 
    public void setupOnce() throws Exception 
    { 
     getLog().debug("in setupOnce(): " + runningInContainer()); 
     if (runningInContainer()) 
     { 
      new ComponentTest() 
      { 
       protected void testComponents() throws Exception 
       { 
        setupComponents(); 
       } 
      }.run(); 
     } 
    } 

    public User createUser() 
    { 
     // ... 
    } 

    public Log getLog() 
    { 
     // snip... 
    } 

    public UserDao getUserDao() 
    { 
     // ... 
    } 

    public abstract class ComponentTest 
    { 
     protected abstract void testComponents() throws Exception; 

     public void run() throws Exception 
     { 
      try { 
       testComponents(); 
      } finally { 

      } 
     } 
    } 

} 

public class UserDaoTest extends BaseTest 
{ 
    UserDao userDao; 

    @Override 
    protected void setupComponents() 
    { 
     getLog().debug("in setupComponents: " + runningInContainer()); 
     userDao = getUserDao(); 
    } 

    @Test 
    public void testGetUser() throws Exception 
    { 
     getLog().debug("in testGetUser: " + runningInContainer()); 

     new ComponentTest() 
     { 
      protected void testComponents() throws Exception 
      { 
       User user0 = createUser(); 
       user0.setName("frank"); 

       userDao.merge(user0); 

       User retrievedUser = userDao.findByName("frank"); 
       assertNotNull(retrievedUser); 
      } 

     }.run(); 
    } 

} 

này về cơ bản mang lại cho tôi ra trông như thế này:

Từ giao diện điều khiển nơi mvn đang được thực hiện:

in setupOnce(): false 

Từ máy chủ jboss:

in setupOnce(): true 
in setupComponents: true 
in testGetUser: true 
+0

Tính đến bây giờ, '@ BeforeClass' có nghĩa là để chỉ chạy trên máy khách để kiểm tra Arquillian. Nhưng điều này trông giống như một lỗi. Xin vui lòng cập nhật câu hỏi này với mã của bạn? Lưu ý: [ARQ-351] (https://issues.jboss.org/browse/ARQ-351) sẽ mang lại sự kiểm soát để thực hiện các sự kiện vòng đời. –

+0

@VineetReynolds, mã rất đơn giản. Tôi sẽ đăng một đoạn. Nếu hành vi dự kiến ​​trong tương lai là chỉ có "@BeforeClass" chạy bên ngoài vùng chứa, làm cách nào tôi có thể chú thích phương thức sẽ khiến phương thức đó chạy trong vùng chứa nhưng trước tất cả các kiểm tra của lớp đó? –

+0

Ngoài ra, @VineetReynolds, nếu bạn muốn đăng câu trả lời thay vì nhận xét của mình và bao gồm giải pháp thay thế để bạn có thể nhận được tín dụng, vui lòng thực hiện. –

Trả lời

5

Đây là hành vi "mong đợi". Không thực sự tốt đẹp, nhưng đó là cách Arqullian hoạt động.

JUnit

  • @BeforeClass/@AfterClass chỉ được thực hiện trên clientside
  • Tình trạng của lớp thử nghiệm bị mất giữa @Test, trong chứa toàn bộ vòng đời được lặp lại cho mỗi bài kiểm tra
  • @Trước khi/@Sau khi được thực hiện tùy thuộc vào runmode (máy khách/máy chủ)

TestNG

  • mọi thứ đều chạy cả trên máy chủ và máy khách
+0

Sau bài đăng, về cơ bản đây là câu trả lời tôi nhận được từ nhóm Arquillian.Có một số vấn đề về Arquillian mở (tại thời điểm này) bao gồm: https://issues.jboss.org/browse/ARQ-567 https://issues.jboss.org/browse/ARQ-197 –

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