项目中测试工具的使用【暨软件工程实践第五次个人作业】

【软件工程综合实践专题】

——项目中测试工具的使用

[Jewish]SHOU 1759223

目录:

《软件工程综合实践专题》················1

1.软件测试的重要性····················2

2.软件测试在什么时期最合适··························3 

3.Unity单元测试工具介绍································4

4.Unity单元测试工具使用····················5

5.Unity性能测试············································6

6.学习感悟············································7

Page2 软件测试的重要性

       软件测试的他的目的就是确保软件的质量、确认软件以正确的方式做了你所期望的事情,所以他的工作主要是发现软件的错误、有效定义和实现软件成分由低层到高层的组装过程、验证软件是否满足任务书和系统定义文档所规定的技术要求、为软件质量模型的建立提供依据。
       而且软件的测试不仅是要确保软件的质量,还要给开发人员提供信息,以方便其为风险评估做相应的准备,重要的是他要贯穿在整个软件开发的过程中,保证整个软件开发的过程是高质量的。正如教材上所举的六个例子,他们说明了软件测试在整个软件开发的过程中时不可或缺的,要是能够及早的发现爱国者导弹防御系统的缺陷就不会有28个灵魂的悲歌;如果能够早日发挥软件测试的功效,也许“千年虫”将被扼杀于摇篮之中,那么数百亿美元的损失费用将能够促进又一个跨世纪的综合国力的提升;如果能在最开始的时候发现狮子王程序的漏洞,那么也不会给孩子们的童年带来不快乐的记忆和阴影。正是这些小的错误酿成的巨大的反响,使我们不得不重视软件测试,正确的认识到软件测试在整个软件开发的过程中的至关重要的决定性,也许只是最简单的输入的错误使数十年的心血毁于一旦。
Page3什么时候开始测试最合适
      在软件的生命周期中强调,软件测试时在软件设计及程序编码之后,在软件运行之前进行最为合适。但是依我个人所见,考虑到测试人员在软件开发过程中的寻找Bug、避免软件开发过程中的缺陷、关注用户的需求等任务,所以作为软件开发人员,软件测试要嵌入在整个软件开发的过程中,比如在软件的设计和程序的编码等阶段都得嵌入软件测试的部分,要时时检查软件的可行性,但是作为专业的软件测试工作,还是在程序编码之后,软件运行之前最为合适。

Page4 Unity单元测试工具介绍

      单元测试目前有很多成熟的框架可以供我们使用,我比较推荐的就是Unity Editor自带的Editor Tests Runner,功能不多,但是已经够用了,使用也很方便。Editor Tests Runner是开源单元测试工具NUnit在Unity引擎中的实现,目前Unity中使用的NUnit版本是2.6.4。Editor Tests Runner可以通过Window -> General->Tests Runner菜单打开,它的样子如下图所示:

 

产生以下窗口:

 

2.点击create test 后将会在project中生成以下文件,如图:

 

Page5 Unity单元测试工具使用

1. 在这个窗口中显示了当前添加的单元测试用例,以及他们通过的情况。首先,你需要点击窗口左上角的Run All按钮来执行所有的单元测试。绿色的对号表示这个用例通过了单元测试,红色的禁止符号表示未通过单元测试。下面我们来看一下如何编写单元测试的代码。单元测试代码和游戏运行时代码是分开保存的,它只在Editor环境下可用,因此你需要把它放到Editor目录下。

首先为了下面的测试,我们先定义一个自定义类型的错误异常,提前备用。只需要让它直接继承 ApplicationException 就可以了,代码如下所示:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

/// <summary>

/// 自定义的异常类型

/// </summary>

class NegativeHealthException : ApplicationException

{

}

2.  下面编写我们的需要进行被测试的模块或者代码,界面中我们需要查看软件运行时间之类。代码如下所示:

using System.Collections;

using System.Collections.Generic;

using NUnit.Framework;

using UnityEngine;

using UnityEngine.TestTools;

 

namespace Tests

{

    public class NewTestScript1

    {

        GameObject str;

        void Start()

        {

            Debug.Log("StartTime=" + Time.time);

        }

        void Update()

        {

            Debug.Log("Time=" + Time.time);

        }

 

        // A Test behaves as an ordinary method

        [Test]

        public void NewTestScriptSimplePasses()

        {

            string a = Time.time.ToString();

            Assert.IsEmpty(a, "成功", str);

        }

 

        // A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use

        // `yield return null;` to skip a frame.

        [UnityTest]

        public IEnumerator NewTestScriptWithEnumeratorPasses()

        {

            // Use the Assert class to test conditions.

            // Use yield to skip a frame.

            yield return null;

        }

    }

}

我们可以点击左上角run all:发现通过测试

 

3.  界面中我们需要判单在AR模式中连接EasyAR插件是否成功:

using UnityEngine;

using EasyAR;

 

namespace EasyARSample

{

    public class HelloARTargetTest : MonoBehaviour

    {

        private const string title = "Please enter KEY first!";

        private const string boxtitle = "===PLEASE ENTER YOUR KEY HERE===";

        private const string keyMessage = ""

            + "Steps to create the key for this sample:\n"

            + "  1. login www.easyar.com\n"

            + "  2. create app with\n"

            + "      Name: HelloARMultiTarget-SameImage (Unity)\n"

