自动化测试很重要!很重要!以前多是手动测试,没有写过测试用例。这样的结果就是发现bug改了之后关联的其他功能又要从新测一遍。这样既浪费时间与成本,而且很无聊。之所以选择NUnit是公司需要,现在.net 系都流行xunit,有空再看看它吧。Nunit的xamarin应用有很多欠缺的地方,特为大伙补补坑。Nunit本身的Test,SetUp,Category等属性的使用下次再说。
NUnit简介
... an excellent example of idiomatic design. Most folks who port xUnit just transliterate the Smalltalk or Java version. That's what we did with NUnit at first, too. This new version is NUnit as it would have been done had it been done in C# to begin with.
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
Template | Platform | Language |
---|---|---|
NUnit 3 Unit Test Project | Desktop | C# |
NUnit 3 Unit Test Project | Desktop | Visual Basic |
NUnit 3 Unit Test Project | Xamarin Android1 | C# |
NUnit 3 Unit Test Project | Xamarin iOS1 | C# |
NUnit 3 Unit Test Project | Xamarin UWP1,2 | C# |
NUnit 3 Unit Test Project | Xamarin WP8.11 | C# |
Item Templates
Template | Language | Description |
---|---|---|
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
Snippet | Shortcut | Language |
---|---|---|
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相关包与相应的代码,这样也许问题还会少些。希望已经帮你们填完坑了。