使用 mstest,我可以针对我支持的每种语言运行我的单元测试套件吗?
Posted
技术标签:
【中文标题】使用 mstest,我可以针对我支持的每种语言运行我的单元测试套件吗?【英文标题】:With mstest, can I run my unit test suite against each of my supported languages? 【发布时间】:2012-06-22 16:11:22 【问题描述】:我们使用 .resx 文件将我们的应用程序国际化为多种语言。我们的自动化单元测试在它们自己的程序集中,我们从 CI (Jenkins) 中的命令行对该项目运行 mstest,如下所示:
mstest.exe /testcontainer:unittests.dll /category:"!TemporaryExclude" /resultsfile:UnitTests.trx
我们发现如果在设置为我们的非英语支持文化之一的机器上运行特定单元测试会失败的情况。我们希望我们的 CI 针对每种文化运行单元测试,包括当前的 en-us 文化。这一定是其他人遇到的问题,但我没有找到任何东西。
有没有办法针对特定文化运行 mstest? 我在 the command-line docs for mstest.exe 中没有看到任何内容
我知道我可以在我的测试中指定 Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture,但我不希望我们团队的开发人员不得不复制粘贴他们的测试的副本,每种文化一个。这对他们来说将是额外的工作,并且仅因文化而异的副本将难以维护并且容易出错。
我想知道从 TestMethodAttribute 派生一个类并让它循环遍历我所有的语言资源 DLL,为每个 DLL 运行一次测试代码,但 Visual Studio 告诉我:
错误 2“ClassToExtendTestMethodAttribute”: 不能从密封类型“Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute”派生
TestClassAttribute 也一样。
【问题讨论】:
【参考方案1】:一个想法可能是从TestInitialize
方法中的配置文件中读取区域性,以便与Thread.CurrentThread.CurrentCulture
一起使用,并将此方法放入基本单元测试类(所有其他测试类都应该派生自)。
如果这样做了,您可以在循环中从批处理文件中调用mstest
,并在每一步之后更改配置文件(例如从“en-us”到“fr-FR”)。
或者,这里有一个指向“Unit Test Extensibility Sample”的指针,我没有使用过,但可能会对您有所帮助。
【讨论】:
+1 好主意!我宁愿在执行每个测试之前不做同样的文件访问(考虑到我们拥有的测试数量),所以我将尝试使用 ClassInitialize 而不是 TestInitialize。如果我能正常工作,我仍然会接受你的回答。 @heginy 看起来派生类不会执行其父类的 ClassInitialize ,除非它们从自己的 ClassInitialize 方法中显式调用它。派生类确实执行其父类的TestInitialize,因此我可以让您的技术以这种方式工作。正如我所说,我不会对让每个测试都进入文件系统感到兴奋。我可能会选择 ClassInitialize 技术,即使除了子类化之外还有一个额外的步骤。接受你的回答。谢谢! @JeffH 太好了,很高兴它成功了。您每次都对文件访问是正确的。如果你可以用 ClassInitialize 解决它,也许 AssemblyInitialize 也可以工作。 @heginy 现在我使用 MSTest Jenkins 插件来浏览结果变得更有趣了。 (wiki.jenkins-ci.org/display/JENKINS/MSTest+Plugin) 该插件只需要一个 .trx 文件并显示趋势图并允许向下钻取。我无法将运行合并为一个,那么我将使用哪个测试运行的结果?我的默认文化?有时会导致单元测试失败的其他语言之一?我是否编写自定义逻辑来强制 Jenkins 显示失败次数最多(如果有)的运行数据?我仍然很惊讶似乎没有其他人有这种担忧。 @JeffH 是的,人们认为这应该是一个更普遍的问题。我想知道人们是否为每种文化运行单独的 VM 集,但这可能意味着每种文化都有一个单独的 CI 服务器(也许某些 CI 服务器支持多个测试平台?)。总而言之,这是一个挑战......最后,我绝对建议根据经验测试土耳其语(如果它在您的目标中):)以上是关于使用 mstest,我可以针对我支持的每种语言运行我的单元测试套件吗?的主要内容,如果未能解决你的问题,请参考以下文章