2011-12-10 32 views
14

Một số nguyên tắc/nguyên tắc tốt nhất cần làm theo những gì được đề xuất trên trang web dbunit thực tế, điều này có thể tăng tốc kiểm tra cũng như duy trì chúng? Tôi xin một số library like factory girl cho java, nhưng nó không giống như nó có thể vì gõ tĩnh.Thực hành tốt nhất của dbunit cho hiệu suất

Suy nghĩ hiện tại của tôi là có 1 bộ dữ liệu xml cho mỗi lớp thử nghiệm tại thời điểm này - có thể tôi chia sẻ một số trong số này và có thể tôi không. Trong khi một số dữ liệu thử nghiệm có thể được sao chép dữ liệu được sao chép, tôi thấy nó quá khó để duy trì bộ dữ liệu được chia sẻ qua 3000 bài kiểm tra đơn vị/tích hợp - và tôi có nhiều thời gian để đi.

Sẽ đánh giá cao bất kỳ nguyên tắc nào để theo dõi dẫn đến các thử nghiệm hoạt động tốt và dễ bảo trì.

+0

Câu hỏi đặt ra là về hiệu suất, nhưng mối quan tâm thực sự có vẻ là 'làm cho họ có thể duy trì'. IMHO, bạn nên tập trung hoàn toàn vào khả năng bảo trì và tăng hiệu suất thông qua việc tăng thêm sức mạnh tính toán. – Jayan

+2

Được cảnh báo rằng nếu bạn sử dụng nhiều bộ dữ liệu nhỏ với DBUnit, bạn có thể gặp phải sự cố khó chịu về các lỗi ngẫu nhiên. Tôi đã viết một [bài đăng blog giải thích lý do tại sao và cách làm việc xung quanh nó] (http://www.andrewspencer.net/2011/solve-foreign-key-problems-in-dbunit-test-data/). –

+0

Nếu bạn mong đợi một Nhà máy Cô gái cho Java, hãy xem https://github.com/mguymon/model-citizen – mguymon

Trả lời

8

Trong một bài tập trước, chúng tôi đã có hàng trăm bài kiểm tra tích hợp liên quan đến tập dữ liệu, mặc dù không phải trong DBUnit — môi trường thử nghiệm được viết từ đầu, vì nó là một công ty rất lớn có thể làm được điều này.

Tập dữ liệu được tổ chức theo thứ bậc. Hệ thống được thử nghiệm bao gồm một vài (5-10) mô-đun và dữ liệu thử nghiệm theo mẫu đó. Kịch bản lệnh thử nghiệm đơn vị trông giống như sau:

include(../../masterDataSet.txt) 
include(../moduleDataSet.txt) 

# unit-specific test data 
someProperty=someData 

Tên thuộc tính được ánh xạ trực tiếp vào bản ghi DB bằng một số công cụ kỳ quái mà tôi không thể nhớ.

Có thể áp dụng cùng một mẫu cho thử nghiệm DBUnit. Trong bộ dữ liệu chính bạn có thể đặt bản ghi luôn cần phải là — như từ điển, tải ban đầu của cơ sở dữ liệu, như thể nó được cài đặt từ đầu.

Trong bộ dữ liệu mô-đun bạn nên đặt hồ sơ bao gồm các trường hợp kiểm tra của phần lớn các thử nghiệm trong một mô-đun; Tôi không cho rằng một thử nghiệm trung bình của bạn bao gồm tất cả 70 bảng cơ sở dữ liệu của bạn, phải không? Bạn chắc chắn phải có một số nhóm chức năng có thể cấu thành một mô-đun, ngay cả khi ứng dụng là nguyên khối. Cố gắng tổ chức dữ liệu thử nghiệm cấp mô-đun xung quanh nó.

Cuối cùng, ở cấp kiểm tra, bạn chỉ sửa đổi bộ thử nghiệm của mình với số lượng bản ghi tối thiểu cần thiết cho các thử nghiệm cụ thể này.

Cách tiếp cận này có lợi ích to lớn của việc học; bởi vì có rất ít tệp dữ liệu, trong thời gian đó, bạn thực sự bắt đầu ghi nhớ chúng. Thay vì nhìn thấy hàng trăm tập hợp dữ liệu lớn chỉ khác nhau bởi các chi tiết không đáng kể (bạn phải tìm ra mỗi khi bạn quay lại thử nghiệm sau một thời gian), bạn có thể dễ dàng biết hai tập dữ liệu khác nhau như thế nào.

Một từ về hiệu suất ở cuối. Trên 2 của tôi.4 GHz 2 lõi WinXP máy xét nghiệm DBUnit liên quan đến:

  • thả 14 bảng,
  • tạo 14 bảng,
  • chèn ca. 100 bản ghi,
  • thực hiện logic thử nghiệm,

mất 1-3 giây. Nhật ký cho thấy rằng 3 hoạt động đầu tiên mất ít hơn một giây, hầu hết thời gian thử nghiệm được tiêu thụ bởi Spring. Logic này được thực hiện bởi mỗi bài kiểm tra, để tránh phụ thuộc vào thứ tự kiểm tra. Mọi thứ đều chạy trong một máy ảo với Derby được nhúng, đây có lẽ là lý do tại sao nó quá nhanh.

EDIT: Tôi nghĩ rằng bộ dữ liệu XML DBUnit không hỗ trợ bao gồm các tập tin thử nghiệm khác, nó có thể được khắc phục bằng cách sử dụng một lớp cơ sở cho tất cả các xét nghiệm hội nhập, ví dụ:

public class AbstractITest { 

    @Before 
    public void setUp() throws Exception { 
     // 
     // drop and recreate tables here if needed; we use 
     // Spring's SimpleJdbcTemplate executing drop/create SQL 
     // 
     IDataSet masterDataSet = new FlatXmlDataSetBuilder().build("file://masterDataSet.xml"); 
     DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, dataSet); 
    } 
} 

