2013-01-01 33 views
5

Trong một số dự án của tôi, tôi sử dụng mẫu MVC để tách mã (các mối quan tâm) thành 3 tầng. Cả hai mô hình và kiểm soát tầng chạy trên C# vì vậy tôi sử dụng khuôn khổ thử nghiệm như MSTest hoặc NUnit để xác nhận yêu cầu chức năng cho các tầng. Đối với các lớp xem, tôi sử dụng QUnit để kiểm tra các tệp JavaScript.Làm thế nào để chạy thử nghiệm QUnit và lấy lại kết quả thử nghiệm trong C# thông qua gọi lại JavaScript?

Tuy nhiên, tôi không thể thực thi QUnit làm thử nghiệm tự động vì MSTest không trực tiếp hỗ trợ cho trang web thử nghiệm. Tôi cần phải chạy nó trong MSTest như logic sau đây.

[TestMethod] 
public void JavaScriptTest() 
{ 
    var result = QUnit.Test('~/QUnit/test1.htm'); 

    Assert.IsTrue(result.Failed <= 0) 
} 

Giải pháp phải sử dụng hàm callback trong QUnit (not while-loop checking) để đảm bảo rằng phương pháp kiểm tra sẽ thực hiện ngay sau khi kiểm tra thực hiện.

Trả lời

5

Để kiểm tra trình duyệt chéo, Selenium WebDriver là tùy chọn tốt nhất để giải quyết vấn đề này vì chúng tôi có thể dễ dàng chuyển đổi giữa trình duyệt bằng cách chỉ thay đổi một dòng mã.

  1. Cài đặt Selenium WebDriver package để chiếu qua NuGet.

enter image description here

2. Download preferred driver để dự án của bạn, thêm vào dự án của bạn và thiết lập "Sao chép vào Output Directory" bằng "Sao chép nếu mới hơn". Đối với ví dụ này, tôi sử dụng trình điều khiển Chrome để chạy Selenium với Google Chrome trên máy của tôi.

enter image description here

3.In phương pháp kiểm tra, tạo điều khiển và thiết lập thời gian thực hiện tối đa trước khi chạy QUnit.

var browser = new ChromeDriver(); 
var navigator = browser.Navigate(); 

// Currently, max execution time is one minute. 
browser.Manage().Timeouts() 
     .SetScriptTimeout(new TimeSpan(0, 1, 0)); 

4.Hãy chắc chắn rằng bạn đã đặt tự khởi động QUnit thành false.

QUnit.config.autostart = false; 

5.Điều hướng đến trang QUnit. Trong trường hợp này, tôi sử dụng trang web cục bộ trong thư mục giải pháp.

browser.Manage().Timeouts().SetScriptTimeout(new TimeSpan(0, 1, 0)); 
navigator.GoToUrl(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"../../../QUnit example/qunit-demo.htm")); 

6.Use ExecuteAsyncScript phương pháp trong đối tượng trình duyệt để đăng ký gọi lại cho QUnit.done chức năng và tay bắt đầu thử nghiệm QUnit.

var response = browser.ExecuteAsyncScript 
(
    "var callback = arguments[arguments.length - 1];" + 
    "QUnit.done(callback); QUnit.start();" 
); 

7.Khi QUnit kiểm tra xong, nó sẽ trả về phản hồi. Chúng ta cần chuyển đổi nó thành kiểu phù hợp và nhận kết quả kiểm tra.

var testResult = response as Dictionary<string, object>; 

if(testResult == null) throw new Exception("Unhandle error occur while running QUnit."); 

Console.WriteLine("Test complete in " + (long)testResult["runtime"] + " ms."); 
Console.WriteLine("---------------------------"); 
Console.WriteLine("total: " + (long)testResult["total"]); 
Console.WriteLine("passed: " + (long)testResult["passed"]); 
Console.WriteLine("failed: " + (long)testResult["failed"]); 

8. Đừng quên đóng trình duyệt mỗi lần sử dụng kiểm tra kết thúc.

browser.Close(); 

PS. Tôi cũng cung cấp giải pháp Visual Studio 2012 (mã nguồn) cho câu trả lời này.

Click here to download

