上一篇  走进 Prism for Xamarin.Forms 讲了简单的创建一个项目,然后添加了几个页面来回切换,这篇想先搞下 UITest

官方详细地址:https://developer.xamarin.com/guides/testcloud/uitest/intro-to-uitest/

一、首先在项目上右键添加一个 UITest 项目,我命名为 SD.Xamarin.UITest ,因为 项目叫 SD.Xamarin

建完的项目引用的 NUnit 的引用包千万别升级,官方说了,3.X的是不兼容的,所以你就用2.6.X的好了,官方文档很重要有木有,不然像我总喜欢升级到最新版的人,就会悲剧的

IOS项目需要添加 Nuget 包 Xamarin.TestCloud.Agent(官网说的,没有 Mac 没法测试)

同时要添加 Android 和 IOS 项目的引用

摘自官方的说明

  • NUnit 2.6.x – Xamarin.UITest is not compatible with NUnit 3.x.
  • A Test Runner for Visual Studio – A 3rd party test runner, such as the NUnit Test Adapter for NUnit 2 or Resharper from Jetbrains, is required for Visual Studio to be able to run the NUnit tests. The NUnit3TestAdapter is not compatible with Xamarin.UITest.
  • Android SDK – Only if testing Android apps. Windows requires that the ANDROID_HOME environment variable is set with the path to the Android SDK.
  • Java Developers Kit – Only if testing Android apps.

二、执行 Test

  • REPL

建完项目会有2个文件,其中一个叫 AppInitializer.cs 的文件就是配置路径的文件,也就是让项目知道去哪里找到生成的包文件,Android 的是 apk 文件,IOS 的是 app 文件

public class AppInitializer
{
public static IApp StartApp(Platform platform)
{
if (platform == Platform.Android)
{
return ConfigureApp
.Android
.ApkFile("../../../SD.Xamarin/SD.Xamarin.Droid/bin/Release/SD.Xamarin.Droid.apk")
.StartApp();
} return ConfigureApp
.iOS
.AppBundle("../../../SD.Xamarin/SD.Xamarin.iOS/bin/iPhoneSimulator/Release/SD.Xamarin.iOS.app")
.StartApp();
}
}

