【发布时间】:2011-11-25 10:36:44
【问题描述】:
您通常如何描述和实施场景的“给定”步骤?
- 高级状态描述或显式数据定义?
- 填充数据库或存根存储库?
高级状态描述
Given I have 4 products
When I look for best-selling products
Then I see top 3 products with maximum number of sales
专业版
- 不脆
- 易于阅读和理解业务目标
缺点
- 不清楚我们需要什么数据
显式数据定义
Given I have following products:
| Name | Sales number |
| Beer | 20 |
| Pizza | 5 |
| Socks | 3 |
| Toilet paper | 100 |
When I look for best-selling products
Then I see following products:
| Name | Sales number |
| Toilet paper | 100 |
| Beer | 20 |
| Pizza | 5 |
专业版
- 易于实施(明确需要哪些数据)
缺点
- 难以阅读和理解业务目标
- 更脆
填写数据库
using (var connection = new SqlConnection(connectionString))
{
using (var deleteCommand = new SqlCommand("DELETE FROM Products", connection))
{
connection.Open();
deleteCommand.ExecuteNonQuery();
}
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Products", connection);
DataSet data = new DataSet();
adapter.Fill(data);
foreach (var specFlowRow in table.Rows)
{
DataRow dataRow = data.Tables[0].Rows.Add();
dataRow["Name"] = specFlowRow["Name"];
}
adapter.Update(data);
}
专业版
- 作为集成测试的规范(我们使用端到端系统)
缺点
- 我们需要在代码之前创建数据库表(数据驱动的方法)
- 慢
- 易碎
- 难以实施
存储库存根
// or get stubbed repository from DI framework
productsRepository = new InMemoryProductsRepository();
// or use specflow assist helpers
foreach (var specFlowRow in table.Rows)
productsRepository.Save(new Product(specFlowRow["Name"]));
专业版
- 我们可以先做代码
- 快速
- 不易碎(易于更换)
- 易于实施
缺点
- 我们没有证据表明功能已实现
这就是我对可能方式的看法 :) 您以什么方式定义和实施“给定”步骤? 谢谢!
【问题讨论】:
标签: c# tdd integration-testing bdd specflow