2008-11-12 32 views

Trả lời

12

JUnit hoạt động. Không có giới hạn nào hạn chế nó chỉ là kiểm tra đơn vị. Chúng tôi sử dụng JUnit, Maven và CruiseControl để thực hiện CI.

Có thể có các công cụ dành riêng cho thử nghiệm tích hợp, nhưng tôi cho rằng tính hữu dụng của chúng phụ thuộc vào loại thành phần hệ thống bạn đang tích hợp. JUnit sẽ làm việc tốt cho thử nghiệm loại UI không.

+1

Về "Không có giới hạn để hạn chế nó để trở thành các bài kiểm tra đơn vị duy nhất", xin vui lòng xem http://stackoverflow.com/questions/3144887/passing-junit -data-between-tests. Một số câu trả lời thú vị và gợi ý ở đó. – orbfish

0

Chắc chắn! Chúng tôi sử dụng kết hợp các nhiệm vụ JUnit, ANT để chạy chúng và Hudson để tiếp tục kiểm tra tích hợp. Làm việc như một say mê.

5

Khi sử dụng Maven để xây dựng một dự án, tôi đã có thêm chút may mắn với TestNG vì nó có các hoạt động @BeforeSuite@AfterSuite. Điều này rất hữu ích vì Maven sẽ không thực thi 'bài kiểm tra tích hợp sau' nếu bất kỳ kiểm tra tích hợp nào không thành công. Không phải là một vấn đề với Ant, vì vậy tôi chỉ sử dụng jUnit ra khỏi sở thích với nó.

Trong cả hai trường hợp, phân đoạn ra các bài kiểm tra như cả TestNG và jUnit đều hữu ích với các bài kiểm tra tích hợp.

1

Có, bạn có thể sử dụng junit để kiểm tra tích hợp, nhưng nó phụ thuộc vào loại thử nghiệm tích hợp bạn cần.

Kiểm tra một servlet:

  • thiết lập bối cảnh servlet và cấu hình
  • làm các xét nghiệm sử dụng yêu cầu servlet giả (Spring đã hỗ trợ cho điều này, nhưng bạn cũng có thể sử dụng EasyMock hoặc mocks của riêng bạn)

Kiểm tra một ứng dụng xuân:

  • sử dụng AbstractDependencyInjectionSpringCon textTìm hiểu cách thiết lập ngữ cảnh
  • kiểm tra các hạt có dây
  • cũng có các lớp con của AbstractDependencyInjectionSpringContextTests hỗ trợ xử lý giao dịch khi thử nghiệm với cơ sở dữ liệu.

Nhưng Junit tinh khiết có giới hạn của nó. Kiểm tra giao diện người dùng là một trường hợp điển hình. Bạn có thể sử dụng selen cho các ứng dụng web, soapui cho các dịch vụ web hoặc các công cụ thích hợp khác.

Nhưng bất cứ điều gì bạn sử dụng, nó sẽ có thể tích hợp nó trong xây dựng liên tục của bạn (kiểm soát hành trình, thành phố nhóm hoặc bất cứ điều gì).

+0

Xin chào, Bạn có thể tư vấn về nơi tôi có thể tìm thêm thông tin về việc sử dụng Spring để giả lập một servlet không? –

+1

@Ben: Spring hỗ trợ thử nghiệm một servlet với các yêu cầu servlet và các lớp đáp ứng, không phải để giả lập một servlet. –

2

Trong nghiên cứu của chúng tôi ở đây, giải pháp tích hợp kiểm tra của chúng tôi có ba phần chính:

  1. CruiseControl là nền tảng của phương pháp tích hợp liên tục của chúng tôi.
  2. Cấu hình CruiseControl của chúng tôi khởi động một bản dựng thử nhanh chóng trong vòng 3 phút sau khi đăng ký của bất kỳ ai đến Subversion. Các thử nghiệm xảy ra ở đây là "mọi thứ vẫn còn biên dịch?" và "làm các bài kiểm tra đơn vị tất cả vẫn vượt qua?". JUnit rõ ràng là người điều phối chính trong việc trả lời các câu hỏi thứ hai.
  3. Mỗi giờ, nó khởi chạy một bản dựng lớn hơn để xây dựng trợ giúp và trình cài đặt trực tuyến mà chúng tôi sử dụng trên các nền tảng triển khai khác nhau của chúng tôi. Bước này xác minh các câu hỏi lớn hơn về "chúng tôi vẫn có sản phẩm có thể triển khai cho mỗi nền tảng mục tiêu của chúng tôi không?"

Kết quả cuối cùng là hầu hết mọi người ở đây không bao giờ lo lắng về thử nghiệm tích hợp: nó chỉ xảy ra. Mặt khác, thử nghiệm đơn vị là ưu tiên của mọi người. JUnit giúp bạn dễ dàng xây dựng các bài kiểm tra, mặc dù các bài kiểm tra tốt sẽ luôn yêu cầu thời gian suy nghĩ và phát triển.

38

Tôi đã sử dụng JUnit để thực hiện nhiều thử nghiệm tích hợp. Kiểm thử tích hợp có thể, tất nhiên, có nghĩa là nhiều thứ khác nhau. Để kiểm tra tích hợp mức hệ thống hơn, tôi muốn cho phép các tập lệnh thúc đẩy quá trình thử nghiệm của tôi từ bên ngoài.

