5

我们使用.resx文件将我们的应用程序国际化为多种语言。我们的自动化单元测试是在自己组装的,我们运行MSTEST从命令行项目从我们的CI(詹金斯)这样的范围内:使用mstest,我可以针对每种支持的语言运行我的单元测试套件吗?

mstest.exe /testcontainer:unittests.dll /类别:” !TemporaryExclude” /resultsfile:UnitTests.trx

我们发现的情况下,如果设置为我们的非英语支持的文化之一的计算机上运行特定的单元测试失败。我们希望让我们的CI对每种文化进行单元测试,包括当前的en-us。这肯定是其他人遇到的问题,但我没有发现任何问题。

有没有办法针对特定文化运行mstest?我没有看到任何东西the command-line docs for mstest.exe

我知道,我可以指定在我的测试中Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture,但我不希望我们的团队开发者不得不禁止复制粘贴他们测试的副本,每种文化一个。这对他们来说是额外的工作,只有通过文化才会有不同的重复,因此很难保持并容易出错。

我想知道获得从TestMethodAttribute一类,并让它通过所有我的语言资源DLL周期,对于每个正在运行的测试代码一次,但Visual Studio中告诉我:

错误2“ClassToExtendTestMethodAttribute”: 不能派生自密封型'Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute'

与TestClassAttribute相同。

回答

3

一个想法可能是从TestInitialize方法中的配置文件中读取文化,以便与Thread.CurrentThread.CurrentCulture一起使用,并将此方法放入基本单元测试类(所有其他测试类都应从中派生)。 如果这样做,你可以从一个循环中的批处理文件调用mstest,并在每一步之后更改配置文件(例如从“en-us”到“fr-FR”)。

或者,这是一个指向“Unit Test Extensibility Sample”的指针,我没有用过,但可能对您有所帮助。

+0

+1好主意!我宁愿不执行相同的文件访问之前执行每个测试(给定我们有多少测试),所以我要去尝试ClassInitialize而不是TestInitialize。如果我得到这个工作,我仍然会接受你的答案。 – JeffH

+0

@heginy它看起来像派生类不会执行其父类的ClassInitialize,除非它们从它们自己的ClassInitialize方法显式调用它。派生类*执行*他们的父母的TestInitialize,所以我可以让你的技术以这种方式工作。正如我所说,我不会为将每个测试都发布到文件系统而感到兴奋。我可能会选择ClassInitialize技术,即使除了子类之外还有一个额外的步骤。接受你的答案。谢谢! – JeffH

+0

@JeffH太棒了,很高兴它的工作。你每次都对文件访问是正确的。如果你可以用ClassInitialize解决它,也许AssemblyInitialize也可以工作。 – henginy

相关问题