5

Chúng tôi sử dụng các tệp .resx để quốc tế hóa ứng dụng của chúng tôi sang một số ngôn ngữ. Các bài kiểm tra đơn vị tự động của chúng tôi được lắp ráp riêng và chúng tôi chạy mstest trên dự án đó từ dòng lệnh từ bên trong CI (Jenkins) của chúng tôi như sau:Với mstest, tôi có thể chạy bộ thử nghiệm đơn vị của mình với từng ngôn ngữ được hỗ trợ của tôi không?

mstest.exe /testcontainer:unittests.dll/category: " ! TemporaryExclude "/resultsfile:UnitTests.trx

Chúng tôi đã tìm thấy các trường hợp thử nghiệm đơn vị cụ thể sẽ thất bại nếu chạy trên máy được đặt thành một trong các nền văn hóa không được hỗ trợ tiếng Anh của chúng tôi. Chúng tôi muốn có CI của chúng tôi chạy các bài kiểm tra đơn vị đối với từng nền văn hóa, bao gồm cả văn hóa hiện tại. Đây phải là một vấn đề mà người khác đã gặp phải, nhưng tôi đã không tìm thấy bất cứ điều gì về nó.

Có cách nào để chạy mstest với văn hóa cụ thể không? Tôi không thấy bất kỳ điều gì trong the command-line docs for mstest.exe

Tôi biết rằng tôi có thể chỉ định Thread.CurrentThread.CurrentCulture và Thread.CurrentThread.CurrentUICulture trong các thử nghiệm của mình, nhưng tôi không muốn các nhà phát triển trong nhóm của chúng tôi phải sao chép dán các bản sao của các bài kiểm tra của họ, mỗi bài kiểm tra một lần. Nó sẽ là thêm công việc cho họ và có bản sao khác nhau chỉ bằng văn hóa sẽ rất khó để duy trì và dễ bị lỗi.

Tôi băn khoăn về việc suy luận một lớp từ TestMethodAttribute và có nó vòng qua tất cả các file DLL tài nguyên ngôn ngữ của tôi, chạy mã kiểm tra một lần cho mỗi, nhưng Visual Studio nói với tôi:

Lỗi 2 'ClassToExtendTestMethodAttribute': không thể lấy được từ loại kín 'Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute'

Tương tự cho TestClassAttribute.

Trả lời

3

Một ý tưởng có thể là đọc văn bản từ tệp cấu hình theo phương pháp TestInitialize để sử dụng với Thread.CurrentThread.CurrentCulture và đặt phương thức này vào lớp kiểm tra đơn vị cơ sở (tất cả các lớp thử nghiệm khác sẽ được lấy từ). Nếu điều này xảy ra, bạn có thể gọi mstest từ một tập tin thực thi trong một vòng lặp và thay đổi tập tin cấu hình (ví dụ từ "en-us" thành "fr-FR") sau mỗi bước.

Ngoài ra, đây là con trỏ đến "Unit Test Extensibility Sample" mà tôi chưa sử dụng, nhưng có thể giúp bạn.

+0

+1 Ý tưởng tuyệt vời! Tôi không muốn làm như vậy truy cập tập tin trước khi thực hiện mỗi bài kiểm tra (cho số lượng các bài kiểm tra chúng tôi có) vì vậy tôi sẽ cố gắng ClassInitialize thay vì TestInitialize. Nếu tôi làm việc đó, tôi vẫn sẽ chấp nhận câu trả lời của bạn. – JeffH

+0

@heginy Có vẻ như các lớp dẫn xuất không thực thi ClassInitialize của cha mẹ trừ khi chúng gọi nó một cách rõ ràng từ một phương thức ClassInitialize của riêng chúng. Các lớp có nguồn gốc * thực hiện * thực thi TestInitialize của cha mẹ, vì vậy tôi có thể làm cho kỹ thuật của bạn hoạt động theo cách đó. Như tôi đã nói, tôi sẽ không vui mừng về việc làm cho mọi thử nghiệm đi ra ngoài hệ thống tập tin. Có lẽ tôi sẽ chọn kỹ thuật ClassInitialize, mặc dù có thêm một bước nữa ngoài việc phân lớp. Chấp nhận câu trả lời của bạn. Cảm ơn! – JeffH

+0

@ JeffH Tuyệt vời, vui vì nó hoạt động. Bạn đúng về quyền truy cập tệp mỗi lần. Nếu bạn có thể giải quyết nó bằng ClassInitialize, có lẽ AssemblyInitialize cũng có thể hoạt động. – henginy