自动化测试很重要!很重要!以前多是手动测试,没有写过测试用例。这样的结果就是发现bug改了之后关联的其他功能又要从新测一遍。这样既浪费时间与成本,而且很无聊。之所以选择NUnit是公司需要,现在.net 系都流行xunit,有空再看看它吧。Nunit的xamarin应用有很多欠缺的地方,特为大伙补补坑。Nunit本身的Test,SetUp,Category等属性的使用下次再说。
NUnit简介
NUnit是一个单体测试框架,支持.net系所有语言,它的祖先是Java的JUnit。目前最新为3.6版本,已经重写了很多特性,目前支持.net core,xamarin,uwp等很多.net 平台。
- NUnit GUI - Runs NUnit 3 tests in a GUI based runner
- NUnit Xamarin Runner - Runs NUnit 3 tests on mobile devices using the Xamarin framework
- NUnit .NET Core Runner - Runs NUnit tests compiled against .NET Core
- NUnit Installer - Creates the installer for the NUnit Console, Engine and Extensions
- NUnit Project Editor - Edits the NUnit Project format
Xamarin应用
Xamarin项目测试分类:
- 平台无关部分(业务逻辑等):创建Nunit测试类库添加参照就可以了,不用启动实机或者模拟器测试。(本文略过,会第二种这种肯定也会)
- 平台相关部分(文件操作,数据库操作等):如果多个平台的测试用例一样,可以创建共享项目(Share Project)放测试用例,需要启动实机或模拟器测试。(重点介绍)
添加Nunit测试项目的方法有两种:
- 通过Nunit的模板创建测试项目。
- 创建相应的项目然后再添加Nunit相关的Nuget包(Nunit与Nunit.Xamarin)。
第一种方法简单但是问题特多,所以特拿它来做说明。第二种参照第一种基本上可以自行搞定略过。
1,安装NUnit Templates for Visual Studio模板
模板默认安装如下内容:
Project Templates
NUnit 3 Unit Test Project | Desktop | C# |
NUnit 3 Unit Test Project | Desktop | Visual Basic |
NUnit 3 Unit Test Project | Xamarin Android | C# |
NUnit 3 Unit Test Project | Xamarin iOS | C# |
NUnit 3 Unit Test Project | Xamarin UWP | C# |
NUnit 3 Unit Test Project | Xamarin WP8.1 | C# |
Item Templates
NUnit Test Fixture | C# | An NUnit unit test class |
NUnit Test Fixture | Visual Basic | An NUnit unit test class |
NUnit SetUp Fixture | C# | Code that runs before and after all the tests in the assembly |
NUnit SetUp Fixture | Visual Basic | Code that runs before and after all the tests in the assembly |
Code Snippets
Test Fixture | ntestfixture | C# |
Test Method | ntest | C# |
Test Case | ntestcase | C# |
下载地址:https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio
或者
通过Visual Studio的扩展更新添加【NUnit Templates for Visual Studio】
安装成功后在Cross-Platform分类下面就会有Test的模板了:
2,新建iOS测试项目
成功后的项目如下:
以上圈起来的为问题点:(第一个坑)
- 【AppDelegate.cs.txt】是多余的可以删除。(如果手动添加Nunit.xamarin包也会生成此项,这个时候需要用它替换原来的AppDelegate.cs文件)
- 【Resources】文件夹下的文件是损坏的无效文件,需要自行替换。
不信的可以先编译试试,绝对会出现如下错误:
替换文件后再编译肯定可以成功:
由于默认自带了一个测试用例所以可以启动看看效果:
- Run Tests:再次启动测试
- All Results:查看全部测试结果
- Failed Results:查看失败的测试结果
效果看上去还是很不错的!
AppDelegate.cs里头包含Nunit测试引擎的启动设置,以及外部测试程序集的设置。如果是Share project参照的话这里就不用修改,这也是为什么推荐使用Share project的原因。
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init(); // This will load all tests within the current project
var nunit = new NUnit.Runner.App(); // If you want to add tests in another assembly
//nunit.AddTestAssembly(typeof(MyTests).Assembly); // Do you want to automatically run tests when the app starts?
nunit.AutoRun = true; LoadApplication(nunit); return base.FinishedLaunching(app, options);
}
自动带的测试用例,Nunit具体的这些属性以及方法如何使用可以参照官网,有空我再补补吧。
[TestFixture]
[Category(nameof(TestClass))]
public class TestClass
{
[Test]
public void TestMethod()
{
// TODO: Add your test code here
Assert.Pass("Your first passing test");
}
}
3,新建Android测试项目
生成成功后的效果:(公司的电脑每次都无法创建成功,多半是Android SDK与Xamarin版本的问题。)
以上圈起来的为问题点:(第二个坑)
- 【MainActivity.cs.txt】是多余的可以删除。(如果手动添加Nunit.xamarin包也会生成此项,这个时候需要用它替换原来的MainActivity.cs文件)
- 【Resources】文件夹下的icon.png文件是损坏的无效文件,需要自行替换。
直接编译的话应该会有如下等错误:(由于编译器默认使用了最新版的Android SDK)
解决办法:安装最新版的xamarin.Forms.
记得替换Resources下面所有文件夹里面的icon.png,不然会有如下错误:
替换之后编译就没问题了:
启动之后的效果和iOS类似如下:
MainActivity.cs里头包含Nunit测试引擎的启动设置,以及外部测试程序集的设置。如果是Share project参照的话这里就不用修改,这也是为什么推荐使用Share project的原因。
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); // This will load all tests within the current project
var nunit = new NUnit.Runner.App(); // If you want to add tests in another assembly
//nunit.AddTestAssembly(typeof(MyTests).Assembly); // Do you want to automatically run tests when the app starts?
nunit.AutoRun = true; LoadApplication(nunit);
}
由于我已经把测试用例放到了Share Project,代码和上面iOS的一样。
4,新建UWP测试项目
设置版本
然后就出错了:(如果你的电脑安装了10240的SDK的话没问题)
第三坑:明明最低选择了10586,怎么还必须的有10240的版本?实际上确又创建了此项目:
无法添加到工程的罪魂祸首在这,这VS模板不知道是那位大哥建的啊!怎么就固定死了10240???
解决办法也就有了,把替换成你想要的版本就可以了:
添加到工程后的情况:
以上圈起来的为问题点:(第四个坑)
- 【Project.json】居然没有Xamarin.Forms,Nunit,Nunit.Xamarin包的设置。
- 【Assets】文件夹下的文件是损坏的无效文件,需要自行替换。
解决办法:
先替换图片
接着添加以下包:
编译应该就没问题了:
添加共享项目参照,启动试试效果:
MainPage.cs里头包含Nunit测试引擎的启动设置,以及外部测试程序集的设置。如果是Share project参照的话这里就不用修改,这也是为什么推荐使用Share project的原因。
public sealed partial class MainPage
{
public MainPage()
{
InitializeComponent(); // Windows Universal will not load all tests within the current project,
// you must do it explicitly below
var nunit = new NUnit.Runner.App(); // If you want to add tests in another assembly, add a reference and
// duplicate the following line with a type from the referenced assembly
nunit.AddTestAssembly(typeof(MainPage).GetTypeInfo().Assembly); // Do you want to automatically run tests when the app starts?
nunit.AutoRun = true; LoadApplication(nunit);
}
}
5,新建Nunit测试类库
在【测试】分类里面可以找到如下模板:
为了能在测试资源管理器里面看到测试条目,添加【NUnit3TestAdapter】Nuget包:
编译测试项目之后测试资源管理器就会有条目:
点击全部运行就可以跑相关测试:
最后整体的测试代码结构如下:
代码地址:https://github.com/NewBLife/XamarinDemo/tree/master/Demo.Tests
总结
测试框架本身还是不错的,测试速度与测试结果展示等方面都还不错。至于它的xamarin模板确实太不靠谱,建议直接创建普通的项目然后添加Nunit相关包与相应的代码,这样也许问题还会少些。希望已经帮你们填完坑了。