在单元测试中使用xml转换

时间:2012-10-12 20:28:01

标签: c# visual-studio-2010 unit-testing slowcheetah xslt

背景:

目前,我们有大约10个单元/集成测试项目,它们可以访问数据库进行测试。命中数据库的每个测试类都继承自名为IntegrationTest的类,该类位于名为TestBase的单独dll中。 TestBase包含一个配置文件(nhibernate_log4net.cfg.xml),用于存放数据库的连接字符串。

我们的开发团队是一个大约7或8的小组。如果两个团队成员同时运行单元测试会有冲突,因为很多测试都添加和删除了许多测试中常见的数据。这会导致测试在两个开发人员之间错误地失败。

布局:

TestBase.dll
IntegrationTest.cs(包含 [DeploymentItem(“nhibernate_log4net.cfg.xml”]
nhibernate_log4net.cfg.xml
nhibernate_log4net.cfg.Developer 1.xml(转换文件)
nhibernate_log4net.cfg.Developer 2.xml(转换文件)
...

UnitTest.dll
参考文献 - >的 TestBase.dll
MyUnitTest.cs(继承自 TestBase.dll 中的IntegrationTest)

问题:

我的想法是在团队中的每个开发人员的SlowCheetah dll中对配置文件使用TestBase xml转换,但转换后的文件不会被复制到 Out 单元测试目录。基本配置文件(未转换的文件)是被复制到 Out 目录的文件。我有一种感觉,因为我必须首先使用[DeploymentItem("nhibernate_log4net.cfg.xml")属性来获取配置文件。

有没有办法在xml配置文件上使用xml转换,该文件包含在单独的dll中,而不是单元测试项目?

2 个答案:

答案 0 :(得分:3)

您可以通过从msbuild调用目标来手动运行转换,如下所示:http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx

<强>更新

我能够重现你的问题。它很微妙,但我认为它正如预期的那样工作。这是正在发生的事情:

  • 正在应用配置转换。转换后的文件放在 TestBase 输出目录中。
  • 您在测试中指定了* [DeploymentItem(“nhibernate_log4net.cfg.xml”)] *,但由于该文件与 UnitTest 项目无关,因此失败。为了补偿,您使用“Copy Local”= true
  • 标记了配置文件
  • “复制本地”确保将TestBase项目中的内容复制到UnitTest项目,但它要么从源位置复制预转换后的文件,要么在运行XmlTransform任务之前将文件移动到bin文件夹中。 (我倾向于认为这是前者)

很少有建议可以解决这个问题:

  1. 将配置文件移动到 UnitTest 库并在那里应用转换,这将确保配置随时可供测试运行器使用;或

  2. 在TestSettings文件(而不是DeploymentItemAttribute)中配置部署选项,以从 TestBase 文件夹中复制生成的文件。 (&lt; Solution Directory&gt; \ TestBase \ bin \ Debug \ cfg.xml);或

  3. 更改项目,使它们共享同一个Output目录。这将确保DeploymentItem属性将已转换的TestBase配置文件复制到TestRun文件夹。 (顺便说一句,共享输出文件夹是加速构建的好方法,因为不需要一次又一次地复制依赖项和内容)

  4. (另外,疯狂支持@SayedIbrahimHashimi谁是SlowCheetahXml背后的主要贡献者之一 - 大粉丝,挖掘这个扩展很多)

答案 1 :(得分:-1)

SlowCheetah - XML Transforms Free

此程序包使您可以根据构建配置转换app.config或任何其他XML文件。它还添加了额外的工具来帮助您创建XML转换。