标签: unit-test

存储过程的单元测试

我已经考虑这个问题很久了。

基本问题是:如何对存储过程进行单元测试?

我发现我可以相对轻松地为经典意义上的函数设置单元测试(我的意思是它们获得零个或多个参数并返回一个值)。但是,如果我考虑一个看似简单的过程在某处插入一行的真实示例,在插入之前或之后有几个触发器执行此操作,甚至定义“单元”的边界也非常困难。我应该只测试INSERT本身吗?我认为这相当简单——价值相对较低。我应该测试整个事件链的结果吗?除了这是否是单元测试的问题外,设计一个合适的测试可能是一项非常艰巨的工作,在此过程中会出现许多额外的问号。

然后是不断变化的数据的问题。在UPDATE影响的不仅仅是几行的情况下,每个可能受影响的行都必须以某种方式包含在测试用例中。DELETEs 等等的进一步困难。

那么如何对存储过程进行单元测试呢?复杂性中是否存在一个完全没有希望的门槛?维护需要哪些资源?

编辑还有一个小问题,基于 AlexKuznetsov 的回答:或者是否存在一个完全无用的阈值?

best-practices unit-test

44
推荐指数
4
解决办法
3万
查看次数

如何在 PostgreSQL 中为单元测试伪造 inet_client_addr()?

我有一个简单的存储过程,其返回值取决于inet_client_addr(). inet_client_addr()在测试我的存储过程时,如何为了单元测试的目的而覆盖?

到目前为止,我想出的唯一解决方案是围绕inet_client_addr()以下内容创建一个包装函数:

CREATE FUNCTION my_inet_client_addr() RETURNS INET AS $$
    SELECT inet_client_addr();
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

然后在我的函数中使用它:

CREATE local_connection() RETURNS BOOLEAN AS $$
    SELECT my_inet_client_addr() = '127.0.0.1';
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

然后在我的单元测试中,我可以重新定义my_inet_client_addr()

BEGIN;
SELECT PLAN(2);
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
    SELECT '127.0.0.1'::INET;
$$ LANGUAGE sql;

is(local_connection(),TRUE,'Connection from 127.0.0.1 is local');

REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
    SELECT '192.168.1.1'::INET;
$$ LANGUAGE sql;

is(local_connection(),FALSE,'Connection from 192.168.1.1. is not local');

ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有包装功能的情况下完成相同的任务my_inet_client_addr()

postgresql stored-procedures unit-test

8
推荐指数
1
解决办法
689
查看次数

每个连接的临时架构?

我正在尝试将我的单元测试从 H2 迁移到 Postgresql。

目前,H2 为我提供了一个内存模式,这样每个连接都映射到一个唯一的模式、创建表、运行测试并删除模式。模式创建和销毁由 H2 自动处理。

单元测试同时运行。

在 Postgresql 中执行此操作的最佳方法是什么?具体来说,

  1. 如何获得每个连接的唯一架构?
    • 测试框架应该生成唯一的名称还是有一个内置的机制来做到这一点?
  2. 如何确保在断开连接时删除架构?
    • 当单元测试被终止时,我不想以悬空模式结束。
  3. 什么方法会产生最高的性能?
    • 我需要每秒创建/删除数十个模式。

更新:我在这里找到了一个相关的答案但它无法删除模式,以防运行单元测试的进程被杀死。

postgresql unit-test

8
推荐指数
2
解决办法
1万
查看次数

postgres 程序的测试驱动设计

我希望引入一种测试驱动的设计风格来为 postgresql 数据库实现编写我的存储过程。

我已经看到pgTap是一个流行的 postgres 单元测试工具,并且正确地允许测试用 SQL 编写,而不是在外部构建和运行。

