我尝试让我的Xamarin运行单元测试,但未能使其正常运行。我在项目中添加了以下nuget包:
我可以在测试列表中看到我的单元测试。但是,当我开始运行单个测试时,会收到以下消息:
没有测试匹配给定的测试用例过滤器FullyQualifiedName = ...
经过研究后,我在 Build 部分中找到了以下消息:
警告NU1701:使用“ .NETFramework,Version = v4.6.1”而不是项目目标框架“ .NETCoreApp,Version = v2.0”恢复了软件包“ MSTest.TestAdapter 1.4.0”。该软件包可能与您的项目不完全兼容。
如何运行测试?
编辑:我从项目中卸载了MSTest Nuget并得到了以下内容:
没有测试匹配给定的测试用例过滤器
编辑2:测试如下:
using System;
using System.Collections.Generic;
using System.Text;
using App.Services;
using Xunit;
namespace App.Tests.Services
{
public class HelperTest
{
[Fact]
public void Encrypt_password_Test()
{
string password = "Helloworld";
string expectedResult = "";
string result = Helpers.Encrypt_password(password);
Assert.Equal(expectedResult, result);
}
}
}
我希望测试会失败,因为字符串为空。
csproj文件:
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<NeutralLanguage>en-GB</NeutralLanguage>
<AssemblyName>App</AssemblyName>
<RootNamespace>App</RootNamespace>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>pdbonly</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="SharpZipLib" Version="1.1.0" />
<PackageReference Include="sqlite-net-pcl" Version="1.5.231" />
<PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
<PackageReference Include="Xamarin.Essentials" Version="1.2.0" />
<PackageReference Include="Xamarin.Forms" Version="4.1.0.581479" />
<PackageReference Include="Xamarin.Plugin.FilePicker" Version="2.1.18" />
<PackageReference Include="xunit" Version="2.4.1" />
</ItemGroup>
<ItemGroup>
<XliffResource Include="MultilingualResources\App.de.xlf" />
</ItemGroup>
<ItemGroup>
<Compile Update="Localizations\AppResources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>AppResources.resx</DependentUpon>
</Compile>
<Compile Update="Views\Login\NewProfilePage.xaml.cs">
<DependentUpon>NewProfilePage.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Localizations\AppResources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>AppResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Views\Settings\AppSettings.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\Login\NewProfilePage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\Settings\ProfilelistPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\Settings\ProfilePage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\ProjectPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\Settings\SensorListPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\SensorTestPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Views\Settings\SettingsPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Tests\Projectlist\" />
<Folder Include="Tests\Settings\" />
</ItemGroup>
</Project>
我还创建了一个示例xunit测试项目。在那里,我注意到它使用 netcoreapp2.1 作为TargetFramework。当我在应用程序中更改TargetFramework时,使其与Xamarin不兼容。
答案 0 :(得分:1)
您几乎自己找到了解决方案。确实,测试未运行的原因是因为netstandard
目标框架不可执行。 netstandard
是一个合同,但是它需要一个运行时,例如netcoreapp
、. NET Framework(例如net472
),Xamarin或其他。测试是通过静态分析而不是执行来发现的。
人们为他们的代码编写测试的通常方法是将测试放在单独的项目中。这也意味着当您将应用程序交付给客户时,他们安装的dll没有永远不会运行的测试代码,只会无缘无故地增大下载量。
因此,创建一个xunit测试项目。理想情况下,它的目标是您的应用程序将要运行的运行时,但是我从未做过任何Xamarin开发,所以我不知道这是否可行,因此,netcoreapp2.1
或netcoreapp2.2
足够好。如果您使用的是Visual Studio,则add a project reference,否则,请编辑csproj并添加<ProjectReference Include="../path/to/project.csproj" />
。
如果您的生产代码具有不想公开的内部类,则将InternalsVisibleTo
attribute添加到您的生产程序集中,它将仅对您的测试程序集可用。