我知道单元测试应该完全相互独立,这意味着操作顺序永远不会很重要。
如何处理通过网络加载大型文档的测试场景,还需要其他测试来验证所述文档的信息?
我不希望为每个测试请求的文档必须检查这个或那个。
如果文档存储为测试类的静态成员,和首先运行提取它的初始测试,它可以正常工作。然后随后的测试都可以用缓存的副本做自己的事情。
但是,再次,单元测试的操作顺序是错误的,因为它们应该是独立的。
在这种情况下,最佳做法是什么?我更喜欢将它们全部作为单独的测试,而不是集成到一个单独的大型测试中,该测试可以在文档被提取后断言各种各样的事情。
我目前的情况是Visual Studio 2015 Update 3和C#,但我想它可以应用于任何类似的设置。
在Visual Studio的测试运行器中,您可以设置“播放列表”,让您按顺序运行它们,但它仍然感觉不对。
编辑:我倾向于静态方法,在这种情况下,每个测试都必须通过单个方法获取文档。我猜一个单例类型的方法(如果为null,去获取它,否则返回它)。
但任何反馈都很好。
答案 0 :(得分:3)
最好的选择是不要通过网络获取文档bundle it as part of the test payload.
话虽这么说,如果您需要在启动时发生一次逻辑,您可以在测试程序集加载时运行一次的测试中添加[AssemblyInitialize]
。你可以在那里进行测试配置。
[TestClass]
public class GlobalTestData
{
private static byte[] _document;
public static byte[] Document
{
get
{
return (byte[])_document.Clone();
}
}
[AssemblyInitialize()]
public static void DownloadDocument(TestContext context)
{
_document = DownloadDocument();
}
private static byte[] DownloadDocument()
{
//...
}
}
只需将上面的类放到项目中,然后任何测试都可以使用GlobalTestData.Document
并获得字节[]的新的未更改的副本。
答案 1 :(得分:1)
单元测试单独测试事物。如果您通过网络连接获取文档,则不会将其隔离。尝试模拟文档的服务。
您也可以按照Brian在评论或[TestInitialize]
静态方法中建议的[ClassInitialize]
方法获取文档,并将其存储在局部变量中,区别在于{{1只有在第一次测试运行之前,才会在每次测试之前运行TestInitialize
。
更新:
如果您需要适当的测试文档,那么您正在研究集成测试。在我看来,如果多个系统必须协同工作,集成测试完全可以依赖于彼此,因为它们会检查正确的行为。只要确保它们与单元测试不在同一个类中,因为它们应该快速且独立于运行。