2012-04-27 33 views
5

Tôi có ứng dụng web JPA/Hibernate/Spring/Tomcat với bộ nhớ cache dữ liệu cấp thứ hai được bật vì lý do hiệu suất. Và bộ nhớ cache hoạt động rất tốt!Bộ nhớ cache dữ liệu cấp 2 Hibernate và thử nghiệm tích hợp/chấp nhận

Tôi cũng có bộ kiểm tra Dưa chuột để thêm dữ liệu thử nghiệm trực tiếp vào cơ sở dữ liệu của ứng dụng và sau đó thực hiện một số bước Selenium. Tất nhiên nó không thành công vì ứng dụng không nhìn thấy các bản cập nhật vì bộ nhớ cache cấp 2. Tôi biết tôi có thể xây dựng đặc biệt để thử nghiệm với bộ nhớ cache bị vô hiệu hóa (bằng cách chuyển một số thuộc tính boolean cho Maven lọc hoặc tương tự) Nhưng có rất nhiều thực thể được chú thích @Cache để vô hiệu hóa bộ nhớ cache làm cho ứng dụng bị lỗi ngoại lệ "Thứ hai bộ nhớ cache mức không được kích hoạt ".

Một cách tiếp cận khác có thể là sử dụng tính năng truy cập từ xa ehcache để xóa bộ nhớ cache hoặc định cấu hình bộ nhớ cache với thời gian đối tượng bằng 0 hoặc tương tự.

Tôi cũng có thể tạo dữ liệu thử nghiệm bằng cách sử dụng giao diện người dùng ứng dụng nhưng điều này làm tăng thêm sự phức tạp không cần thiết đối với các trường hợp thử nghiệm.

Ai có thể chia sẻ cách tiếp cận của họ với các ứng dụng thử nghiệm tích hợp với bộ nhớ cache dữ liệu cấp 2 được bật không?

Trả lời

0

Vì bạn đang nói về các bài kiểm tra chức năng thông qua Selenium, bạn nên xem xét ứng dụng của mình dưới dạng hộp đen và kiểm tra nó là Selenium thực sự là Người dùng. Vì vậy, bạn cần truyền dữ liệu qua giao diện web và sau đó kiểm tra cách ứng dụng xử lý nó và hiển thị nó sau đó.

Thay thế cho các bài kiểm tra chức năng trên toàn ứng dụng như vậy sẽ là Phát triển theo hướng hành vi với các bài kiểm tra cho các thành phần khác nhau. Thành phần ở đây là một số dòng chảy bắt đầu từ bộ điều khiển của bạn kết thúc với DAO (thường DAO được chế nhạo trong các bài kiểm tra như vậy mà làm cho họ vượt qua rất nhanh, nhưng không kiểm tra làm việc với cơ sở dữ liệu). Trong trường hợp này, bạn có một bộ kiểm tra môi trường đầy đủ và một bộ kiểm tra BDD lớn.

+0

Không phải tất cả, nhưng một số thử nghiệm BDD của tôi có các bước sau: tạo dữ liệu kiểm tra, thực hiện các thao tác selen, dọn dẹp. Đồng ý với hộp màu đen, nhưng việc tạo và làm sạch dữ liệu bằng giao diện người dùng đôi khi rất khó và có thể thực hiện các kiểm tra phụ thuộc vào nhau (nếu giao diện người dùng liên quan đến tiết kiệm bị hỏng, tất cả các thử nghiệm khác cần lưu trữ cũng bị hỏng) – ike3

+0

Có, các bài kiểm tra phụ thuộc sẽ thất bại, nhưng mục đích chính - một điều gì đó không thành công, được đáp ứng. Và nếu bạn điền trực tiếp dữ liệu vào DB, thì đây không phải là một bài kiểm tra chấp nhận, đây không phải là cách người dùng cuối làm việc với ứng dụng. Và các xét nghiệm như vậy ít nhiều là hạt thô. Nếu bạn cần nhiều hạt mịn hơn, đây có thể là một nơi tồi tệ cho Selenium. –

