Xamarin - 跨平台单元测试#2

时间:2017-06-05 22:11:33

标签: c# ios unit-testing visual-studio-2017

这是一个common question,对我来说真是令人震惊,这样一个简单的任务难以成为......

我有一个Visual Studio(以前称为Xamarin)C#跨平台库。它在共享"抽象"中有一些代码。库,以及一些适用于Android,iOS和UWP库的机器特定实现类。它还有一些使用Microsoft.VisualStudio.TestTools.UnitTesting包的自动(非UI)单元测试。这是一个很好的开始,当Visual Studio 2017感觉很慷慨时,它运行我的单元测试并且生活很美好。

现在我想从命令行对实际设备的模拟器运行单元测试(因此我可以从Jenkins运行它们并捕获输出)。因此,例如,我想在iPad的模拟器上运行我的单元测试。从各种网站我觉得我不能使用Microsoft软件包,因此我需要切换到Xunit或NUnit。我今天早些时候放弃了Xunit,这是NUnit的表现。

  1. 进入Unit Test项目并删除Microsoft.NET.Test.Sdk,MSTest.TestFramework和MSTest.TestAdapter的NuGet包。
  2. 改为添加NUnit(版本3.7.0)。
  3. 进入每个CS文件,使用NUnit.Framework"更改为",将[TestMethod]更改为[Test],将[TestClass]更改为[TestFixture]。
  4. 项目:管理NuGet包,添加NUnit3TestAdapter。
  5. 测试资源管理器:全部运行
  6. 此时我得到了UWP机器特定库的奇怪错误:

    The "XamlCTask" task could not be initialized with its input parameters
    The "DebugType" parameter is not supported by the "XamlCTask" task.  Verify the parameter exists on the task, and it is a settable public instance property.
    

    这是一个非常奇怪的消息,如果我重建UWP库,它会重建而不会出错。不知道为什么它将UWP库作为单元测试的一部分来构建,这是" Projects"中列出的唯一内容。是抽象的(非机器特定的)库。

    建立单元测试库的工作也很奇怪,只有在我执行测试资源管理器时才会这样:运行所有我得到这些错误。

    好的,它是known error

    关闭VS2017,删除bin和obj文件夹,重新打开,没有更好。关闭VS2017,破解列出的Xamarin.form.targets。同样的错误。在全局Xamarin.Forms.targets中实现错误,而不是我解决方案中的错误。劈开它。关闭&重新开启解决方案,重建。这次没有错误!

    测试资源管理器:全部运行。没有。输出:构建显示没有失败,输出:测试完全为空。关闭&重新开启解决方案。获取新错误:

    [Failure] Could not find file 'C:\Workspace\PopComm.iOS\obj\Debug\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs'.
    [Failure] Could not find file 'C:\Workspace\PopComm.iOS\obj\Debug\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs'.
    [Failure] Could not find file 'C:\Workspace\PopComm.iOS\obj\Debug\TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs'.
    

    测试资源管理器:全部运行。这一次得到了更多有趣的错误:

    ------ Discover test started ------
    NUnit Adapter 3.7.0.0: Test discovery starting
    Assembly contains no NUnit 3.0 tests: 
    C:\Workspace\PopComm.iOS\bin\iPhone\Debug\PopComm.dll
    NUnit Adapter 3.7.0.0: Test discovery complete
    ========== Discover test finished: 0 found (0:00:00.0530024) ==========
    

    当然,组装不包含任何单元测试!这不是我的单元测试项目!

    叹息。

    好的,创建一个类型为" NUnit 3单元测试项目"的新项目。将我的测试类移动到这个新项目中,并将依赖项添加到我的非机器特定的库中。

    测试资源管理器:全部运行 - 测试!有测试!他们甚至成功运行。

    关闭VS2017,再次打开,测试资源管理器:全部运行。没有测试。输出:测试为空。

    关闭项目,删除所有bin和obj文件夹,Rebuild Solution,Test Explorer:全部运行。没有测试。

    将代码推送到git,拉上Mac。

    在Visual Studio for Mac中打开解决方案。

    使用隐藏最多的View:Test功能调出Unit Tests窗口,运行测试。测试发现并运行。 YIPPEE!

    现在我想在iPad模拟器上运行我的单元测试,而不是在VSMac内部。

    在我的解决方案中添加一个新项目,输入iOS:Tests:Unified API:Unit Test App。

    向导询问我想支持的最低iOS版本是什么。我想我应该匹配我的机器专用库所针对的iOS版本,所以我去查看该项目的VSMac选项。 iOS目标版本无法在任何地方显示。使用单元测试应用程序的默认值(10.3)。

    我现在必须将所有单元测试CS文件复制到这个新应用程序中吗?或者我可以在这个单元测试应用程序中以某种方式引用我的跨平台单元测试项目吗?

    推送所有内容并拉动Windows机器,我尝试添加对我的单元测试库的引用,但出现错误:

    The project 'NUnit.Tests' cannot be referenced.  The referenced project is targeted to a different framework family (.NETFramwork)
    

    坎。我想知道新的NUnit.Tests.iOS应用程序所针对的框架。检查它的选项 - 它在任何地方都没有说。将单元测试应用程序中的引用移回单元测试文件,只需复制单元测试源文件(非最佳)。

    在iPad模拟器中运行该应用程序,它找到&运行测试,但我不知道如何(1)从命令行运行它,以及(2)捕获文件中的单元测试状态。

    所以在这之后,我仍然不知道如何从命令行运行我的单元测试(1),在iPad模拟器上运行(2),以及(3)在文本文件中捕获输出。

0 个答案:

没有答案