2012-07-06 30 views
8

Tôi đã có một dự án sử dụng SpecFlow, NUnit và Coypu để thực hiện các kiểm tra chấp nhận trên một ứng dụng web. Tôi đã có dự án xây dựng OK thông qua Jenkins trên một máy chủ xây dựng. Jenkins gọi một script psake chạy msbuild trên dự án specs, sau đó script gọi nunit-console để chạy các thông số/test, và sau đó tôi muốn tạo một báo cáo từ SpecFlow.luồng không thành công khi cố gắng tạo báo cáo thực hiện kiểm tra

Framework "4.0" 

task Default -depends RunSpecs 

task BuildSpecs { 
    $env:EnableNuGetPackageRestore = "true" 
    msbuild /t:Rebuild ReturnsPortal.Specs.csproj 
} 

task RunSpecs -depends BuildSpecs { 
    exec { & "C:\path\to\NUnit 2.5.9\bin\net-2.0\nunit-console-x86.exe" /labels /out=TestResult.txt /xml=TestResult.xml .\bin\Debug\TheWebApp.Specs.dll } 
    exec { & "C:\path\to\SpecFlow\1.8.1\specflow.exe" nunitexecutionreport TheWebApp.Specs.csproj /out:SpecResult.html } 
} 

Đó gọi exec cuối cùng để specflow.exe thất bại mặc dù, với:

Yếu tố < ParameterGroup> bên dưới yếu tố < UsingTask> là không được công nhận. C: \ Program Files (x86) \ Jenkins \ việc \ TheWebApp \ workspace \ Web \ Sites \ TheWebApp.nuget \ nuget.targets

Một chút googling gợi ý rằng có lẽ đó là một vấn đề với các phiên bản msbuild đang được sử dụng (ví dụ: here, here). Nhưng tôi có Framework "4.0" trong kịch bản lệnh psake của mình và dự án Specs đang nhắm mục tiêu .NET Framework 4.0 và nó xây dựng tốt trong bước xây dựng, vì vậy tôi không chắc chắn tại sao specflow dường như đang sử dụng phiên bản trước của msbuild. Hoặc có lẽ là vấn đề ở một nơi khác?

+0

bạn đã thử chuyển đường dẫn đầy đủ tới msbuild chưa? ('C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ MSBuild.exe') – KMoraz

+0

Cảm ơn, đó sẽ là vấn đề, tuy nhiên tôi không biết làm thế nào để lực lượng SpecFlow sử dụng một phiên bản nhất định của msbuild. – ngm

Trả lời

29

Đây là câu trả lời cho tôi, từ SpecFlow Wiki:

quan trọng cho .NET 4.0 dự án: Bởi vì specflow.exe được biên soạn cho .NET 3.5, nó có thể không tải NET 4.0 lắp ráp theo mặc định. Để tạo báo cáo này cho các dự án .NET 4.0, bạn phải buộc specflow.exe sử dụng thời gian chạy .NET 4.0 bằng cách sử dụng tệp cấu hình. Chỉ cần sao chép cấu hình dưới đây và tạo một tập tin specflow.exe.config và đặt nó bên cạnh specflow.exe của bạn và bạn sẽ có thể tạo báo cáo định nghĩa bước.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0.30319" /> 
    </startup> 
</configuration> 
+0

SpecFlow 2.0 được phát hành vào ngày 27 tháng 1 năm 2016, được biên soạn dựa trên .NET 4.5. Vấn đề này không nên xảy ra trong phiên bản mới. – ngm

2

tôi cố gắng sử dụng các tập tin cấu hình giải pháp gợi ý ở trên. Nó hoạt động để thử nghiệm cục bộ, nhưng ngay sau khi tôi đẩy mã của tôi vào môi trường CI của chúng tôi nó bị nghẹt thở vì môi trường CI không có tệp cấu hình đó. Chúng tôi hạn chế môi trường CI chỉ sử dụng các phiên bản sạch của các gói khác nhau, vì vậy chúng tôi không muốn cố gắng tiêm cấu hình đặc biệt vào máy chủ CI.

Chúng tôi nhận thấy rằng SpecFlow hoạt động tốt với một số dự án .NET 4.0 của chúng tôi mà không có tệp cấu hình đặc biệt. Sau một ít nghiên cứu, 'vấn đề' thực tế dường như là NuGet 2.1. Mọi thứ hoạt động tốt cho các dự án .NET 4.0 với NuGet 1.7.

Một nơi nào đó giữa 1,7 và 2,1 NuGet giới thiệu các tính năng mới trong tệp NuGet.targets không được hỗ trợ bởi các phiên bản MSBuild cũ hơn. Cụ thể, vấn đề dường như là <ParameterGroup> bên dưới phần tử <UsingTask>, như được giải thích bởi thông báo lỗi.

Một lướt qua lướt qua ở tệp mục tiêu cho biết phần đó có trách nhiệm giữ NuGet cập nhật. Việc xóa phần này sẽ giải quyết hoàn toàn vấn đề theo cách tương tự như việc thêm tệp cấu hình ở trên, mặc dù cũng loại bỏ chức năng tự cập nhật dường như cung cấp. Do tệp .targets cam kết với kho lưu trữ, giải pháp này cũng hoạt động trên môi trường CI của chúng tôi với bất kỳ thay đổi nào ở phía CI.

Nó không nhất thiết phải là giải pháp tốt hơn so với ngm, nó chỉ là một giải pháp khác. Tùy thuộc vào môi trường của bạn, điều này có thể là một cách thích hợp để đi, hoặc có lẽ không.

+2

Lý tưởng nhất, SpecFlow sẽ cung cấp một gói được biên dịch cho .NET 4.0, và điều đó sẽ giải quyết tất cả những vấn đề này, nhưng có vẻ như họ không quan tâm đến việc đó vào lúc này. – Mir

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