0

Tôi đã có một yêu cầu thực hiện chỉ đọc bộ nhớ đệm cho vài hạt cà phê như nước, khu vực vv ..

Để kiểm tra xem họ có thực sự bị lưu trữ Tôi đã viết một bài kiểm tra hội nhập với việc sử dụng lò xo. Bài kiểm tra không đúng, nó chỉ là sự xác minh những gì tôi muốn. Bạn có thể sử dụng điều này như một gợi ý và thực hiện của riêng bạn.

Bạn có thể đọc here để biết bài viết về cách viết bài kiểm tra tích hợp bằng cách sử dụng mùa xuân.

@Configurable(autowire = Autowire.BY_NAME) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
public class HibernateCachingTestIntg { 

    @Autowired 
    private ConfigurationDAO configurationDAO; 

    @Autowired 
    private CountryDAO countryDAO; 

    @Test 
    public void testGetCountries() { 
     for (int i = 0; i < 5; i++) { 
      StopWatch sw = new StopWatch("C"); 
      sw.start(); 
      countryDAO.listCountries(); 
      sw.stop(); 
      System.out.println(sw); 
     } 

    } 

    @Test 
    public void testGetRegionList() { 

     for (int i = 0; i < 5; i++) { 
      StopWatch sw = new StopWatch("R"); 
      sw.start(); 
      configurationDAO.getRegionList(); 
      sw.stop(); 
      System.out.println(sw); 
     } 

    } 
} 

Và đây là kết quả: -

StopWatch 'C': running time (millis) = 217; [] took 217 = 100% 
StopWatch 'C': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'C': running time (millis) = 16; [] took 16 = 100% 
StopWatch 'C': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'C': running time (millis) = 16; [] took 16 = 100% 

StopWatch 'R': running time (millis) = 201; [] took 201 = 100% 
StopWatch 'R': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'R': running time (millis) = 0; [] took 0 = 0% 
StopWatch 'R': running time (millis) = 16; [] took 16 = 100% 
StopWatch 'R': running time (millis) = 15; [] took 15 = 100% 

Như bạn có thể thấy ở đây, các truy vấn mất nhiều thời gian để thực hiện lần đầu tiên và bạt thời gian ít hơn. Nếu bạn bật trình ghi nhật ký truy vấn, bạn có thể thấy rằng SQL chỉ được kích hoạt lần đầu tiên.

+0

Cảm ơn. Spring-test hoạt động tốt vì nó hoạt động trong một bối cảnh liên tục duy nhất nhưng các phép thử nghiệm chấp nhận chèn dữ liệu vào trong một ngữ cảnh riêng biệt. Mục đích của tôi là kiểm tra logic chức năng với một số thực thể được lưu trong bộ nhớ đọc không phải là bộ nhớ cache – ike3

0

Mặc dù thực hiện kiểm tra chấp nhận độc lập trên DB là thích hợp hơn, nó đòi hỏi quá nhiều viết lại vì vậy hiện tại tôi đã quyết định chỉ tạo các triển khai rất đơn giản của các giao diện org.hibernate.cache.Cache và org.hibernate.cache.CacheProvider không thực hiện gì và hoạt động như một bộ nhớ cache luôn trống.

Công cụ thử nghiệm thay thế bộ nhớ cache thực bằng bộ nhớ cache mới này làm cho cả chú thích ngủ đông và các bước BDD đều hài lòng.

1

Nếu bạn cần kiểm tra bộ nhớ cache cấp thứ hai với kiểm tra đơn vị, bạn phải chắc chắn đóng phiên và mở mỗi lần bạn gọi phương thức dao. Nếu không, bạn sẽ sử dụng bộ đệm mức đầu tiên chỉ tồn tại trong phạm vi của một phiên làm việc ngủ đông hiện tại.

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