Dưới đây là một phương pháp hoạt động tốt đối với tôi cho các ứng dụng sử dụng http và cơ sở dữ liệu và tôi muốn xác minh toàn bộ stack:

  1. Sử dụng Hypersonic or H2 trong chế độ trong bộ nhớ như một sự thay thế cho cơ sở dữ liệu (tác phẩm này tốt nhất cho ORMs)
  2. Khởi tạo cơ sở dữ liệu trong @BeforeSuite hoặc tương đương (lần nữa: dễ nhất với ORM)
  3. Sử dụng Cầu cảng để khởi động máy chủ web đang xử lý.
  4. @Before mỗi bài kiểm tra, xóa cơ sở dữ liệu và khởi tạo với các dữ liệu cần thiết
  5. Sử dụng JWebUnit để thực hiện các yêu cầu HTTP hướng Jetty

này cho phép bạn kiểm tra tích hợp có thể chạy mà không cần bất kỳ thiết lập cơ sở dữ liệu hoặc máy chủ ứng dụng và thực hiện ngăn xếp từ http xuống. Vì nó không có phụ thuộc vào tài nguyên bên ngoài, nên thử nghiệm này chạy tốt trên máy chủ xây dựng.

Dưới đây một số mã tôi sử dụng:

@BeforeClass 
public static void startServer() throws Exception { 
    System.setProperty("hibernate.hbm2ddl.auto", "create"); 
    System.setProperty("hibernate.dialect", "..."); 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setJdbcUrl("jdbc:hsqldb:mem:mytest"); 
    new org.mortbay.jetty.plus.naming.Resource(
      "jdbc/primaryDs", dataSource); 


    Server server = new Server(0); 
    WebAppContext webAppContext = new WebAppContext("src/main/webapp", "/"); 
    server.addHandler(webAppContext); 
    server.start(); 
    webServerPort = server.getConnectors()[0].getLocalPort(); 
} 

// From JWebUnit 
private WebTestCase tester = new WebTestCase(); 

@Before 
public void createTestContext() { 
    tester.getTestContext().setBaseUrl("http://localhost:" + webServerPort + "/"); 
    dao.deleteAll(dao.find(Product.class)); 
    dao.flushChanges(); 
} 

@Test 
public void createNewProduct() throws Exception { 
    String productName = uniqueName("product"); 
    int price = 54222; 

    tester.beginAt("/products/new.html"); 
    tester.setTextField("productName", productName); 
    tester.setTextField("price", Integer.toString(price)); 
    tester.submit("Create"); 

    Collection<Product> products = dao.find(Product.class); 
    assertEquals(1, products.size()); 
    Product product = products.iterator().next(); 
    assertEquals(productName, product.getProductName()); 
    assertEquals(price, product.getPrice()); 
} 

Đối với những người muốn tìm hiểu thêm, tôi đã viết một article about Embedded Integration Tests with Jetty and JWebUnit trên Java.net.

+0

Trường "tester" trong mã ví dụ là gì? – Nicolai

+0

Nếu bạn đang thử nghiệm tích hợp với cơ sở dữ liệu của mình, bạn nên kiểm tra tích hợp với cơ sở dữ liệu đó chứ không phải thay thế. Nếu bạn đang thử nghiệm tích hợp với một số hệ thống khác, thì có nghĩa là sử dụng một cơ sở dữ liệu thay thế nếu điều đó làm giảm cơ hội cho các lỗi "sai". – kc2001

+0

@ kc2001 Đúng, thiết lập thử nghiệm của bạn càng thực tế, bạn càng có thể dựa vào các thử nghiệm của mình. Đối với tôi, bằng cách sử dụng một DB thay thế đã cảm thấy đủ (và nó nhanh hơn), nhưng sử dụng DB thực sự sẽ cung cấp cho sự tự tin cao hơn. –

0

Đề xuất tùy thuộc vào đơn đăng ký và mục tiêu của bạn.

Tôi đã viết các bài kiểm tra tích hợp trong JUnit, nhưng tôi cũng thấy mọi người sử dụng HtmlUnit (phần mở rộng JUnit), Selenium, Watir, Fit/Fitness và thậm chí cả các công cụ thương mại như WinRunner và Silk.

Vì vậy, hãy cho chúng tôi biết thêm một chút về tên miền của bạn và mục tiêu của các thử nghiệm của bạn và bạn có thể có được câu trả lời tốt hơn.

+0

Tôi hy vọng rằng tôi đã làm rõ câu hỏi. –

0

Có một phần mở rộng rất tốt cho JUnit được gọi là Jitr.

Jitr là một thử nghiệm tích hợp JUnit Runner và nó cho phép kiểm tra tích hợp ứng dụng web của bạn dễ dàng chạy với vùng chứa web nhẹ trong cùng một JVM như các thử nghiệm của bạn.

Xem trang web của họ để biết chi tiết: http://www.jitr.org/

0

Cập nhật cho năm 2012: Trong khi JUnit có thể được sử dụng (và lợi ích từ hỗ trợ CI) JWebUnit và Selenium dường như đang ăn lên MindShare Khảo thí Integration.

-1

Tôi nghĩ các thử nghiệm tự động hóa và tích hợp không hoạt động tốt với nhau. Vấn đề cơ bản là thiết lập môi trường trước mỗi lần kiểm tra. Cần thiết lập thử nghiệm kiểu tích hợp nhiều hơn.

những suy nghĩ của tôi về tự động hóa kiểm tra trên lớp tích hợp: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/

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