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() { ... }
}
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
Đượ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/). –
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