我被分配了测试数据库的任务。它是一个测试数据库,我们可以做任何我们想做的事情并轻松回滚。我已经接受了这项任务,因为我们仍处于设计阶段(意味着项目的任何时间点都可能发生任何变化......将Person.FirstName列重命名为[First_Name],然后将其重命名为[ [名字]。我的目标是粗略估计我们在做出改变时会遇到什么样的痛苦,以便我们可以提前做好计划。我们也可以在生产过程中期待这些变化。< / p>
我列表中的项目已经编写了以下测试:
发送单词null(不是文字null但是“null”)因为使用动态SQL它可以翻出来认为你的意思是null。我们发现了这一点,因为名字为“null”的人导致抛出异常。
使用单引号,因为动态SQL不可能是单引号。同样,名字中有一个人造成了崩溃。
之前从未这样做过,这就是我所知道的所有可能崩溃的事情。还有其他想法吗?我们正在尝试模拟用户可能输入的数据。
编辑1:我们的问题是我们有一个搜索屏幕,大约有25个可以搜索的字段。这些搜索字段中的一些是简单的(例如,名字),一些不太简单(类别1的日期小于2但是类别2的日期大于2或者在任何时间段都具有类别4)。搜索屏幕允许用户使用这25个字段中的每一个选择不同的oeprator和谓词。有没有比动态SQL更好的方法来处理这个问题?我处在一个位置和一个时间点,如果它更好,我们可以改变一些不同的东西。
编辑2:我不知道是否值得一提,但我们使用LINQ来访问存储过程。我的研究表明动态LINQ不会像动态SQL查询那样做我们需要做的事情。可能是错的。
答案 0 :(得分:4)
“'; Drop Table Person; - ”会导致崩溃吗?
您应该考虑将策略从动态SQL转移到参数化查询,以避免SQL注入技术。
对于数据库的C#测试,您可以使用事务化查询和nUnit进行时尚单元测试。严格来说,单元测试应该将您的应用程序与数据存储区分开,以便可以测试组件部分,而不会受到访问和修改数据存储的性能损失。但是,您可以使用非常类似的技术来测试您的数据存储,如果这是您的决定。在TestFixtureSetup中创建事务并在TestFixtureTearDown中将其回滚,这样您的数据库将在测试完成后恢复到原始状态。
您当然应该意识到以这种方式测试数据存储时会有性能损失。您的单元测试将不会像您的应用程序的其余部分那样执行 - 假设您的应用程序的其余部分已经过性能调整。