上下文
我对.NET比较陌生,决定在项目中使用BDD。我正在使用Specflow。
我使用Gherkin格式创建了一个特征文件并生成了步骤定义。
我正在使用Selenium将我的功能文件中的表格中的信息插入到网页中,我正在使用MSTest来测试结果。
我的步骤定义
[Binding]
public class RegisterSteps
{
private IWebDriver ff = new FirefoxDriver();
private string username = "";
[Given(@"you are on the register page")]
public void GivenYouAreOnTheRegisterPage()
{
ff.Navigate().GoToUrl("http://localhost:55475/Register");
}
[Given(@"you enter the following information")]
public void GivenYouEnterTheFollowingInformation(TechTalk.SpecFlow.Table table)
{
username = table.Rows[6]["Value"];
for (var i = 0; i < table.RowCount; i++)
{
var field = table.Rows[i]["Field"];
var value = table.Rows[i]["Value"];
field = "mainContentPlaceHolder_TextBox" + field.Replace(" ", string.Empty);
ff.FindElement(By.Id(field)).SendKeys(value);
}
}
[When(@"you click submit")]
public void WhenYouClickSubmit()
{
ff.FindElement(By.Id("mainContentPlaceHolder_Submit")).Click();
}
[Then(@"you should see the message ""(.*)""")]
public void ThenYouShouldSeeTheMessage(string expectedMessage)
{
string message = ff.FindElement(By.Id("mainContentPlaceHolder_LabelSuccess")).Text;
Assert.AreEqual(message, expectedMessage);
}
[Then(@"a record should be added to the table")]
public void ThenARecordShouldBeAddedToTheTable()
{
RiskClassesDataContext db = new RiskClassesDataContext();
var query = from ao in db.ActionOwners
where ao.username.Equals(username)
select ao;
Assert.IsNotNull(query.First());
}
}
问题
我希望能够在我的步骤定义中使用Linq来检查记录是否被插入到各种表中。上面的代码在NullReferenceException
的构造函数上抛出RiskClassesDataContext()
。我以前能够创建RiskClassesDataContext的实例,所以我想知道这是因为我是想从我的Specflow项目而不是从我的Web应用程序中执行此操作。
我的最后一个问题是您是否认为这是测试我的项目的最佳方法。是否有数据库查询的selenium可以测试我的整个项目,或者我最好使用说Moq。或者两者兼而有之?
非常感谢
答案 0 :(得分:1)
简短答案
RiskClassesDataContext
的代码才能确定,但是,最可能的原因是因为您在连接数据库时丢失了某些内容。长答案
为了确定这是否是 Best 测试方式,您真的需要考虑尝试实现哪种类型的测试。
现在,你可能会对自己说,你想要所有这些,或者它们都是一样的,但实际上这里有一些微妙的不同之处。
这里的要点是SpecFlow可以用于所有这些事情。
如果您正在尝试正确地进行BDD,那么实际上您已与您的业务代表坐在一起,并且在您和您之间,您已经为您正在考虑实施的功能制定了许多方案。当然,在考虑您的代码之前,您已经完成了这项工作。所以我们不会将我们的想法锁定到任何一个实现:-)现在你可以坐下来实现你的绑定,以便它们失败。
但接下来呢?当然,在这一点上,我们想要编写一些新代码,因为我们是优秀的开发人员,所以我们使用TDD来帮助我们。由于我们是单元测试,因此我们使用Mocks来帮助我们隔离每个代码单元。这导致我们的代码发展,以便在编写一些单元测试之后,我们的SpecFlow测试也会通过。
这导致我们使用我们的规范示例测试作为外部流程,定义我们的新功能和单元测试是内部循环,推动代码走向成功。双红绿重构循环。此外,这意味着我们的SpecFlow测试范围更大,并且可以包括对该数据库的访问。
现在,如果我们回到我们的问题
尝试this article了解更多详情。
最后一点,如果您在测试中使用数据库,则必须考虑如何在多次测试运行中将其隔离。有关此
的更多想法,请查看using-specflow-for-wpf-in-mvvm