public class AbstractModuleITest extends AbstractITest { 

    @Before 
    public void setUp() throws Exception { 
     super.setUp(); 
     IDataSet moduleDataSet = new FlatXmlDataSetBuilder().build("file://moduleDataSet.xml"); 
     DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, moduleDataSet); 
    } 
} 

public class SomeITest extends AbstractModuleITest { 
    // The "setUp()" routine only here if needed, remember to call super.setUp(). 

    @Test 
    public void someTest() { ... } 
} 
+0

Tôi thích ý tưởng này. Tôi sẽ tìm hiểu xem liệu dbunit có hỗ trợ loại điều này không. – egervari

+0

@egervari DBUnit Bộ dữ liệu XML có lẽ không hỗ trợ trực tiếp; xem chỉnh sửa của tôi. – MaDa

+0

Tôi thích ý tưởng của bạn rất nhiều. Tôi nghĩ rằng việc tạo ra một tập dữ liệu tổng thể đầy đủ các thông tin từ điển là tuyệt vời. Tuy nhiên, tôi không phải là một fan hâm mộ của các tập dữ liệu Module. Tôi nghĩ rằng thật dễ dàng để nhóm các bài kiểm tra thành các mô-đun dựa trên dữ liệu chung ngày nay, nhưng những thay đổi đó có thể thay đổi trong tương lai. Tạo một sự phụ thuộc vào một tập dữ liệu mô-đun có vẻ như nó sẽ là một nhức đầu rất lớn nếu bạn đã bao giờ phải thay đổi thiết kế của bạn và không có giá trị lợi ích. Tôi có thể thấy nó sẽ hoạt động ở đâu. Tôi đoán nó thực sự phụ thuộc vào mô hình dữ liệu của bạn. – bheussler

2

Đề xuất trong Junit trong Hành động 2e thực sự không tạo quá nhiều tập dữ liệu (như một trong mỗi lớp thử nghiệm), nhưng chỉ đủ để được coi là duy trì được. Ngoại trừ một vài trường hợp ngoại lệ, tôi thấy có thể sử dụng một tập dữ liệu tổng thể cho hầu hết các bài kiểm tra đơn vị và các bộ dữ liệu riêng lẻ cho các bài kiểm tra tích hợp. Hạn chế sử dụng ExpectedDataSets cũng là một tùy chọn.

Ngoài ra, tôi đã sử dụng Unitils kết hợp với dbunit để đơn giản hóa một số cài đặt và tải dữ liệu thử nghiệm, vì vậy bạn có thể muốn xem xét nó khi thích hợp.

+1

Tôi nghĩ rằng cuốn sách sai nếu đó là đề xuất của nó. Khi bạn có một cơ sở dữ liệu với 70 bảng, và bạn có quá nhiều trường boolean khác nhau trên cờ, tấn tiêu chí tìm kiếm bạn cần kiểm tra, và cứ thế ... thay đổi 1 hàng có thể gây ra một lượng lớn các phép thử để phá vỡ. Điều này là xấu, và tôi nghĩ rằng đó là một sự lãng phí thời gian. Có thể sử dụng một mẫu xây dựng trong mã, và sau đó lưu chúng vào cơ sở dữ liệu với các tầng là câu trả lời. Tôi không chắc. – egervari

+0

Làm rõ: sử dụng một tập dữ liệu tổng thể cho hầu hết các bài kiểm tra đơn vị là những gì tôi đã chọn tôi làm trong tình huống cụ thể đó. Cuốn sách chỉ khuyên bạn nên duy trì nhiều bộ dữ liệu như bạn đã sẵn sàng để duy trì, vì vậy thay vì 1 cho mỗi lớp/bảng, bạn có thể xem xét một tỷ lệ ít nghiêm ngặt hơn. – prusswan

+0

Suy nghĩ hiện tại của tôi là nó sẽ không là 1: 1, nhưng ít nhất 50% các bài kiểm tra sẽ là 1: 1 và phần còn lại sẽ chia sẻ chúng. Khi ứng dụng của tôi ngày càng phức tạp, tôi cần ít liên kết hơn với các bộ dữ liệu. Tôi có 5 bộ dữ liệu xây dựng 1 cơ sở dữ liệu hiện tại - và mọi thử nghiệm đều sử dụng 1 đến 5 bộ dữ liệu. Nó được thiết kế để hoạt động như 1 cơ sở dữ liệu. Tôi nghĩ đây là một sai lầm. Nó dẫn tôi xuống một con đường của địa ngục phụ thuộc thử nghiệm. – egervari

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