一、单元测试框架NUnit

NUnit是所有.net语言的单元测试框架。使用C#语言编写。

测试框架:NUnit3

1. 安装NuGet包管理器

2. 在NuGet中安装NUnit、NUnit.Console和NUnit 3 Test Adapter

本地安装版本为:NUnit(3.12.0)、NUnit.Console(3.10.0)NUnit 3 Test Adapter(V3.15.1.0)

此时查看项目引用中包含nunit.framework.dll,安装完重启VS。

二、测试框架TestStack.White

1. 在NuGet中安装TestStack.White

2. 或者可通过NuGet控制台(PowerShell)进行安装

在VS中打开工具->NuGet包管理器->程序包管理器控制台(Powershell,如果没有可手动下载)

a. 输入install-package TestStack.White

b. 输入install-package Nunit

此时查看项目引用中包含TestStack.White,安装完重启VS。

三、代码中引入

NUnit作用是添加【TestFixture】等测试标识,引入using NUnit.Framework;

TestStack.White作用是封装了识别应用程序和控件的方法。

using TestStack.White;
using TestStack.White.Factory;
using TestStack.White.UIItems.WindowItems;
using TestStack.White.UIItems;
using TestStack.White.UIItems.Finders;
using NUnit.Framework; namespace myProject01
{
[TestFixture]
class Program
{
static Application posApp;
[SetUp]
public void setUp() {
posApp = Application.Launch(@"xx\xx.exe");
Console.WriteLine("setup");
}
[TearDown]
public void tearDown()
{
posApp.Close();
Console.WriteLine("teardown");
}
//项目执行需要有main函数,此处先和在这里,没有实际作用,为了编译通过。。。
static void Main(string[] args) { } [Test]
public void testcase_login()
{
Window posWindow = posApp.GetWindow("登录", InitializeOption.NoCache);
TextBox usertext = posWindow.Get<TextBox>(SearchCriteria.ByAutomationId("txt_no"));
usertext.SetValue("");
}

打开【测试】-【窗口】-测试资源管理器;在解决方案右键->生成解决方案;

四、测试固件

【TestFixture】:

用在class前面,表示该类包含测试,此类必须是public的

【Test】

表示该函数为一个testcase

【SetUp】【TearDown】:

测试固件前置条件和后置条件,作用于每个testcase

【TestFixtureSetUp】【TestFixtureTearDown】

测试固件前置条件和后置条件,作用于每个【TestFixture】

【ExpectedException】 :

用例预期会抛出Exception,如果没有抛用例就会失败。比如用任何数除以0会得到DivideByZeroException,这时可以在TestCase前面加上ExpectedException

[Test]
[ExpectedException("System.DivideByZeroException")]
public void testException() {
int zero = ;
int number = / zero;
}

【Explicit】

执行全部用例时会忽略执行,单独选中该testcase可以执行

【Ignore】

忽略执行,即使单独执行也不可以

五、控件识别

【TextBox】

TextBox usertext = posWindow.Get<TextBox>(SearchCriteria.ByAutomationId("txt_no"));

usertext.SetValue("0114");

【Button】

  var button = posWindow.Get<Button>("btn_login");

button.Click();

   [Label]

classname为Text的可使用Label,一般为点击文字事件的。

  var serverSet = posWindow.Get<Label>(SearchCriteria.ByAutomationId("lbl_chgServer"));

serverSet.Click();

【自定义类】

  添加引用,引入自定义的ClassLibrary2.dll

  using BaseTest;

BaseClass.ClickLeftMouse(processId, "CtrButtonCon5");

六、Assert断言

Assert.AreEqual(expectedResult, actualResult);

Assert 类包含 AreEqual,AreSame,Equals, Fail,IsFalse,IsNotNull ..等方法。

项目搭建(二):NUnit&TestStack.White的更多相关文章

  1. vuejs学习——vue+vuex+vue-router项目搭建(二)

    前言 最近比较忙,所有第二章发布晚了,不好意思各位. vuejs学习——vue+vuex+vue-router项目搭建(一) 中我们搭建好了vue项目,我相信大家已经体验了vue其中的奥妙了,接下来我 ...

  2. 基于webpack的React项目搭建(二)

    前言 前面我们已经搭建了基础环境,现在将开发环境更完善一些. devtool 在开发的过程,我们会经常调试,so,为了方便我们在chrome中调试源代码,需要更改webpack.config.js,然 ...

  3. IDEA项目搭建二——使用SpringBoot创建Web层

    一.编写底层代码 1.demo-common中创建FormatString类 先在默认com.tyh中创建package命名为common 删除自动生成的app.java,在common包下创建新类 ...

  4. vuejs学习——vue+vuex+vue-router项目搭建(三)

    前言 vuejs学习——vue+vuex+vue-router项目搭建(一) vuejs学习——vue+vuex+vue-router项目搭建(二) 为什么用vuex:组件之间的作用域独立,而组件之间 ...

  5. 从零开始搭建框架SSM+Redis+Mysql(二)之MAVEN项目搭建

    从零开始搭建框架SSM+Redis+Mysql(二)之MAVEN项目搭建 废话不说,直接撸步骤!!! 1.创建主项目:ncc-parent 选择maven创建项目,注意在创建项目中,packing选择 ...

  6. 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API

    前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ...

  7. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之二 || 后端项目搭建

    前言 至于为什么要搭建.Net Core 平台,这个网上的解释以及铺天盖地,想了想,还是感觉重要的一点,跨平台,嗯!没错,而且比.Net 更容易搭建,速度也更快,所有的包均有Nuget提供,不再像以前 ...

  8. springboot系列二、springboot项目搭建

    一.官网快速构建 1.maven构建项目 1.访问http://start.spring.io/ 2.选择构建工具Maven Project.Spring Boot版本2.1.1以及一些工程基本信息, ...

  9. vue项目搭建 (二) axios 封装篇

    vue项目搭建 (二) axios 封装篇 项目布局 vue-cli构建初始项目后,在src中进行增删修改 // 此处是模仿github上 bailicangdu 的 ├── src | ├── ap ...

随机推荐

  1. JavaScript高级程序设计(第3版) 第三章 (基本概念)

    3.1 语法 1.不以数字开头的数字,字母,下划线,美元符号 2.注释:html <!-- --> css/**/ js单行// 多行/**/ 3.ES5 引入了严格模式(strict m ...

  2. 应该用forEach改变数组的值吗? 原生JS forEach()和map()遍历的异同点

    应该用forEach改变数组的值吗? https://segmentfault.com/q/1010000013170900?utm_source=index-hottest 由于js中的数组是引用类 ...

  3. 物流运输(最短路+dp)

    这道题是相当的火,但是在tyher的讲解下我一遍就AC了!!! Part 1 理解题目 从第一天到最后一天,总会有一些点莫名其妙地走不了,所以导致我们不能按照上一次的最短路一直运输得到最少费用,而需要 ...

  4. shuoj 1 + 2 = 3? (二分+数位dp)

    题目传送门 1 + 2 = 3? 发布时间: 2018年4月15日 22:46   最后更新: 2018年4月15日 23:25   时间限制: 1000ms   内存限制: 128M 描述 埃森哲是 ...

  5. thinkphp开发微信小程序后台流程

    thinkphp开发微信小程序后台流程,简单分享一下微信开发流程 1,注册微信小程序账号 2,注册好后,登陆微信小程序,下载微信小程序开发工具 3,用thinkphp开发企业后台,前台数据用json返 ...

  6. android 完全退出应用程序(经过严格验证)

    今天解决了如何彻底结束Android应用程序的方法.网上有很多的参考方法,什么finish():android.os.Process.killProcess(android.os.Process.my ...

  7. Javascript 数组的一些操作

    (1) shift  删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4, ...

  8. traceroute学习

    之前只知道ping telnet命令,后面学习了traceroute命令 ping最常用的,看是否可以ping通ip,查看网络是否可达 telnet探测端口是否通,telnet ip port tra ...

  9. JSON:结构化数据格式

    JSON是javascript的子类,也是作为更好的互联网传输结构化数据格式逐渐取代XML,因此要理解JSON,重要的是理解它是一种数据格式,不是一种编程语言. 语法 //javascript var ...

  10. 源码分析--HashMap(JDK1.8)

    在JDK1.8中对HashMap的底层实现做了修改.本篇对HashMap源码从核心成员变量到常用方法进行分析. HashMap数据结构如下: 先看成员变量: 1.底层存放数据的是Node<K,V ...