单元测试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上,所以存储过程是一个选项,因为在某些地方他们使用存储过程。

单元测试sql字符串

让我试着理解你的问题。

你有一个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数据库文件到源代码控制,如果你喜欢。

谢谢你的问题——最近我一直在思考很多关于可测试数据库代码的问题,直到你的问题让我意识到我已经知道了,我才找到了解决这类问题的方法。

在我看来,从长远来看,有三种方法可以使这种测试尽可能地无痛:

  1. 使用ORM或其他包装层,如您提到的实体框架。这意味着在测试时,你根本不需要一个"真正的数据库"——只需要一个包装器的测试副本。
  2. 只使用标准的可移植SQL,如JOIN, SELECT等,没有什么不能在SQLite数据库上运行。这可能是非常受限的,因为不同DBMS之间的类型差异很大。
  3. 将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的答案。