我已经考虑这个问题很久了。
基本问题是:如何对存储过程进行单元测试?
我发现我可以相对轻松地为经典意义上的函数设置单元测试(我的意思是它们获得零个或多个参数并返回一个值)。但是,如果我考虑一个看似简单的过程在某处插入一行的真实示例,在插入之前或之后有几个触发器执行此操作,甚至定义“单元”的边界也非常困难。我应该只测试INSERT本身吗?我认为这相当简单——价值相对较低。我应该测试整个事件链的结果吗?除了这是否是单元测试的问题外,设计一个合适的测试可能是一项非常艰巨的工作,在此过程中会出现许多额外的问号。
然后是不断变化的数据的问题。在UPDATE影响的不仅仅是几行的情况下,每个可能受影响的行都必须以某种方式包含在测试用例中。DELETEs 等等的进一步困难。
那么如何对存储过程进行单元测试呢?复杂性中是否存在一个完全没有希望的门槛?维护需要哪些资源?
编辑还有一个小问题,基于 AlexKuznetsov 的回答:或者是否存在一个完全无用的阈值?
我有一个简单的存储过程,其返回值取决于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()?
我正在尝试将我的单元测试从 H2 迁移到 Postgresql。
目前,H2 为我提供了一个内存模式,这样每个连接都映射到一个唯一的模式、创建表、运行测试并删除模式。模式创建和销毁由 H2 自动处理。
单元测试同时运行。
在 Postgresql 中执行此操作的最佳方法是什么?具体来说,
有没有办法将表中的特定列和固定数量的行导出到 INSERT 语句?
我正在尝试基于大型生产表为单元测试生成这些,因此在 SQL Server Management Studio 中使用“生成脚本”之类的东西是不可能的。
有一些工具可以做到这一点,但在 MySQL 中如此微不足道的东西在 SQL Server 中不应该那么复杂(至少我不希望如此)。
编写包含数据库的集成测试是一个常见问题。如果测试更改了数据库,那么它可能会影响其他测试或下一次运行。
我知道我可以将我的测试包装在一个事务中并在测试运行后回滚该事务。但是如果 PostgreSQL 能够提供某种全局快照或一次性覆盖,那就太好了。在理想情况下,这样的功能将涵盖数据库的所有状态,包括模式和存储过程。
我们有一个用于单元测试的 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/
我正在创建 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) 不确定这个问题是否属于这里,但我希望有人能帮助我。
我已经对数据库进行了集成测试(使用 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) 是否可以编写一个运行时间超过 5 秒的“简单”SQLite 查询。
我正在我的应用程序中编写一些单元测试来记录慢查询,为此,我想要一个我知道运行时间超过 5 或 10 秒的慢查询,(并创建一个警告来引发/记录) .
我正在考虑创建 10 个表,每个表中有 10 个条目,并对所有表进行连接选择。
但我不确定这是否是测试慢选择(而不是大返回集)的好方法。
unit-test ×11
postgresql ×4
sql-server ×4
ssdt ×2
testing ×2
c# ×1
integration ×1
mysql ×1
mysql-5.6 ×1
performance ×1
snapshot ×1
sqlite ×1
t-sql ×1