405 lines
12 KiB
C#
405 lines
12 KiB
C#
|
/*
|
|||
|
Creat By LuoJiasi;
|
|||
|
Plz Put in DIY File;
|
|||
|
*/
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using UnityEditor;
|
|||
|
using UnityEngine;
|
|||
|
using System.Collections;
|
|||
|
using System.IO;
|
|||
|
using System;
|
|||
|
using NUnit.Framework;
|
|||
|
using Thousandto.Core.Base;
|
|||
|
using Thousandto.Code.Center;
|
|||
|
using Thousandto.Code.Logic;
|
|||
|
using Thousandto.Core.Asset;
|
|||
|
using CoroutinePool = UnityEngine.Gonbest.MagicCube.CoroutinePool;
|
|||
|
|
|||
|
namespace Funcell.DIY.UniScene
|
|||
|
{
|
|||
|
public class AutoUITest : EditorWindow
|
|||
|
{
|
|||
|
[MenuItem("Ares/测试工具/自动化测试")]
|
|||
|
static void Init()
|
|||
|
{
|
|||
|
var win = (AutoUITest)EditorWindow.GetWindow(typeof(AutoUITest));
|
|||
|
win.Show();
|
|||
|
win.titleContent = new GUIContent("自动化测试");
|
|||
|
}
|
|||
|
#region 配置文件
|
|||
|
protected string _now = DateTime.Now.ToString ("yyyy-MM-dd/") + DateTime.Now.ToString ("HH:mm:ss");
|
|||
|
protected string _logplace;//Log存储位置
|
|||
|
protected int flag = 0;//测试标记:0初始,1开始,2结束
|
|||
|
|
|||
|
//测试结果记录到txt文件中,文件地址为_logplace
|
|||
|
protected void LogTest(string resultfile)
|
|||
|
{
|
|||
|
if (!File.Exists(_logplace))
|
|||
|
{
|
|||
|
File.WriteAllText(_logplace, "[Test Start]\r\n");
|
|||
|
}
|
|||
|
File.AppendAllText(_logplace, DateTime.Now.ToString ("yyyy-MM-dd/") + DateTime.Now.ToString ("HH:mm:ss") + "," + resultfile + "\r\n");
|
|||
|
Debug.LogWarning(resultfile);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
private void OnGUI()
|
|||
|
{
|
|||
|
if(GUILayout.Button("自动化测试"))
|
|||
|
{
|
|||
|
_logplace = "D:/TestCase/AutoTestResult_" + DateTime.Now.ToString ("yyMMdd") + "-" + DateTime.Now.ToString ("HHmmss") + ".txt";
|
|||
|
CoroutinePool.AddTask(AutoFunctionUI());
|
|||
|
}
|
|||
|
}
|
|||
|
private IEnumerator AutoFunctionUI()
|
|||
|
{
|
|||
|
yield return new WaitForSeconds(0.1f);
|
|||
|
String casepath = @"D:\\TestCase\\TestCaseList"; //用例列表的文件夹
|
|||
|
var casefiles = Directory.GetFiles(casepath, "*.csv");
|
|||
|
String tearup = @"D:\\TestCase\\SetUp.csv"; //用例初始化的文件
|
|||
|
String teardown = @"D:\\TestCase\\TearDown.csv"; //用例初始化的文件
|
|||
|
foreach (var casefile in casefiles)
|
|||
|
{
|
|||
|
LogTest("【测试用例】:" + casefile);
|
|||
|
string nowID = DateTime.Now.ToString ("dd") + DateTime.Now.ToString ("HHmmss");
|
|||
|
LogTest("测试账号:" + nowID);
|
|||
|
ArrayList al = new ArrayList();
|
|||
|
string strLine = "";
|
|||
|
//TearUp 准备环境
|
|||
|
FileStream tearupfs = new FileStream(tearup, FileMode.Open, FileAccess.Read);
|
|||
|
StreamReader tearupsr = new StreamReader(tearupfs, System.Text.Encoding.GetEncoding(936));
|
|||
|
strLine = tearupsr.ReadLine();
|
|||
|
while(strLine!=null)
|
|||
|
{
|
|||
|
al.Add(strLine);
|
|||
|
strLine = tearupsr.ReadLine();
|
|||
|
}
|
|||
|
//读取功能按钮的CSV文件
|
|||
|
FileStream casefs = new FileStream(casefile, FileMode.Open, FileAccess.Read);
|
|||
|
StreamReader casesr = new StreamReader(casefs, System.Text.Encoding.GetEncoding(936));
|
|||
|
strLine = casesr.ReadLine();
|
|||
|
while(strLine!=null)
|
|||
|
{
|
|||
|
al.Add(strLine);
|
|||
|
strLine = casesr.ReadLine();
|
|||
|
}
|
|||
|
//TearDown 环境解除
|
|||
|
FileStream teardownfs = new FileStream(teardown, FileMode.Open, FileAccess.Read);
|
|||
|
StreamReader teardownsr = new StreamReader(teardownfs, System.Text.Encoding.GetEncoding(936));
|
|||
|
strLine = teardownsr.ReadLine();
|
|||
|
while(strLine!=null)
|
|||
|
{
|
|||
|
al.Add(strLine);
|
|||
|
strLine = teardownsr.ReadLine();
|
|||
|
}
|
|||
|
casesr.Close();
|
|||
|
tearupsr.Close();
|
|||
|
teardownsr.Close();
|
|||
|
//String casestrline = "";
|
|||
|
//casestrline = casesr.ReadLine();
|
|||
|
//while (casestrline != null)
|
|||
|
//CoroutinePool.AddTask(StartStopAction(48));//每个用例前48秒会自动停止寻路,这是SetUp的时间
|
|||
|
foreach (string testLine in al)
|
|||
|
{
|
|||
|
LogTest(testLine);
|
|||
|
//StopAction();//每条用例执行前停止寻路
|
|||
|
List<string> list = new List<string>(testLine.Split(','));
|
|||
|
//点击按钮
|
|||
|
if (list[0] == "ClickBtn")
|
|||
|
{
|
|||
|
if (GameObject.Find (list[1]) == null) {yield return new WaitForSeconds(3.0f);}
|
|||
|
ClickBtn(list[1]);
|
|||
|
yield return new WaitForSeconds(1.0f);
|
|||
|
}
|
|||
|
//点击有文本的按钮
|
|||
|
if (list[0] == "ClickBtnByName")
|
|||
|
{
|
|||
|
if (GameObject.Find (list[1]) == null) {yield return new WaitForSeconds(3.0f);}
|
|||
|
ClickBtnByName(list[1],list[2]);
|
|||
|
yield return new WaitForSeconds(1.0f);
|
|||
|
}
|
|||
|
//按序号点击按钮
|
|||
|
if (list[0] == "ClickBtnByIndex")
|
|||
|
{
|
|||
|
if (GameObject.Find (list[1]) == null) {yield return new WaitForSeconds(3.0f);}
|
|||
|
ClickBtnByIndex(list[1],list[2]);
|
|||
|
yield return new WaitForSeconds(1.0f);
|
|||
|
}
|
|||
|
//点击相同按钮多次
|
|||
|
if (list[0] == "ClickBtnTimes")
|
|||
|
{
|
|||
|
for (int i = 1; i <= int.Parse(list[2]); i++)
|
|||
|
{
|
|||
|
ClickBtn(list[1]);
|
|||
|
yield return new WaitForSeconds(1.0f);
|
|||
|
}
|
|||
|
}
|
|||
|
//发送GM命令
|
|||
|
if (list[0] == "SendGM")
|
|||
|
{
|
|||
|
SendGM(list[1]);
|
|||
|
yield return new WaitForSeconds(0.1f);
|
|||
|
}
|
|||
|
//延时等待
|
|||
|
if (list[0] == "Wait")
|
|||
|
{
|
|||
|
float waittime = float.Parse(list[1]);
|
|||
|
yield return new WaitForSeconds(waittime);
|
|||
|
}
|
|||
|
//随机账号
|
|||
|
if (list[0] == "InputRA")
|
|||
|
{
|
|||
|
Input(list[1], nowID);
|
|||
|
LogTest("账号是:" + nowID);
|
|||
|
}
|
|||
|
//输入文本
|
|||
|
if (list[0] == "Input")
|
|||
|
{
|
|||
|
Input(list[1],list[2].ToString());
|
|||
|
LogTest("输入的:" + list[2]);
|
|||
|
}
|
|||
|
//打开功能菜单
|
|||
|
if (list[0] == "OpenMenu") {OpenMenu();}
|
|||
|
//关闭功能菜单
|
|||
|
if (list[0] == "CloseMenu") {CloseMenu();}
|
|||
|
//断言存在控件
|
|||
|
if (list[0] == "Assert") {AssertGO(list[1]);}
|
|||
|
//断言不存在控件
|
|||
|
if (list[0] == "AssertNo") {AssertNoGO(list[1]);}
|
|||
|
//断言文本
|
|||
|
if (list[0] == "AssertText") {AssertText(list[1],list[2]);}
|
|||
|
if (list[0] == "AssertActive") {AssertActiveGO(list[1]);}
|
|||
|
//退出-切换账号
|
|||
|
if (list[0] == "Quit")
|
|||
|
{
|
|||
|
GameCenter.GameSceneSystem.ReturnToLogin(true);
|
|||
|
yield return new WaitForSeconds(10.0f);
|
|||
|
}
|
|||
|
//退出-切换角色
|
|||
|
if (list[0] == "Exit")
|
|||
|
{
|
|||
|
GameCenter.GameSceneSystem.ReturnToLogin(false,true);
|
|||
|
yield return new WaitForSeconds(10.0f);
|
|||
|
}
|
|||
|
//主角停止行动
|
|||
|
if (list[0] == "StopAction"){ StopAction();}
|
|||
|
//主角停止对应时间的行动
|
|||
|
if (list[0] == "StopActionTime")
|
|||
|
{
|
|||
|
CoroutinePool.AddTask(StartStopAction(int.Parse(list[1])));
|
|||
|
}
|
|||
|
//casestrline = casesr.ReadLine();
|
|||
|
}
|
|||
|
}
|
|||
|
LogTest("全部用例运行完毕");
|
|||
|
}
|
|||
|
|
|||
|
//协程,停止寻路stoptime秒
|
|||
|
private IEnumerator StartStopAction(int stoptime)
|
|||
|
{
|
|||
|
yield return new WaitForSeconds(0.1f);
|
|||
|
for (int i = 1; i <= stoptime*10; i++)
|
|||
|
{
|
|||
|
LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
if (lp != null && lp.IsXState(EntityStateID.PathMove))
|
|||
|
{
|
|||
|
Debug.Log ("中止寻路");
|
|||
|
GameCenter.MapLogicSwitch.DoPlayerExitPrepare();
|
|||
|
}
|
|||
|
yield return new WaitForSeconds(0.1f);
|
|||
|
}
|
|||
|
}
|
|||
|
#region 操作
|
|||
|
//点击按钮
|
|||
|
public void ClickBtn(string file)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find (file);
|
|||
|
if (go == null) {
|
|||
|
LogTest ("【Block】,找不到:" + file);
|
|||
|
} else {
|
|||
|
UICamera.Notify(go,"OnClick",null);
|
|||
|
}
|
|||
|
}
|
|||
|
//点击包含Label名称为btnname的按钮,用于多个按钮有同样的名称,btnurl为按钮路径(通常有多个同路径按钮),btnname为子节点包含的label文本
|
|||
|
public void ClickBtnByName(string btnurl, string btnname)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find(btnurl);
|
|||
|
if (go == null) {
|
|||
|
LogTest ("【Block】,找不到:" + btnurl);
|
|||
|
return;
|
|||
|
}
|
|||
|
foreach (Transform child in go.transform.parent)
|
|||
|
{
|
|||
|
foreach (UILabel child_label in child.GetComponentsInChildren<UILabel>())
|
|||
|
{
|
|||
|
if (child_label.text.Contains(btnname))
|
|||
|
{
|
|||
|
UICamera.Notify(child.gameObject, "OnClick", null);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//根据index点击btnurl的按钮
|
|||
|
public void ClickBtnByIndex(string btnurl, string btnindex)
|
|||
|
{
|
|||
|
if (GameObject.Find(btnurl))
|
|||
|
{
|
|||
|
if(GameObject.Find(btnurl).transform.parent.GetChild(int.Parse(btnindex)).gameObject)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find(btnurl).transform.parent.GetChild(int.Parse(btnindex)).gameObject;
|
|||
|
if (go == null)
|
|||
|
{
|
|||
|
LogTest ("【Block】,找不到:" + btnurl);
|
|||
|
return;
|
|||
|
}
|
|||
|
UICamera.Notify(go, "OnClick", null);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//发送GM命令
|
|||
|
public void SendGM(string GMString)
|
|||
|
{
|
|||
|
List<string> gmlist = new List<string>(GMString.Split(';'));
|
|||
|
foreach (string gm in gmlist)
|
|||
|
{
|
|||
|
MSG_Chat.ChatReqCS req = new MSG_Chat.ChatReqCS();
|
|||
|
req.chattype = 0;
|
|||
|
req.recRoleId = 0;
|
|||
|
req.condition = gm;
|
|||
|
req.chatchannel = 0;
|
|||
|
req.Send();
|
|||
|
LogTest(gm);
|
|||
|
}
|
|||
|
}
|
|||
|
//输入文本
|
|||
|
public void Input(string inputUrl,string inputString)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find(inputUrl);
|
|||
|
if (go == null) {
|
|||
|
LogTest ("【Block】,找不到:" + inputUrl);
|
|||
|
}
|
|||
|
else {
|
|||
|
UIInput name = go.GetComponent<UIInput>();
|
|||
|
name.value = inputString;
|
|||
|
}
|
|||
|
}
|
|||
|
//打开菜单
|
|||
|
public void OpenMenu()
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find("UIMainForm/RightBottom2/MenuPanel");
|
|||
|
if (!go)
|
|||
|
{
|
|||
|
LogTest ("【Block】,找不到菜单按钮");
|
|||
|
}
|
|||
|
else if (!go.activeSelf)
|
|||
|
{
|
|||
|
ClickBtn("UIMainForm/RightBottom2/MenuBtn");
|
|||
|
}
|
|||
|
}
|
|||
|
//关闭菜单
|
|||
|
public void CloseMenu()
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find("UIMainForm/RightBottom2/MenuPanel");
|
|||
|
if (!go)
|
|||
|
{
|
|||
|
LogTest ("【Block】,找不到菜单按钮");
|
|||
|
}
|
|||
|
else if (go.activeSelf)
|
|||
|
{
|
|||
|
ClickBtn("UIMainForm/RightBottom2/MenuBtn");
|
|||
|
}
|
|||
|
}
|
|||
|
//主角停止行动
|
|||
|
public void StopAction()
|
|||
|
{
|
|||
|
LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
if (lp != null)
|
|||
|
{
|
|||
|
if (lp.IsXState(EntityStateID.PathMove))
|
|||
|
{
|
|||
|
Debug.Log ("寻路中");
|
|||
|
GameCenter.MapLogicSwitch.DoPlayerExitPrepare();//lp.Stop_Action();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 断言
|
|||
|
//断言文本
|
|||
|
private void AssertText(string s1, string s2)
|
|||
|
{
|
|||
|
if (GameObject.Find(s1) != null)
|
|||
|
{
|
|||
|
UILabel ui = GameObject.Find(s1).GetComponent<UILabel>();
|
|||
|
if (ui != null)
|
|||
|
{
|
|||
|
if (ui.text == s2)
|
|||
|
{
|
|||
|
LogTest("[Pass],在:" + s1 + "的文本是:" + s2);
|
|||
|
return;
|
|||
|
}
|
|||
|
else if (ui.text.Contains(s2))
|
|||
|
{
|
|||
|
LogTest("[Pass],在:" + s1 + "包含文本:" + s2);
|
|||
|
return;
|
|||
|
}
|
|||
|
LogTest("【Fail】," + s1 + "不存在文本:" + s2);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
foreach (Transform child in GameObject.Find(s1).transform.parent)
|
|||
|
{
|
|||
|
foreach (UILabel child_label in child.GetComponentsInChildren<UILabel>())
|
|||
|
{
|
|||
|
if (child_label.text.Contains(s2))
|
|||
|
{
|
|||
|
LogTest("[Pass],在:" + s1 + "的子路径包含文本:" + s2);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
LogTest("【Fail】," + s1 + "不存在文本:" + s2);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
LogTest("【Block】,找不到: " + s1);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
//断言存在控件
|
|||
|
private void AssertGO(string s1)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find (s1);
|
|||
|
if (go == null) {
|
|||
|
LogTest ("【Fail】,找不到:" + s1);
|
|||
|
} else {
|
|||
|
LogTest ("[Pass],找到:" + s1);
|
|||
|
}
|
|||
|
}
|
|||
|
//断言不存在控件
|
|||
|
private void AssertNoGO(string s1)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find (s1);
|
|||
|
if (go == null) {
|
|||
|
LogTest ("[Pass],不存在:" + s1);
|
|||
|
} else {
|
|||
|
LogTest ("【Fail】,存在不该存在的:" + s1);
|
|||
|
}
|
|||
|
}
|
|||
|
private void AssertActiveGO(string s1)
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find (s1);
|
|||
|
if (go != null)
|
|||
|
{
|
|||
|
if (go.activeSelf) {LogTest ("[Pass],激活的:" + s1);}
|
|||
|
else {LogTest ("【Fail】,未激活的:" + s1);}
|
|||
|
}
|
|||
|
else {LogTest ("【Fail】,不存在:" + s1);}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|