单元测试sql字符串
本文关键字:字符串 sql 单元测试 | 更新日期: 2023-09-27 18:13:09
短问题
是否有一些东西可以运行sql命令,有join和where,而不是DB
长的问题
我把一个棕色的领域赢得表单应用程序的单元测试。我可以完全自由地选择使用哪种单元测试框架
我的问题是有大量的SQL字符串语句在代码中。像这样想
SELECT *
FROM Sale
INNER JOIN SaleItem ON Sale.ID = SaleItem.SaleID
WHERE ID = 5
它是参数化的,并且有IF语句来构建where,因此它可能是CustomerId = 5或DispatchDate在去年的位置。这个查询比这个大很多,我想检查一下所有的连接是否有效所有可能的地方都有效。你认为这可能是我看细节太多了吗
我不想管理一个数据库的数据,如果数据改变,它会破坏测试,我害怕这将会发生,人们会杀死测试。
我想运行这个sql对一些对象或东西,这不是一个数据库,并得到一个项目。它必须足够聪明,能够进行过滤。因此,如果Sale对象类似于下表,它将只返回ID为5的对象。
ID DateDispatched CustomerID
1 1/1/1 5
2 2/2/2 6
5 3/3/3 7
我想过在数据集和XML上运行sql命令,并意识到这是行不通的。我想LINQ在过去的几年里把我宠坏了,因为我不知道怎么做。我担心有太多的逻辑构建大量的SQL语句,我不得不对它们进行一些测试。
如果你能推荐一个好的单元测试框架,我更愿意听到其他的选择,比如将SQL移动到数据库中的存储过程。
现在我不喜欢在应用程序中构建SQL,并希望将其更改为实体框架,但这是一个10岁的应用程序,这不是一个选择。
好的,一些快速编辑数据库是在SQL Server 2012上,所以存储过程是一个选项,因为在某些地方他们使用存储过程。
你有一个winform应用程序,你正在写单元测试这一点。但是如果你进行测试,你会担心它会击中DB和破坏数据。所以你需要一些机制来运行您的单元测试,但不会击中实际的数据库。正确吗?
如果我得到你的问题是正确的,我建议分离你的数据库交互逻辑,使其接口驱动。然后可以创建模拟对象,在其中定义数据库交互接口的期望。例如,如果调用某个GetSales()方法,该方法应该返回什么?等等......分享一些关于单元测试和模拟细节的链接。
https://msdn.microsoft.com/en-us/library/ff650441.aspx https://github.com/Moq/moq4 http://www.developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/测试MVC控制器失败NULL引用异常
SQLite数据库就是为这种需求而设计的。
数据库是一个简单的文件。数据库驱动程序读取和写入这个文件。您可以对数据库运行所有您习惯的SQL查询等等。(但是,如果您的SQL使用特定于SQL Server的语言或语法,则可能会出现问题。)
的确,你必须管理一个充满数据的"数据库"。但是你应该能够:
- 编写一个脚本,快速设置所有的表。你可能已经有一段代码用相同的模式创建了一个数据库,或者你可能能够自动转储一个数据库。
- 将一些测试数据保存在CSV, SQL文件或类似文件中。这并不容易,但是非常非常有用。您应该添加最小值,并且只根据测试要求构建它。
- 检查整个SQLite数据库文件到源代码控制,如果你喜欢。
谢谢你的问题——最近我一直在思考很多关于可测试数据库代码的问题,直到你的问题让我意识到我已经知道了,我才找到了解决这类问题的方法。
在我看来,从长远来看,有三种方法可以使这种测试尽可能地无痛:
- 使用ORM或其他包装层,如您提到的实体框架。这意味着在测试时,你根本不需要一个"真正的数据库"——只需要一个包装器的测试副本。
- 只使用标准的可移植SQL,如JOIN, SELECT等,没有什么不能在SQLite数据库上运行。这可能是非常受限的,因为不同DBMS之间的类型差异很大。
- 将SPs专用为数据库接口。这意味着您的测试double只需要识别正在调用的SP,并正确响应它。我个人不喜欢这种方法,因为我认为许多未经测试、未版本的业务逻辑最终会出现在sp中。
这是我们使用MS test进行单元测试的选项
使用来自系统的TransactionScope。交易名称空间在TestInitialize方法中创建事务的实例,并在TestCleanup方法中处理它。您可以在测试初始化方法中或在单个测试方法
中对数据库进行插入。[TestCleanup]
public void testClean()
{
_Trans.Dispose();
}
[TestInitialize]
public void testInit()
{
_Trans = new TransactionScope();
}
[TestMethod]
public void TestQuery()
{
// arrange
//' insert data
// act
Obj Target = Obj.New();
// Assert
Assert.AreEqual("someValue",Obj.SomeProperty);
}
好吧,我引用了一句老话:如果你不能改变你的雇主,那就改变你的雇主。
我认为tsqlt http://tsqlt.org/最适合这个问题。
As实体框架是不允许的,他们有这么多的依赖表。这将允许我模拟表将所有逻辑移动到存储过程并模拟表。有点混合了瑜伽士和JWG的答案。