Kiểm thử tự động với NUnit theo hướng Data-Driven
Một trong những thế mạnh của kiểm thử tự động là khả năng lặp lại kiểm thử với nhiều dữ liệu khác nhau mà không cần thay đổi các hành động (step) của kịch bản. Điều này, đặc biệt được sử dụng khi làm các kịch bản kiểm thử biên (boundary test cases).
NUnit hỗ trợ chúng ta thực thi kiểm thử theo hướng Data-Driven khá mạnh với nhiều từ khóa để sử dụng trong nhiều trường hợp khác nhau. Thực thi mã kiểm thử tự động theo hướng Data-Driven được thiết lập theo hai giai đoạn: Tạo dữ liệu và cách sử dụng dữ liệu.
Thiết lập dữ liệu
Trong NUnit, có 3 từ khóa dùng để tạo dữ liệu: Values, Range, Random
Từ khóa Values được sử dụng để cung cấp dữ liệu cho một tham số của phương thức kiểm thử. Các giá trị sử dụng trong Values phải là một giá trị hằng (constant) và phải được khai báo trực tiếp ở phương thức kiểm thử. Nhược điểm chính của từ khóa này là quá hardcoded.
[Test]
public void Data_Values([Values(1, 2, 3)] int x, [Values(1, 2)] int y)
{
Console.WriteLine(x + ” ” + y);
}
Từ khóa Range được sử dụng để tạo ra dữ liệu thay vì hardcoded như từ khóa Values. Dữ liệu từ Range tạo ra bởi giá trị bắt đầu và một giá trị kết thúc được cung cấp bởi kỹ sư kiểm thử. Đôi khi kỹ sư kiểm thử cũng cung cấp thêm một giá trị là bước nhảy để xác định khoảng cách giữa các giá trị dữ liệu được tạo ra. Vì giá trị được tạo ra bên trong một khoảng giá trị nên từ khóa này chỉ áp dụng với giá trị số mà thôi. Chuỗi thì không có khoảng cách giá trị, phải không :).
[Test]
public void Data_Range([Values(1, 2, 3)] int x, [Range(1, 4)] int y)
{
Console.WriteLine(x + ” ” + y);
}
Nếu từ khóa Range vẫn còn một cái gì đó cố định cho dữ liệu được tạo ra, chúng ta có từ khóa Random để tạo dữ liệu một cách ngẩu nhiên hoàn toàn. Với Random, kỹ sư kiểm thử chỉ cần cho biết số lượng dữ liệu cần tạo, hoặc thêm giá trị tối đa và tối thiểu.
[Test]
public void Data_Random([Values(1, 2, 3)] int x, [Random(10)] int y)
{
Console.WriteLine(x + ” ” + y);
}
[adToAppearHere]
Thiết lập hướng sử dụng dữ liệu
Sau khi tạo ra và thiết lập dữ liệu cho phương thức kiểm thử, chúng ta cần thiết lập chúng ta muốn thực thi kiểm thử với dữ liệu như thế nào. Với NUnit, chúng ta có các cách sử dụng dữ liệu: Combinatorial hoặc Sequential.
Về mặc định, nếu khi chúng ta tạo dữ liệu mà không đề cập gì đến cách sử dụng dữ liệu, cách Combinatorial sẽ được áp dụng. Với Combinatorial, NUnit sẽ kết hợp các dữ liệu trong từng tham số của phương thức kiểm thử thành nhiều bộ dữ liệu theo cách tổ hợp A x B x C x… Điều này có thể dẫn đến trường hợp bùng nổ tổ hợp nếu chúng ta sử dụng quá nhiều tham số cho một phương thức kiểm thử.
[Test, Combinatorial]
public void Data_Combine([Values(1, 2, 3)] int x, [Values(1, 2)] int y)
{
Console.WriteLine(x + ” ” + y);
}
Theo như đoạn mã ở trên, chúng ta sẽ có 3 x 2 = 6 bộ dữ liệu cần thực thi kiểm thử.
Ngược lại, cách Sequential sẽ tạo ra các bộ dữ liệu kiểm thử theo thứ tự của dữ liệu và kết hợp 1 – 1 từng tham số. Nếu tham số nào không đủ số lượng dữ liệu, giá trị null sẽ được sử dụng.
[Test, Sequential]
public void Data_Sequential([Values(1, 2, 3)] int x, [Values(1, 2)] int y)
{
Console.WriteLine(x + ” ” + y);
}
Theo như đoạn mã ở trên, chúng ta sẽ có 3 bộ dữ liệu cần thực thi kiểm thử: (1, 1); (2, 2); (3, null).
Chi tiết về các từ khóa trên, các bạn có thể xem clip dưới đây hoặc download mã nguồn tại đây.
Nunit còn hỗ trợ một số từ khóa khác với nhiều đặc biệt như giới hạn thời gian, tạo dữ liệu theo hướng đặc biệt, v.v… Các bạn có thể xem thêm tại trang chủ của NUnit.