2011-11-18 37 views
11

Chúng tôi đang sử dụng thử nghiệm thử nghiệm VS 2010 (MSTest) để kiểm tra chức năng tự động. Khi chúng tôi chạy thử nghiệm từ Visual Studio, VS tạo ra một quá trình gọi là QTAgent32.exe, và nó chạy các bài kiểm tra trong quá trình đó.Tôi có thể buộc MSTest sử dụng quy trình mới cho mỗi lần chạy thử không?

Chúng tôi thấy rằng khi chúng tôi thực hiện nhiều lần chạy thử, MSTest sẽ sử dụng lại quy trình QTAgent32 tương tự - ID tiến trình không thay đổi. Đây là một vấn đề đối với chúng tôi, vì mã chúng tôi đang thử nghiệm là P/Gọi đến một DLL không được quản lý. DLL cần được khởi tạo chỉ một lần trong suốt vòng đời của quá trình. Chúng ta có một phương thức [AssemblyInitialize], nhưng nó thực hiện một lần cho mỗi lần chạy thử nghiệm. Nếu chúng tôi thực hiện nhiều lần chạy thử, nó sẽ thực thi nhiều lần trong cùng một quá trình.

Mỗi lần chúng tôi chạy thử nghiệm, MSTest tạo một miền ứng dụng mới; nhưng các appdomain này đều nằm trong cùng một tiến trình.

Vì vậy, tôi tự hỏi: có cách nào để nói với nhân viên thử nghiệm Visual Studio sử dụng quy trình mới mỗi khi chúng tôi chạy thử nghiệm không? Tôi đã xem xét cấu hình ".testsettings" nhưng không thấy bất cứ điều gì liên quan.

+2

Chỉ vì sự tò mò của tôi - có thể là DLL không được quản lý không được tải sau mỗi lần kiểm tra liên tiếp với 'FreeLibrary'? –

+0

Cảm ơn Wiktor - gợi ý tốt. Ngay bây giờ mã chỉ tham chiếu tĩnh các API không được quản lý, sử dụng các thuộc tính [DllImport] trên khai báo hàm C# extern. Tôi giả sử .NET không tự động giải phóng thư viện khi appdomain bị rách, vì chúng ta đang gặp lỗi. Tôi không thực sự biết làm thế nào để gọi một DLL động nạp từ mã C# - bạn có thể gọi LoadLibrary() và GetProcAddress(), và sau đó bằng cách nào đó đúc con trỏ hàm trả về cho một loại đại biểu? Dù sao, tôi sẽ nhìn vào nó - cảm ơn! Tôi chỉ tìm thấy điều này có thể giúp: http://www.codeproject.com/KB/cs/dyninvok.aspx –

Trả lời

6

không biết làm thế nào đến nay bạn có muốn đi với nó, nhưng một trong những giải pháp có thể để tạo ra đơn vị chủ thử nghiệm của bạn

http://technet.microsoft.com/fr-fr/query/bb166558

liên kết này cho thấy làm thế nào để tạo ra adapter, cũng sau đó bạn có thể khởi động một mới quá trình cho evertest, tạo ra một thông tin liên lạc đường ống và xé nó xuống sau khi thử nghiệm.

tôi biết MS chính nó sử dụng một máy chủ khác nhau cho chạy thử nghiệm dưới nốt ruồi

http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

+0

Cảm ơn! Tôi sẽ kiểm tra điều này. Tôi đã không nhận ra rằng bạn có thể tạo một máy chủ lưu trữ tùy chỉnh. Ngay bây giờ, chúng tôi đang tìm xem liệu có một nhân tố thử nghiệm khác không (ví dụ: Gallio Icarus) có thể chạy thử nghiệm trong một quy trình mới mỗi lần. Nó thực sự chỉ là một vấn đề trong khi tương tác phát triển và thử nghiệm - trên máy chủ xây dựng, chúng tôi chỉ có một thử nghiệm chạy duy nhất trong một quá trình thử nghiệm duy nhất. –

1

tôi đã có thể làm việc này sau khi đọc bình luận Wiktor về FreeLibrary().

Tôi đã sử dụng this class được tạo bởi Mike Stall, cung cấp trình bao bọc xung quanh LoadLibrary, GetProcAddress và FreeLibrary. Bằng cách đó, tôi có thể tải thư viện một lần trong mỗi lần chạy thử, gọi các phương thức cần thiết và sau đó giải phóng thư viện vào cuối chạy thử nghiệm.

Mã của Mike Stall sử dụng Marshal.GetDelegateForFunctionPointer, chuyển đổi con trỏ hàm không được quản lý thành loại đại biểu được quản lý.

Tôi đã phải thay thế các khai báo bên ngoài [DllImport] bằng các khai báo cho các loại đại biểu. Vì vậy, tôi chuyển đổi này:

[DllImport("asesignal.dll")] 
public static extern bool ASESDK_Initialize(string licenseCode); 

này: Mã

public delegate bool ASESDK_Initialize(string licenseCode); 

Mike Stall của chứa ví dụ với các đại biểu chung (Action <T> vv). Nhưng tôi không thể làm việc đó, vì vậy tôi đã tạo ra các loại đại biểu của riêng mình.

tôi có thể nạp DLL động như thế này:

_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll"); 

Để gọi một hàm, tôi làm điều này:

var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize"); 
function(licenseCode); 

Cảm ơn Wiktor và np-cứng giúp đỡ của bạn!

0

VS 2013 và chuyển tiếp bây giờ có cài đặt cho mục này trong phần Kiểm tra> Cài đặt thử nghiệm> Chạy thử nghiệm thực thi động cơ. Bỏ chọn lựa chọn này sẽ khởi động một công cụ mới mỗi lần chạy.

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