为了走得更远,我还希望能够使用测试替身(存根、模拟、假、虚拟),甚至可能使用一些 IDE 支持运行和重构(类似于tsql

当前是否有专门用于在 postgres 中支持 TDD 的工具和资源,或者人们是否通过构建假表和数据并将所有内容包装在完成时回滚的事务中来推出自己的工具和资源?

目前在 postgres 中接近 TDD 的最佳实践是什么?

postgresql unit-test design-pattern

7
推荐指数
1
解决办法
990
查看次数

将特定列导出到 INSERT 语句

有没有办法将表中的特定列和固定数量的行导出到 INSERT 语句?

我正在尝试基于大型生产表为单元测试生成这些,因此在 SQL Server Management Studio 中使用“生成脚本”之类的东西是不可能的。

有一些工具可以做到这一点,但在 MySQL 中如此微不足道的东西在 SQL Server 中不应该那么复杂(至少我不希望如此)。

sql-server t-sql unit-test

6
推荐指数
1
解决办法
1万
查看次数

PostgreSQL 可以通过某种一次性覆盖来支持集成测试吗?

编写包含数据库的集成测试是一个常见问题。如果测试更改了数据库,那么它可能会影响其他测试或下一次运行。

我知道我可以将我的测试包装在一个事务中并在测试运行后回滚该事务。但是如果 PostgreSQL 能够提供某种全局快照或一次性覆盖,那就太好了。在理想情况下,这样的功能将涵盖数据库的所有状态,包括模式和存储过程。

postgresql testing snapshot unit-test integration

5
推荐指数
1
解决办法
1153
查看次数

优化 MySQL 5.6 的单元测试

我们有一个用于单元测试的 MySQL 实例。我们的单元测试主要针对 MySQL。因此,我们将/var/lib/mysqldir放在tmpfs文件系统中,因为我们在单元测试中不需要持久数据。

当我们这样做时,我们的表现达到了顶峰;但是,我想咨询一下您在这种情况下MySQL的最佳配置是什么。

将 MySQL 放入tmpfs(内存)并运行单元测试等不重要的内容是很常见的。问题是:InnoDB 运行的最佳配置是什么tmpfs

这些是我们的配置my.cnf

max_connections=350
innodb_fast_shutdown=2
innodb_log_file_size=1048576
innodb_doublewrite=0
innodb_flush_method=O_DIRECT
Run Code Online (Sandbox Code Playgroud)

我们所有的数据库都在 InnoDB 中。我们不介意丢失一些数据。

PS 你可能会问,为什么不使用MEMORY引擎呢?这是因为MEMORY只有表级锁定,我们的部分单元测试就是基于此。

编辑:我们已经完成了这个项目,我们的配置基于这篇博文: http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

mysql performance configuration unit-test mysql-5.6

5
推荐指数
1
解决办法
1067
查看次数

在 SQL SSDT 单元测试中重新初始化表值

我正在创建 SQL Server 单元测试。我们正在测试各种存储过程。

在单元测试原则中,设置一个小的数据库表,填充值,拆除(截断/删除)数据库表,并为每个测试重新设置是一个很好的做法。这样每个单元测试都会有一个干净的环境来验证插入、选择、更新、删除等的 sproc,

有没有人在哪里或如何在 Sql 单元测试中重新初始化表值?SQL SSDT VS 2017 中的单元测试资源非常新,所以我认为很多人都在试图弄清楚和理解。

随意在下面显示或添加图片。

http://www.sqlservercentral.com/articles/Unit+Testing/155651/ http://www.erikhudzik.com/2017/08/23/writing-sql-server-unit-tests-using-visual-studio- nunit-and-sqltest/

Visual Studio SSDT 中的图片:

在此处输入图片说明

此外,尝试在 SQLDatabaseSetup.cs 中查看此类:

 [TestClass()]
    public class SqlDatabaseSetup
    {

        [AssemblyInitialize()]
        public static void InitializeAssembly(TestContext ctx)
        {
            // Setup the test database based on setting in the
            // configuration file
            SqlDatabaseTestClass.TestService.DeployDatabaseProject();
            SqlDatabaseTestClass.TestService.GenerateData();
        }

    }
}


using Microsoft.Data.Tools.Schema.Sql.UnitTesting;
Run Code Online (Sandbox Code Playgroud)

sql-server visual-studio unit-test ssdt sql-server-2016

5
推荐指数
1
解决办法
505
查看次数

不能在用户事务中使用 DROP DATABASE 语句

不确定这个问题是否属于这里,但我希望有人能帮助我。

我已经对数据库进行了集成测试(使用 mssql localDB)。我希望每个测试都使用它自己的数据独立运行 - 我想在每个测试运行之前用我的假数据重新植入数据库。我试图用事务来实现它,但没有成功。这是我尝试将其关闭的方法:

public class TestDbInitializer : DropCreateAlways<MyContext>()
{
    public static List<Item> Items;

    public override Seed(DbContext context)
    {
        Items = new List<Item>();

        // Adding items
        // .. 

        Items.ForEach(x => context.Add(x));

        context.SaveChanges();
    }
}


public class BaseTransactionsTests
{
    private TransactionScope _scope

    [TestInitialize]
    public void Initialize()
    {
        _scope = new TransactionScope();
    }

    [TestCleanup]
    public void Cleanup()
    {
        _scope.Dispose();
    }
}

[TestClass]
public class IntegrationTests : BaseTransactionsTests

private IDependenciesContainer _container;

public static void AssemblyInit(TestContext context)
{
    Database.SetInitializer(new TestDbInitializer());

    _container = …
Run Code Online (Sandbox Code Playgroud)

sql-server testing c# unit-test sql-server-localdb

4
推荐指数
1
解决办法
4080
查看次数

@RC 在 SSDT SQL Server 单元测试中是什么意思?

在 Sql Server 单元测试、SSDT 中,@RC 代表什么?它是指行数还是行列?团队想了解,我们已经使用它很长时间了,很好用的工具,只是好奇。

在此处输入图片说明

在此处输入图片说明

sql-server visual-studio unit-test ssdt sql-server-2016

3
推荐指数
1
解决办法
761
查看次数

编写一个慢 SQLITE 查询来测试超时

是否可以编写一个运行时间超过 5 秒的“简单”SQLite 查询。

我正在我的应用程序中编写一些单元测试来记录慢查询,为此,我想要一个我知道运行时间超过 5 或 10 秒的慢查询,(并创建一个警告来引发/记录) .

我正在考虑创建 10 个表,每个表中有 10 个条目,并对所有表进行连接选择。
但我不确定这是否是测试慢选择(而不是大返回集)的好方法。

sqlite unit-test

1
推荐指数
1
解决办法
586
查看次数