红色的部分就是需要自己加的,因为在一个项目文件夹下,所以前边的 ../../../ 就是往上找目录(C# 的人都懂的),然后是 项目名 / 测试平台的项目名 / 生成包的路径,Debug 还是 Release 随你喜欢了(Debug 的包名称要适当修改,见下边),这里要说明下,千万不要把项目放到VS 的默认目录下,因为 WIN 10 的权限关系,它只让你搞 AppData 文件夹,而 VS 默认目录是 Document 文件夹,所以你根本找不到。

Android:  Debug 目录下生成的是 SD.Xamarin.Droid-Signed.apk ,Release 目录下会生成 SD.Xamarin.Droid-Signed.apk 和 SD.Xamarin.Droid.apk 两个

IOS: 由于没有Mac 无法验证,但是看到生成 的是 SD.Xamarin.IOS.exe ,不是 app ,不知道是否没有连接 Mac 的事情

当然跑之前要先 Build 好 apk 包,因为用 Android 跑的, IOS 需要连接 Mac 所以没法测试

这是 Test 方法

 [Test]
public void TestLogin()
{
_app.EnterText(n => n.Marked("Username"), "Name");
_app.EnterText(n => n.Marked("Password"), "Password");
_app.Tap(c => c.Button("LoginButtons")); _app.Repl(); AppResult[] result = _app.Query();
            Assert.IsTrue(result.Any(), "Login");
}

先运行下试试

失败了,不过没关系,说明配置都是对的,只是没有设备而已。

启动 Visual Studio Emulator for Android

嗯,还是配置的问题

官方说要这样配置,https://developer.xamarin.com/guides/testcloud/uitest/working-with/running-tests-in-ide/

TARGET ARCHITECTURE
iOS Simulator x86
iOS device x86_64
Android Device Typically armeabi-v7a
Google Emulator Depends on the Android Virtual Device

改到 Release 和 ARM 后,再来,弹出了一个窗体,输入 tree 回车

成功了,页面里内容都显示出来了,而且因为我写了 Button 的触发,还列出了跳转后的页面的内容

同时模拟器也会有跑 Test

  • 真机调试

1.手机启用开发者模式,USB 调试打开

2.电脑上安装 Google USB Driver(Android SDK Manager 里最下边那里有)

3.把手机连接到电脑上,如果一切正常,启动那里就可以选 Device 了(手机的名字,比如我的 Letv X800+)

如果你现在直接启动测试,会发现报错

那就指定一下设备吧,打开 ADB 控制台

输入 adb device

很明显的错误,是说2个设备,因为还有个 Emulator ,所以你需要指定设备,设备号码在错误里会有,修改启动方法如下

public static IApp StartApp(Platform platform)
{
if (platform == Platform.Android)
{
return ConfigureApp
.Android
.ApkFile("../../../SD.Xamarin/SD.Xamarin.Droid/bin/Release/SD.Xamarin.Droid.apk")
.DeviceSerial("96e5b85b")
.StartApp();
} return ConfigureApp
.iOS
.AppBundle("../../../SD.Xamarin/SD.Xamarin.iOS/bin/iPhoneSimulator/Release/SD.Xamarin.iOS.app")
.StartApp();
}

  

当你再次启动测试时,会发现还是会报错,超时的错误,这点和 Emulator 很不一样,所以需要修改测试方法

[Test]
public void TestLogin()
{
_app.Tap(c => c.TextField("Username"));
_app.EnterText(n => n.Marked("Username"), "Name");
_app.WaitForElement(n => n.Marked("Username").Text("Name")); _app.Tap(c => c.TextField("Password"));
_app.EnterText(n => n.Marked("Password"), "Password");
_app.WaitForElement(n => n.Marked("Password").Text("Password"), ""); _app.Tap(c => c.Button("LoginButton")); AppResult[] result = _app.Query();
Assert.IsTrue(result.Any(), "Login");
}

在我看来这样应该是对的了,但是不知道是我的环境问题还是怎样,在想把焦点跳到 Password 的时候,手机的虚拟键盘收起又弹出,但是焦点没有跳过去,所以我手点了一下,运行到点击 Button 的时候又跳不过去焦点,于是我又点了一下,但是没有在登录按钮上抬起,于是焦点跳过去了,然后就触发了 Button 的点击,但是不写 Tap 第一个 Username 的焦点也不会进,所以我觉的焦点是这么跳的,我想不可能是只需要 WaitForElement 方法,然后都需要手动输入吧,掐断点的时候你会发现到 WaitForElement 方法的时候是会停住的,直到符合条件才会继续,但是如果你一直不符合条件,还是会报超时的错误。

Tips:1. 如果这里是我理解的错误,还请赐教

2. 如果跑 test 时遇到 refused to install the app by The ADB command ! 错误,去任务管理器里结束 adb.exe 进程

  • Xamarin Test Cloud

首先需要注册试用,https://testcloud.xamarin.com/register

进去后右上角点击 头像下的 Account Setting ,左边选 Teams & Apps,show API Key 会出来一个 key 留着一会上传用

SD.Xamarin\packages\Xamarin.UITest.2.1.2\tools 下会有一个 test-cloud.exe (VS 2017 没有右键上传,VS 2015 有)

如果账号确认后,就可以创建新的 Test 了

点击 New Test Run,选择 Android

选择想测试的设备

选择分支和语言

最终生成了脚本的模板

复制脚本,修改你的真实参数

打开 cmd 窗体,把位置改到项目的地址

比如代码放在了E盘

  1. E:
  2. cd E:\Code\SD.Xamarin
  3. 粘贴修改过的命令

回车后会看到上传过程和结果

失败了,没关系,先继续看同时网页那边的情况,回头再改

当再次刷新网站时,页面变成下边这样

点进去看看详情

可以看到正在跑 Test

点进去看下

这就是大概的详情,下边还有一些内容,请自己试验时看吧

点击失败的 Test 可以看到截图

具体错误的原因可以查看 Log 修改,直到 可以测试成功。

补充成功的截图

虽然成功了,但还是很奇怪,焦点跳不过去,所以没有跳转页面,但是模拟器却始终好使。

这里就是模拟器和真机的区别了,模拟器没有显示键盘,真机需要手动关闭一下键盘,不然焦点就会不跳转

修改后的代码如下

        [Test]
public void TestLogin()
{
_app.WaitForElement(x => x.Marked("Username"));
_app.Tap(x => x.Marked("Username"));
_app.EnterText(x => x.Marked("Username"), "Name");
_app.Screenshot("Fill Name Finished"); _app.DismissKeyboard();
_app.WaitForElement(x => x.Marked("Password"));
_app.Tap(x => x.Marked("Password"));
_app.EnterText(x => x.Marked("Password"), "Password"); _app.DismissKeyboard();
_app.Tap(x => x.Marked("LoginButton"));
_app.Screenshot("Login"); AppResult[] result = _app.Query();
Assert.IsTrue(result.Any(), "Login");
}

脚本生成过程 https://developer.xamarin.com/guides/testcloud/organizations-and-teams/creating-a-test-run/

脚本参数 https://developer.xamarin.com/guides/testcloud/uitest/working-with/submitting-tests-at-command-line/

四、几个 Test 方法

方法 描述
Button 在屏幕上定位一个或多个按钮
Class 定位指定类的视图
Id 用指定的Id定位视图
Index 从集合中返回匹配的视图。通常和其他方法结合使用。接受从0开始的索引
Marked 根据之前提到的启发返回视图
Text 匹配包含提供文本的视图
TextField         匹配 Android EditText 或者 iOS UITextField.

更多内容请参考官方文档,如有错误以官方为准,有些地方翻译和理解的可能有误差

走进 UITest for Xamarin.Forms的更多相关文章

  1. 走进 UnitTest for Xamarin.Forms

    之前讲了 Xamarin.Forms 的 UITest 走进 UITest for Xamarin.Forms 走进 Xamarin Test Recorder for Xamarin.Forms 但 ...

  2. 走进 Prism for Xamarin.Forms

    一.使用环境 OS:Win 10 16273 VS:VS2017- 15.3.4 Xamarin:4.6.3.4,nuget:2.4 Android Emulator:Visual Studio fo ...

  3. 走进 MvvmLight for Xamarin.Forms

    一.Xamarin.Forms 不使用框架时的绑定 需要注意的是BindingContent,不是DataContent <ContentPage xmlns="http://xama ...

  4. 走进 Xamarin Test Recorder for Xamarin.Forms

    此篇是承接之前 走进 UITest for Xamarin.Forms 的,所以如果没有看过之前的可以先看下之前的 UITest 比起上一篇纯敲代码只适合程序员的 UITest ,这一篇不管是程序员还 ...

  5. 走进 Visual Studio Mobile Center for Xamarin.Forms

    前几篇分别介绍了 Xamarin.Forms 的 MVVM 的 Prism,UITest,Nuint Test,那这样算下来,代码部分基本结构都有了(逻辑就先忽略吧) 那接下来就应该是自动 Build ...

  6. Xamarin.Forms 开发资源集合(复制)

    复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...

  7. Xamarin.Forms 开发资源集合

    收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...

  8. xamarin.forms新建项目android编译错误

    vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...

  9. Xamarin.Forms 简介

    An Introduction to Xamarin.Forms 来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms ...

随机推荐

  1. 201521123096《Java程序设计》第三周学习总结

    1. 本周学习总结 2. 书面作业 (1)代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  2. 201521123040《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  3. Java:设计类的继承关系时的技巧

    继承设计的技巧: (1)将公共操作和域放置在超类 (2)不要使用受保护的域 有些程序员认为,将大多数的实例域定义为protected是一个不错的主意,只有这样,子类才能够在需要的时候直接访问他们.然而 ...

  4. 支付宝支付php的demo或sdk报错 Warning: openssl_sign() [function.openssl-sign]: Unknown signature algorithm. in

    最近在做支付宝支付,在本地测试一切正常,上传到服务器就遇到报错: Warning: openssl_sign() [function.openssl-sign]: Unknown signature ...

  5. sed命令基础2

    我在sed命令基础里面说了一下sed的基础用法,sed还有一些高级用法,由于我也是在学习中,写的博客可能会有想不到的地方,有问题希望大家指出. sed的高级用法主要在于两个空间的使用,模式空间和保持空 ...

  6. temp-黄河农商行路径

    -------------------------------黄河农村商业银行------------------------------------ --1.--svn 地址:http://10.0 ...

  7. Eclipse集成spket插件_Ext-5.1.0

    1, spket-1.6.23.jar下载 官网下载:http://www.spket.com/download.html ,  百度网盘地址: http://pan.baidu.com/s/1qXH ...

  8. Axios源码阅读笔记#1 默认配置项

    Promise based HTTP client for the browser and node.js 这是 Axios 的定义,Axios 是基于 Promise,用于HTTP客户端--浏览器和 ...

  9. 常见注入手法第一讲EIP寄存器注入

    常见注入手法第一讲EIP寄存器注入 博客园IBinary原创  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 鉴于注入手法太多,所以这里自己整理一下, ...

  10. Angular2开发拙见

    本文集中讲讲笔者目前使用ng2来开发项目时对其组件的使用的个人的一些拙劣的经验. 先简单讲讲从ng1到ng2框架下组件的职责与地位: ng1中的一大特色--指令,分为属性型.标签型.css类型和注释型 ...