我最近在设置完全自动化的夜间构建/测试/部署环境时遇到了一些麻烦.简要解释一下设置.我们使用Mercurial作为源控制系统,使用TeamCity作为构建服务器.它目前在一台单独的机器上只有一个构建代理,以保持简单.
这个想法如下:每晚都有一个TeamCity构建运行.从Mercurial存储库中提取最新信息,运行构建,运行单元测试,部署到测试服务器,针对新部署的测试服务器运行验收测试(在构建代理上),如果所有这些通过将批次部署到临时服务器.除了验收测试之外,我已经完成了所有工作.这些都是使用SpecFlow和WatiN完成的.Everyhting在开发机器上运行良好(Windows 7 32位).但是,当我尝试运行验收测试(TeamCity中的NUnit)时,运行器报告失败,因为步骤[浏览器] .ContainsText(browserText).所有步骤都正确运行,如果我在构建代理上的同一浏览器中复制步骤(获得完全管理员访问权限),我可以看到文本存在.所以据我所知,测试应该通过.
我发现这个stackoverflow线程让我觉得我可能正在做一些关于如何保持浏览器实例的错误.解释一下:我有一套常见的步骤,例如"当我点击X按钮时"或"当我将文字X输入字段Y时"和有问题的那个"然后我显示X".因为我正在尽可能多地重复使用测试,所以我也推广了一个@requires_browser场景需求,然后定义如下:
[BeforeScenario("requires_browser")]
public void RequiresBrowserBeforeFeature()
{
Settings.MakeNewIeInstanceVisible = false;
ScenarioContext.Current.Set<Browser>(new IE(true));
}
[AfterScenario("requires_browser")]
public void RequiresBrowserAfterFeature()
{
ScenarioContext.Current.Get<Browser>().Close();
ScenarioContext.Current.Get<Browser>().Dispose();
}
Run Code Online (Sandbox Code Playgroud)
然后是共同的步骤:
[Then("I am shown \"(.*)\"")]
public void ThenIAmShown(string text)
{
Assert.IsTrue(ScenarioContext.Current.Get<Browser>().ContainsText(text));
}
Run Code Online (Sandbox Code Playgroud)
从这里我可以定义其他常见步骤,将文本输入文本框,单击按钮等.所有这一切都完美适用于开发环境,在visual studio 2010中运行[以管理员身份].
我认为ScenarioContext应该保留到测试完成之前我错了吗?
到目前为止我尝试过的:
配置构建代理程序服务以作为本地系统(SYSTEM)运行.这导致了所描述的问题 - ThenIAmShown(字符串文本)方法将始终失败.它与已启用本地桌面的交互.
配置的构建代理服务以网络管理员身份运行(完全管理员权限).此设置甚至不会运行测试.我得到的例外:
TearDown方法失败.WatiN.Core.Exceptions.BrowserNotFoundException:找不到匹配约束的IE窗口:等待附加到新创建的IE实例时超时.搜索在"30"秒后过期.TearDown:System.Collections.Generic.KeyNotFoundException:给定的键不在字典中.在WatiN.Core.IE.CreateIEPartallyInitializedInNewProcess()at WatiN.Core.IE.CreateNewIEAndGoToUri(Uri uri,IDialogHandler logonDialogHandler,Boolean createInNewProcess)...
已经将Interop.SHDocVw.dll和Microsoft.mshtml.dll组件添加到bin目录(在项目引用中复制到输出).
从构建代理运行NUnit UI.这按预期运行单元测试.让我相信可能存在安全问题.Windows Server 2008 R2 Enterprise上的Runnint NUnit 2.0.5.
有谁有这个问题?
我是SpecFlow的新手,我正在为不同角色类型的经过身份验证的用户设置一些测试功能/方案.我是通过Coypu的浏览器自动化做到这一点的.
所以我在该功能中有一个后台步骤来设置该角色类型的用户的登录.
Background:
Given I am logged in as a ...some role I'm interested in...
Run Code Online (Sandbox Code Playgroud)
在功能中的每个场景之后,我想再次将用户注销(否则后台中的登录步骤将不适用于下一个场景 - 我在测试之间保持相同的Coypu浏览器实例打开).
我发现了[AfterScenario]我可以使用的注释,但是因为它涵盖了所有功能的所有场景(据我所知......),这会影响未经身份验证的用户的场景.
我可以[AfterScenario]使用[Scope(Feature="Some Feature")]我相信的范围,但我预计必须在我正在测试的许多功能之前和之后登录/注销,而且我并不热衷于使用一堆魔术字符串来指定所有这些功能.
所以我想知道我是否可以在Feature文件中添加一些东西,相当于Background,但是在该功能的每个场景之后运行.(或者,也许我为每个场景登录/退出的方式不是最好的方法吗?)
如何让我的TFS版本运行我的Specflow测试?我在本地VS构建中运行测试,但它们没有在TFS构建中被选中.请有人发布我将采取的步骤,让构建运行specflow测试,并报告结果.谢谢.
有没有办法AfterScenario在失败的情况下实现钩子来重新运行当前测试?
像这样的东西:
[AfterScenario("retry")]
public void Retry()
{
if (ScenarioContext.Current.TestError != null)
{
// ?
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我的项目中的测试结合在Ordered测试中并通过MsTest执行.
我刚刚添加了一个specflow功能,但生成的代码适用于NUnit.我更愿意使用Resharper来运行测试.
我从NuGet安装了specflow.我没有安装任何跑步项目.
以下是生成的.feature.cs示例
//
------------------------------------------------------------------------------ // <auto-generated> // This code was generated by SpecFlow (http://www.specflow.org/). // SpecFlow Version:1.9.0.77 // SpecFlow Generator Version:1.9.0.0 // Runtime Version:4.0.30319.18444 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //
------------------------------------------------------------------------------
#region Designer generated code
#pragma warning disable namespace Test.FeatureHanding {
using TechTalk.SpecFlow;
[System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.9.0.77")]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[NUnit.Framework.TestFixtureAttribute()]
[NUnit.Framework.DescriptionAttribute("Set Filter")
Run Code Online (Sandbox Code Playgroud) 使用SpecFlow运行测试时出现以下错误:
System.FormatException: Input string was not in a correct format.
Run Code Online (Sandbox Code Playgroud)
我花了一段时间才弄清楚它为什么会发生.
我在“警告:多步转换与输入匹配”步骤中收到错误。我可以将其关闭吗?
我的代码是
public class Transforms
{
[StepArgumentTransformation(@"\<([A-Za-z0-9\-]+)\>$?")]
public Object ApplyStringTransformations(string TestDataIdentifier)
{
GetData Test = new GetData();
var TestData = Test.ConvertData(TestDataIdentifier);
return TestData;
}
}
Run Code Online (Sandbox Code Playgroud)
在步骤文件中
[Then(@"I Login as a Member with ""(.*)"" and ""(.*)""")]
public void ThenILoginAsAMemberWithAnd(object p0,object p1)
{
Console.WriteLine(p0);
}
Run Code Online (Sandbox Code Playgroud) 我已经阅读了SpecFlow的入门教程.一切正常,除了我有@SpecRun测试,因为我还没有输入演示密钥.
但在我们的主项目中,我们使用NUnit而不是SpecFlow + Runner.所以我试图模仿那个项目.如果您使用NUnit,则不需要演示密钥.所以我将单元测试提供程序更改为:
<specFlow>
<unitTestProvider name="NUnit" />
</specFlow>
Run Code Online (Sandbox Code Playgroud)
我还将我的教程参考文献与主项目的参考文献进行了比较.我发现我可以拿出TechTalk.SpecRun,该项目仍然可以编译.当然需要TechTalk.SpecFlow.
如果我取出SpecRun.SpecFlowPlugin,除了@SpecRun之外没有测试显示,这是没有demo键的测试延迟.
我还在主项目中看到一个名为:SpecFlowNUnitExtension.cs的csharp文件.我带来了这个文件,但我的测试仍未显示在Visual Studio测试窗口中.注册此文件需要做些什么吗?
你们中有人知道可以关闭标题中提到的行为的解决方法吗?每次我在测试步骤中做错事时,异常都会如下所示:
Test method
FunctionalTests.Features.Parties.PartyAddingFeature.FeatureTitle threw exception:
TechTalk.SpecFlow.BindingException: Error calling binding method 'FunctionalTests:FunctionalTests.Steps.PartiesSteps.GivenLegacyPartyUpsertedIntegrationEventCameInWithData(String, Table)': Object of type 'System.String' cannot be converted to type 'System.Int32'.
at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) in D:\a\1\s\TechTalk.SpecFlow\Bindings\BindingInvoker.cs:line 69
at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) in D:\a\1\s\TechTalk.SpecFlow\Infrastructure\TestExecutionEngine.cs:line 395
at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance) in D:\a\1\s\TechTalk.SpecFlow\Infrastructure\TestExecutionEngine.cs:line 316
at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() in D:\a\1\s\TechTalk.SpecFlow\Infrastructure\TestExecutionEngine.cs:line 132
at FunctionalTests.Features.Parties.PartyAddingFeature.ScenarioCleanup()
at FunctionalTests.Features.Parties.PartyAddingFeature.FeatureTitle() in C:\Project\test\Services\FunctionalTests\Features\Parties\PartyAdding.feature:line 25
Run Code Online (Sandbox Code Playgroud) 我有以下规格流场景:
Scenario: CasingMentions
When User mentions everyone with <casing> casing
Then user should be able to see the message they just sent
Examples:
| casing |
| lower |
| mixed |
| upper |
Run Code Online (Sandbox Code Playgroud)
步骤定义如下,该方法只接受一个字符串:
[When(@"User mentions everyone with (.*) casing")]
Run Code Online (Sandbox Code Playgroud)
这运行完全正常,但在 Visual Studio 上的测试运行程序中,它显示有一个空参数,因此上述场景将作为 3 个单独的测试出现在测试运行程序中,名称如下:
CasingMentions("lower",null)
CasingMentions("mixed",null)
CasingMentions("upper",null)
Run Code Online (Sandbox Code Playgroud)
在 feature.cs 文件中,如下所示:
[NUnit.Framework.TestAttribute()]
[NUnit.Framework.DescriptionAttribute("CasingMentions")]
[NUnit.Framework.TestCaseAttribute("lower", null)]
[NUnit.Framework.TestCaseAttribute("mixed", null)]
[NUnit.Framework.TestCaseAttribute("upper", null)]
public virtual void CasingMentions(string casing, string[] exampleTags)
{
Run Code Online (Sandbox Code Playgroud)
我认为它与步骤定义无关,因为我可以将示例粘贴到不带参数的场景中,并且它仍然会执行此操作
这是显示我遇到的问题的视频:https://youtu.be/vC87WMFfJ4Y ?t=438
有什么办法可以摆脱空值吗?对于我使用示例表的每个场景都会发生这种情况,并且如果我使用场景或场景大纲似乎没有什么区别。如果这很重要的话,我正在使用 NUnit 作为我的测试运行程序。
我还尝试添加一个具有唯一值的额外列来尝试以这种方式命名测试用例,但它们只是作为括号中的另一个参数出现。