Cập nhật 1

  • Fix lỗi đôi khi QUnit bắt đầu thử nghiệm trước khi hệ thống đăng ký gọi lại chức năng thực hiện.
  • Bao gồm trang QUnit cục bộ.
  • Bao gồm IEDriver để tải xuống giải pháp. Tuy nhiên, phiên bản này không hỗ trợ cho IE10 trên Windows 8. Nhưng nó hoạt động tốt trên IE8.
+0

# 1 Giới hạn, không thể nắm bắt bảng điều khiển.đăng nhập đầu ra từ JavaScript thường sử dụng trong hệ thống phức tạp. –

+0

# 2 Giới hạn, tập lệnh async thực thi tối đa là một phút. –

2

PhantomJSkhông đầu WebKit bằng JavaScript API. Nó có hỗ trợ nhanh và bản địa cho các tiêu chuẩn web khác nhau: xử lý DOM, công cụ chọn CSS, JSON, Canvas và SVG. Đó là web đầy đủ ngăn xếp một giải pháp tối ưu cho thử nghiệm trang web không đầu, Chụp màn hình, Tự động hóa trang và Giám sát mạng.

enter image description here

tôi đề nghị bạn sử dụng khuôn khổ này khi bạn muốn kiểm tra một số thư viện JavaScript và không muốn sử dụng trình duyệt được cài đặt trên máy tính thử nghiệm.

1.Hãy chắc chắn rằng bạn đã đặt tự khởi động của QUnit thành false.

QUnit.config.autostart = false; 

2. Download PhantomJS executable file cho Windows, thêm vào dự án của bạn và đặt "Sao chép sang thư mục đầu ra" bằng "Sao chép nếu mới hơn".

3.Tạo quy trình chạy PhantomJS.exe với 2 đối số là tệp JavaScript và url trang thử nghiệm.

var scriptPath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../PhantomScript/main.js")); 
var pageUrl = "file:///" + Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../QUnitExample/qunit-demo.htm")).Replace('\\', '/'); 

var process = new Process 
{ 
    StartInfo = 
    { 
     UseShellExecute = false, 
     RedirectStandardOutput = true, 
     CreateNoWindow = true, 
     WindowStyle = ProcessWindowStyle.Hidden, 
     FileName = "phantomjs.exe", 
     Arguments = "\"" + scriptPath + "\" \"" + pageUrl + "\"" 
    } 
}; 

4.Bắt đầu quá trình và kiểm tra mã thoát của quy trình này.

process.Start(); 
process.WaitForExit(); 

Assert.AreEqual(process.ExitCode, 0); 

Trong tập tin JavaScript, tôi sử dụng eveluateAsync để truy cập vào nội dung của trang để chạy thử nghiệm QUnit, chờ cho đến khi nó kết thúc và đăng nhập số lượng thử nghiệm thất bại.

page.evaluateAsync(function() 
{ 
    QUnit.done(function(response) 
    { 
     console.log('!Exit' + response.failed); 
    }); 

    QUnit.start(); 

    // If QUnit finish after 2500 ms, system will exit application with code -1. 
    setTimeout(function() 
    { 
     console.log('!Exit-1'); 
    }, 2500); 
}); 

Để xử lý nhật ký, tôi sử dụng mã sau để thoát khỏi quá trình có mã thoát.

var exitCodeName = '!Exit'; 
page.onConsoleMessage = function (msg) 
{ 
    if (msg.indexOf(exitCodeName) == 0) 
    { 
     var exitCode = parseInt(msg.substring(exitCodeName.length).trim(), 10); 

     phantom.exit(exitCode || 0); 
    } 
}; 

PS. Tôi cũng cung cấp mã nguồn đầy đủ (VS2012) cho SkyDrive của tôi. Bạn có thể tải xuống tại liên kết sau.

PhantomJS Test project

Dự án này giới thiệu cho bạn cách chạy PhantomJS trong MSTest.

PhantomJS Form project

Dự án này là PhantomJS wrapper được viết trong C# Windows Form. Tôi sử dụng điều này để kiểm tra các tệp "main.js" và "core.js" trước khi sử dụng nó trong dự án thử nghiệm.

enter image description here

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