            + "      Bundle ID: cn.easyar.samples.unity.helloarmultitarget.si\n"

            + "  3. find the created item in the list and show key\n"

            + "  4. replace all text in TextArea with your key";

 

        private void Awake()

        {

            if (FindObjectOfType<EasyARBehaviour>().Key.Contains(boxtitle))

            {

#if UNITY_EDITOR

                UnityEditor.EditorUtility.DisplayDialog(title, keyMessage, "OK");

#endif

                Debug.LogError(title + " " + keyMessage);

            }

        }

    }

}

运行测试后,我们可以发现在控制器里面多了如下结果,说明连接成功:

 

Page6 Unity性能测试

性能测试方面,我们可以使用Unity自带的Profile可以用来对程序性能(内存占用、渲染瓶颈)进行查看、分析,当应用程序发布出来之后,还能通过Profile对应用程序真机进行测试,对不同设备兼容性进一步测试。

Android使用Profile:

    1.关闭手机数据流量

    2.打开wifi(确保手机和unity所在pc在同一局域网)

3.使用unity打包apk,打包时需要勾选

 

4.在手机段启动apk应用,

 

5.profiler自动弹出并显示手机运行apk的真实参数

音频

 

CPU使用

 

显示内存:

 

6.如果 Unity 编辑器 (Editor) 自动连接设备失败,从分析器窗口 (Profiler Window) 的活动分析器 (Active Profiler) 下拉菜单中选择正确的设备

7.最后就能在Unity中调试显示内存等暂用信息:

有以下参数可以参考:

System.ExecutableAndDlls:系统可执行程序和DLL,是只读的内存,用来执行所有的脚本和DLL引用。不同平台和不同硬件得到的值会不一样,可以通过修改Player Setting的Stripping Level来调节大小。

Ricky:我试着修改了一下Stripping Level似乎没什么改变,感觉虽占用内存大但不会影响游戏运行。我们暂时忽略它吧(- -)!

GfxClientDevice:GFX(图形加速\图形加速器\显卡 (GraphicsForce Express))客户端设备。

Ricky:虽占用较大内存,但这也是必备项,没办法优化。继续忽略吧(- -)!!

ManagedHeap.UsedSize:托管堆使用大小。

Ricky:重点监控对象,不要让它超过20MB,否则可能会有性能问题!

ShaderLab:Unity自带的着色器语言工具相关资源。

SerializedFile:序列化文件,把显示中的Prefab、Atlas和metadata等资源加载进内存。

Ricky:重点监控对象,这里就是你要监控的哪些预设在序列化中在内存中占用大小,根据需求进行优化。

PersistentManager.Remapper:持久化数据重映射管理相关

Ricky:与持久化数据相关,比如AssetBundle之类的。注意监控相关的文件。

ManagedHeap.ReservedUnusedSize:托管堆预留不使用内存大小,只由Mono使用。

Profiler内存重点关注优化项目:

1)ManagedHeap.UsedSize: 移动游戏建议不要超过20MB.

2)SerializedFile: 通过异步加载(LoadFromCache、WWW等)的时候留下的序列化文件,可监视是否被卸载.

3)WebStream: 通过异步WWW下载的资源文件在内存中的解压版本,比SerializedFile大几倍或几十倍,不过我们现在项目中展示没有。

4)Texture2D: 重点检查是否有重复资源和超大Memory是否需要压缩等.

5)AnimationClip: 重点检查是否有重复资源.

6)Mesh: 重点检查是否有重复资源.

Page7 学习感悟:

软件测试是用来描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。软件测试是对软件产品和阶段性工作成果进行质量检验,软件测试的目的是发现缺陷并且修正缺陷。

软件开发中出现错误或缺陷的机会越来越多,市场对软件质量重要性的认识逐渐增强。所以,软件测试在软件项目实施过程中的重要性日益突出。但是,现实情况是,与软件编程比较,软件测试的地位和作用,还没有真正受到重视,对于很多人(甚至是软件项目组的技术人员)还存在对软件测试的认识误区,这进一步影响了软件测试活动开展和真正提高软件测试质量。

在目前极限编程中有一个TDD测试驱动开发,具体来说就是测试在前,编码在后,这个主流的方法足以说明软件测试的重要性,人们一般认为,软件项目要经过以下几个阶段:需求分析,概要设计,详细设计,软件编码,软件测试,软件发布。据此,认为软件测试只是软件编码后的一个过程。这是不了解软件测试周期的错误认识。软件测试是一个系列过程活动,包括软件测试需求分析,测试计划设计,测试用例设计,执行测试。因此,软件测试贯穿于软件项目的整个生命过程。在软件项目的每一个阶段都要进行不同目的和内容的测试活动,以保证各个阶段的正确性。软件测试的对象不仅仅是软件代码,还包括软件需求文档和设计文档。软件开发与软件测试应该是交互进行的,例如,单元编码需要单元测试,模块组合阶段需要集成测试。如果等到软件编码结束后才进行测试,那么,测试的时间将会很短,测试的覆盖面将很不全面,测试的效果也将大打折扣。更严重的是如果此时发现了软件需求阶段或概要设计阶段的错误,如果要修复该类错误,将会耗费大量的时间和人力。

猜你喜欢

转载自www.cnblogs.com/Jewish/p/10961019.html