我正在编写我的第一个MSpec规范,我想要一些指导.我将规范保留在"待处理"状态,但上下文已填写完整.有什么改进吗?
作为参考,这是故事和第一个场景:
Story: "Blog admin logs in to the system"
As a blog writer
I want to be able to log in to my blog
So that I can write posts and administer my blog
Scenario: "Logs in from the login page"
Given the user enters in correct credentials for a user in the system
When the user clicks the "Login" button
Then log the user in and redirect to the admin panel with a message
stating that he logged …Run Code Online (Sandbox Code Playgroud) 我一直在使用MSpec编写我的单元测试,并且更喜欢BDD风格,我认为它更具可读性.我现在正在使用MSpec不支持的Silverlight,所以我不得不使用MSTest,但仍然希望保持BDD风格,所以我想尝试一种方法来做到这一点.
只是为了解释我想要实现的目标,这就是我如何编写MSpec测试
[Subject(typeof(Calculator))]
public class when_I_add_two_numbers : with_calculator
{
Establish context = () => this.Calculator = new Calculator();
Because I_add_2_and_4 = () => this.Calculator.Add(2).Add(4);
It should_display_6 = () => this.Calculator.Result.ShouldEqual(6);
}
public class with_calculator
{
protected static Calculator;
}
Run Code Online (Sandbox Code Playgroud)
因此,对于MSTest,我会尝试像这样编写测试(虽然你可以看到它不起作用,因为我已经输入了2个TestInitialize属性,但是你得到了我正在尝试做的...)
[TestClass]
public class when_I_add_two_numbers : with_calculator
{
[TestInitialize]
public void GivenIHaveACalculator()
{
this.Calculator = new Calculator();
}
[TestInitialize]
public void WhenIAdd2And4()
{
this.Calculator.Add(2).Add(4);
}
[TestMethod]
public void ThenItShouldDisplay6()
{
this.Calculator.Result.ShouldEqual(6);
}
}
public class with_calculator
{
protected Calculator Calculator {get;set;} …Run Code Online (Sandbox Code Playgroud) 我继承了一个庞大且相当复杂的状态机.它有31种可能的状态,都是真正需要的(大业务流程).它有以下输入:
将其分解为单独的状态机似乎不可行,因为每个状态都是不同的.我为最常见的输入编写了测试,每个输入有一个测试,所有输入都是常量,除了State.
[Subject("Application Process States")]
public class When_state_is_meeting2Requested : AppProcessBase
{
Establish context = () =>
{
//Setup....
};
Because of = () => process.Load(jas, vac);
It Current_node_should_be_meeting2Requested = () => process.CurrentNode.ShouldBeOfType<meetingRequestedNode>();
It Can_move_to_clientDeclined = () => Check(process, process.clientDeclined);
It Can_move_to_meeting1Arranged = () => Check(process, process.meeting1Arranged);
It Can_move_to_meeting2Arranged = () => Check(process, process.meeting2Arranged);
It Can_move_to_Reject = () => Check(process, process.Reject);
It Cannot_move_to_any_other_state = () => AllOthersFalse(process);
}
Run Code Online (Sandbox Code Playgroud)
没有人完全确定每个状态和输入集的输出应该是什么.我已经开始为它编写测试了.但是,我需要写一些像4320测试(30*2*2*2*3*3*2)的东西. …
我正在尝试开始使用BDD并找到关于MSpec和SpecFlow的视图博客文章.我目前还不太确定何时使用哪个以及这两个框架的优点/缺点是什么.
看一下文档,似乎MSpec使用了上下文规范样式,而SpecFlow使用了Given/When/Then样式.我也不介意,但我想知道,当项目/测试套件增长时,是否有任何陷阱需要留意.
基本上,在每天工作中使用它的人的一些真实世界建议/反馈将是伟大的.
刚刚发现了MSpec,想要尝试一下.但是,我找不到任何详细的文档,除了一些快速教程 - 它们是否存在?
可能重复:
单元测试的SpecFlow/BDD?
在过去的几年里,我使用NUnit/Moq在TDD工作,在过去的几个月里,我一直在使用mSpec来处理BDD.
到目前为止这么好,但我们现在希望更多地转向基于验收标准的测试,其中涉及业务分析师,我们在开发过程中获得了外部.
所以现在我们已经预定义了Gherkin语法文件,并且使用specflow感觉它是正确的工作方式.
但是,在具有预定义Gherkin文件的单元测试级别将违背我对TDD的理解.换句话说,你的设计随着行为的不断深入改进你的设计.
由于我们正在使用外部方法,现在在单元测试级别可能是我们现在拥有现在可用于驱动我的单元测试的规范/行为(只是感觉它与我一直在做TDD的方式相反) )?
之前这些文件对验收测试很重要,但作为开发人员,我将独自工作,除非我使用SpecFlow,否则它们不是必需的.
当我们使用mspec时,我们在具有GWT文件的单元测试级别有什么好处?开发人员应该能够跳转到代码并阅读测试,或者只是运行测试运行器以查看它在做什么.
TIA JD
我正在学习使用ASP.NET MVC的行为驱动开发,并且基于Steve Sanderson的一篇文章,了解BDD至少可以表示以下测试类型:代码和UI交互的单个单元.这篇文章提到了类似的东西.如果我需要单元测试和集成测试,是否需要两个不同的测试框架?
使用上下文/规范框架(如MSpec)对存储库,控制器和服务进行单元测试.使用它进行测试的结果对开发团队很有用.
使用给定的/ when/then框架测试完整的行为(集成),例如使用Watin的SpecFlow.此测试的结果对我的客户非常有用.
到目前为止我使用BDD看到的视频仅限于在不测试存储库,控制器等行为的情况下测试实体的行为......是否有一个示例项目,我可以看到自动单元和集成测试使用BDD方法?
使用MSpec可以创建数据驱动的测试吗?
例如,NUnit具有允许多个数据驱动案例的TestCase属性.
[TestFixture]
public class ExampleOfTestCases
{
[TestCase(1,2,3)]
[TestCase(3,3,6)]
[TestCase(2,2,4)]
public void when_adding_two_numbers(int number1, int number2, int expected)
{
Assert.That(number1 + number2, Is.EqualTo(expected);
}
}
Run Code Online (Sandbox Code Playgroud) 在MSpec中,有一个简洁的功能,允许您在多个测试之间共享断言.他们被称为"行为"
行为定义了可重用的规范,这些规范封装了一组特定的,你猜对了的行为; 然后,您可以在任何具有特定行为的上下文中包含这些规范.
您将它们定义为具有断言(It字段)的类
public class VehicleThatHasBeenStartedBehaviors
{
protected static IVehicle vehicle;
It should_have_a_running_engine = () => vehicle.IsEngineRunning.ShouldBeTrue();
It should_be_idling = () => vehicle.RevCount.ShouldBeBetween(0, 1000);
}
Run Code Online (Sandbox Code Playgroud)
并将它们包含在您的测试类中
public class when_starting_a_car
{
Behaves_like<VehicleThatHasBeenStartedBehaviors> a_started_vehicle;
}
Run Code Online (Sandbox Code Playgroud)
如何使用NUnit完成相同的操作?