用VSTS进行网址压力测试起名

情境压力测试即主体向被观察者安插一定义务和学业,借以观察个体形成职务的作为。工作样本检查评定、无领导小组商量都可真是情境压力试验。
   在软件工程中,压力测试是对系统不断施压的测试,是透过规定三个系列的瓶颈恐怕不能够接收的性能点,来获取系统能提供的最大服务级别的测试。例如测试三个Web
站点在多量的负载下,曾几何时系统的响应会滞后或退步。未来的互连网游戏中也常用到这一个词汇。 
  网络定义: 
  200捌年十月5日午后,移动公司开商务车装载200多部电信手提式有线电话机,在惠州某大学旁边不停拨打,导致邮电通讯网络瘫痪。邮电通信发现后连车带人押送到派出所,在公安部,移动自称从没违反纪律,只是帮邮电通讯做压力测试。
 
 “压力测试”与俯卧撑、打酱油等词汇1样,成为网络流行词汇。 
  压力测试、终端机品质功率、各项品质趋势目的等。

转发请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169

VSTS提供了三个添加、强大的工具平台,融合了软件开发天地的逐条剧中人物,涵盖软件开发生命周期的依次阶段,包涵布置,开发,测试,管理,而那一整套部件的通晓,让它可以使得地改正软件开发进度中逐条阶段的弊病,进步组织之间不等的剧中人物的调和能力,进步工效。

 

本文就回顾介绍一下怎么采用VSTS给1个网址做压力测试。

在上一篇文章中,我们学习了Android Service相关的不少珍视内容,包含Service的中央用法、Service和Activity进行通讯、Service的绝迹情势、瑟维斯与Thread的涉及、以及如何创制前台Service。以上所关联的那么些知识点,基本上涵盖了多数屡见不鲜开支工作中间大概应用到的Service技术。但是至于瑟维斯其实还有一个更高端的使用技术没有介绍,即远程Service的用法。使用远程Service甚至能够完毕Android跨进度通信的效率,上面就让大家具体地上学一下。

 

 

1 建立2个测试项目,起名MyTest

假定你还从未看过前边壹篇作品,提议先去读书一下 Android
Service完全解析,关于劳动你所需驾驭的方方面面(上)
 ,因为本篇小说中涉嫌到的代码是在上篇作品的基础上海展览中心开改动的。

起名 1

 

二 建立一个Web Test

在上篇小说中我们知道了,Service其实是运维在主线程里的,若是一贯在Service中处理局地耗费时间的逻辑,就会造成程序ANQX56。

起名 2

 

点击Web Test…

让大家来做个试验证爱他美(Nutrilon)下吗,修改上一篇小说中创制的ServiceTest项目,在MyService的onCreate()方法中让线程睡眠60秒,如下所示:

IE立时就会弹出2个窗口,那样录像脚本工作就能够起来了。

[java] view
plain
 copy

三 在IE里输入要测试的网址地址: 比如 http://localhost/WebSite/Default.aspx

 

四 对该网址做一些操作,
此时VSTS会纪录下您的那个操作,用以作为压力测试的风貌。

  1. public class MyService extends Service {  
  2.   
  3.     ……  
  4.   
  5.     @Override  
  6.     public void onCreate() {  
  7.         super.onCreate();  
  8.         Log.d(TAG, “onCreate() executed”);  
  9.         try {  
  10.             Thread.sleep(60000);  
  11.         } catch (InterruptedException e) {  
  12.             e.printStackTrace();  
  13.         }  
  14.     }  
  15.       
  16.     ……  
  17.   
  18. }  

伍 摄像脚本毕,点击 “STOP”

 

陆 点击生成代码,可以看来刚才录制的近乎如下的代码:

重复运行后,点击一下Start Service按钮或Bind
Service按钮,程序就会阻塞住并不可能进行任何其它操作,过一段时间后就会弹出AN卡宴的提醒框,如下图所示。

 

 

起名 3//——————————————————————————

起名 4

起名 5// <auto-generated>

 

起名 6//     This code was generated by a tool.

在此以前我们关系过,应该在瑟维斯中拉开线程去实施耗费时间职分,那样就足以有效地幸免ANENVISION的出现。

起名 7//     Runtime Version:2.0.50727.42

 

起名 8//

那正是说本篇小说的核心是介绍远程Service的用法,假设将MyService转换到3个中远距离Service,还会不会有ANEvoque的情形吗?让大家来入手尝试一下吧。

起名 9//     Changes to this file may cause incorrect behavior and will be lost if

 

起名 10//     the code is regenerated.

将1个常常的Service转换到远程Service其实卓殊不难,只须求在注册Service的时候将它的android:process属性内定成:remote就可以了,代码如下所示:

起名 11// </auto-generated>

[html] view
plain
 copy

起名 12//——————————————————————————

 

起名 13

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”  
  3.     package=”com.example.servicetest”  
  4.     android:versionCode=”1″  
  5.     android:versionName=”1.0″ >  
  6.   
  7.     ……  
  8.       
  9.     <service  
  10.         android:name=”com.example.servicetest.MyService”  
  11.         android:process=”:remote” >  
  12.     </service>  
  13.   
  14. </manifest>  

起名 14namespace MyTest

前些天再一次运营程序,并点击一下Start
Service按钮,你相会到控制台立刻打字与印刷了onCreate()
executed的新闻,而且主界面并未阻塞住,也不会冒出AN奇骏。大概过了一分钟后,又会见到onStartCommand()
executed打印了出来。

起名 15起名 16起名 17{

 

起名 18    using System;

何以将MyService转换成远程Service后就不会造成程序AN逍客了吗?那是由于,使用了长途Service后,My瑟维斯已经在此外叁个进度在那之中运维了,所以只会阻塞该进度中的主线程,并不会潜移默化到当下的应用程序。

起名 19    using System.Collections.Generic;

 

起名 20    using System.Text;

为了证可瑞康下MyService以后实在已经运维在其它2个进度个中了,我们独家在MainActivity的onCreate()方法和MyService的onCreate()方法里参预1行日志,打字与印刷出个别所在的经过id,如下所示:

起名 21    using Microsoft.VisualStudio.TestTools.WebTesting;

 

起名 22    using Microsoft.VisualStudio.TestTools.WebTesting.Rules;

[java] view
plain
 copy

起名 23

 

起名 24

  1. Log.d(“TAG”, “process id is ” + Process.myPid());  

起名 25    public class WebTest1Coded : WebTest

再度重复运维程序,然后点击一下Start Service按钮,打字与印刷结果如下图所示:

起名 26起名 27    起名 28{

 

起名 29

起名 30

起名 31        public WebTest1Coded()

 

起名 32起名 33        起名 34{

能够看出,不仅仅是进度id差异了,就连应用程序包名也不雷同了,MyService中打字与印刷的那条日志,包名前面还跟上了:remote标识。

起名 35            this.PreAuthenticate = true;

 

起名 36        }

那既然远程瑟维斯这么好用,干脆未来大家把富有的Service都转换来远程Service吧,还省得再打开线程了。其实不然,远程Service非但不佳用,甚至可以称得上是比较难用。1般意况下一旦得以不接纳远程Service,就硬着头皮不要使用它。

起名 37

 

起名 38        public override IEnumerator<WebTestRequest> GetRequestEnumerator()

上面就来看一下它的坏处吧,首先将MyService的onCreate()方法中让线程睡眠的代码去除掉,然后再一次运营程序,并点击一下Bind
Service按钮,你会意识先后崩溃了!为啥点击Start
Service按钮程序就不会崩溃,而点击Bind
Service按钮就会崩溃呢?那是出于在Bind
Service按钮的点击事件之中我们会让MainActivity和MyService建立关联,不过当前MyService已经是三个中距离Service了,Activity和Service运维在几个不等的长河当中,那时就不可能再采纳古板的创立关系的章程,程序也就完蛋了。

起名 39起名 40        起名 41{

 

起名 42            WebTestRequest request1 = new WebTestRequest(“http://localhost/WebSite/Default.aspx“);

这便是说什么样才能让Activity与2个长途Service建立关系呢?那就要选取AIDL来拓展跨进度通讯了(IPC)。

起名 43            request1.ThinkTime = 1688;

 

起名 44            ExtractHiddenFields rule1 = new ExtractHiddenFields();

AIDL(Android Interface Definition
Language)是Android接口定义语言的情趣,它能够用来让有个别Service与三个应用程序组件之间展开跨进度通讯,从而能够兑现多个应用程序共享同二个Service的功效。

起名 45            rule1.ContextParameterName = “1”;

 

起名 46            request1.ExtractValues += new EventHandler<ExtractionEventArgs>(rule1.Extract);

上边大家就来一步步地看一下AIDL的用法到底是什么的。首先须要新建二个AIDL文件,在这么些文件中定义好Activity需求与瑟维斯进行通讯的措施。新建MyAIDLService.aidl文件,代码如下所示:

起名 47            yield return request1;

[java] view
plain
 copy

起名 48

 

起名 49            WebTestRequest request2 = new WebTestRequest(“http://localhost/WebSite/Default.aspx“);

  1. package com.example.servicetest;  
  2. interface MyAIDLService {  
  3.     int plus(int a, int b);  
  4.     String toUpperCase(String str);  
  5. }  

起名 50            request2.ThinkTime = 2;

点击保存之后,gen目录下就会扭转三个应和的Java文本,如下图所示:

起名 51            request2.Method = “POST”;

 

起名 52            FormPostHttpBody request2Body = new FormPostHttpBody();

 起名 53

起名 54            request2Body.FormPostParameters.Add(“__VIEWSTATE”, this.Context[“$HIDDEN1.__VIEWSTATE”].ToString());

 

起名 55            request2Body.FormPostParameters.Add(“Button1”, “Go to Test Page”);

接下来修改MyService中的代码,在中间达成大家刚刚定义好的MyAIDLService接口,如下所示:

起名 56            request2Body.FormPostParameters.Add(“__VIEWSTATEENCRYPTED”, this.Context[“$HIDDEN1.__VIEWSTATEENCRYPTED”].ToString());

[java] view
plain
 copy

起名 57            request2Body.FormPostParameters.Add(“__EVENTVALIDATION”, this.Context[“$HIDDEN1.__EVENTVALIDATION”].ToString());

 

起名 58            request2.Body = request2Body;

  1. public class MyService extends Service {  
  2.   
  3.     ……  
  4.   
  5.     @Override  
  6.     public IBinder onBind(Intent intent) {  
  7.         return mBinder;  
  8.     }  
  9.   
  10.     MyAIDLService.Stub mBinder = new Stub() {  
  11.   
  12.         @Override  
  13.         public String toUpperCase(String str) throws RemoteException {  
  14.             if (str != null) {  
  15.                 return str.toUpperCase();  
  16.             }  
  17.             return null;  
  18.         }  
  19.   
  20.         @Override  
  21.         public int plus(int a, int b) throws RemoteException {  
  22.             return a + b;  
  23.         }  
  24.     };  
  25.   
  26. }  

起名 59            ExtractHiddenFields rule2 = new ExtractHiddenFields();

那里首先对MyAIDLService.Stub实行了贯彻,重写里了toUpperCase()和plus()那八个格局。那三个格局的作用分别是将三个字符串整体转换来大写格式,以及将八个传入的平头实行相加。然后在onBind()方法上校MyAIDLService.Stub的贯彻重回。那里怎么能够这样写吗?因为Stub其实就是Binder的子类,所以在onBind()方法中得以一贯回到Stub的兑现。

起名 60            rule2.ContextParameterName = “1”;

 

起名 61            request2.ExtractValues += new EventHandler<ExtractionEventArgs>(rule2.Extract);

接下去修改MainActivity中的代码,如下所示:

起名 62            yield return request2;

[java] view
plain
 copy

起名 63

 

起名 64            WebTestRequest request3 = new WebTestRequest(“http://localhost/WebSite/test.aspx“);

  1. public class MainActivity extends Activity implements OnClickListener {  
  2.   
  3.     private Button startService;  
  4.   
  5.     private Button stopService;  
  6.   
  7.     private Button bindService;  
  8.   
  9.     private Button unbindService;  
  10.       
  11.     private MyAIDLService myAIDLService;  
  12.   
  13.     private ServiceConnection connection = new ServiceConnection() {  
  14.   
  15.         @Override  
  16.         public void onServiceDisconnected(ComponentName name) {  
  17.         }  
  18.   
  19.         @Override  
  20.         public void onServiceConnected(ComponentName name, IBinder service) {  
  21.             myAIDLService = MyAIDLService.Stub.asInterface(service);  
  22.             try {  
  23.                 int result = myAIDLService.plus(3, 5);  
  24.                 String upperStr = myAIDLService.toUpperCase(“hello world”);  
  25.                 Log.d(“TAG”, “result is ” + result);  
  26.                 Log.d(“TAG”, “upperStr is ” + upperStr);  
  27.             } catch (RemoteException e) {  
  28.                 e.printStackTrace();  
  29.             }  
  30.         }  
  31.     };  
  32.   
  33.     ……  
  34.   
  35. }  

起名 65            request3.Method = “POST”;

咱俩只是修改了ServiceConnection中的代码。能够见见,那里首先应用了MyAIDLService.Stub.asInterface()方法将盛传的IBinder对象传换来了MyAIDLService对象,接下去就能够调用在MyAIDLService.aidl文件中定义的持有接口了。那里大家首先调用了plus()方法,并传播了叁和5看成参数,然后又调用了toUpperCase()方法,并传播hello
world字符串作为参数,最后将调用方法的回到结果打字与印刷出来。

起名 66            FormPostHttpBody request3Body = new FormPostHttpBody();

 

起名 67            request3Body.FormPostParameters.Add(“__VIEWSTATE”, this.Context[“$HIDDEN1.__VIEWSTATE”].ToString());

近期再一次运转程序,并点击一下Bind Service按钮,能够见见打字与印刷日志如下所示:

起名 68            request3Body.FormPostParameters.Add(“Button1”, “Go to default page.”);

 

起名 69            request3Body.FormPostParameters.Add(“__EVENTVALIDATION”, this.Context[“$HIDDEN1.__EVENTVALIDATION”].ToString());

起名 70

起名 71            request3.Body = request3Body;

 

起名 72            yield return request3;

有鉴于此,我们真的已经成功实现跨进度通信了,在三个进程中走访到了此外3个经过中的方法。

起名 73        }

 

起名 74    }

而是你也足以见见,方今的跨进度通讯其实并未怎么精神上的法力,因为那只是在七个Activity里调用了同三个应用程序的Service里的措施。而跨进度通讯的真的意义是为着让二个应用程序去访问另二个应用程序中的Service,以贯彻共享Service的成效。那么下边大家本来要上学一下,怎样才能在任何的应用程序中调用到MyService里的方法。

起名 75}

 

起名 76

在上一篇作品中大家曾经清楚,若是想要让Activity与瑟维斯之间创设关联,须求调用bindService()方法,并将Intent作为参数字传送递进去,在Intent里内定好要绑定的Service,示例代码如下:

七 添加一个Load Test …

[java] view
plain
 copy

起名 77

 

八 填写好Load Test的各种参数

  1. Intent bindIntent = new Intent(this, MyService.class);  
  2. bindService(bindIntent, connection, BIND_AUTO_CREATE);  

 起名 78

那边在创设Intent的时候是采纳MyService.class来内定要绑定哪二个瑟维斯的,然则在另1个应用程序中去绑定瑟维斯的时候并不曾MyService这么些类,那时就亟须采纳到隐式Intent了。往后修改AndroidManifest.xml中的代码,给MyService加上三个action,如下所示:

1) 第壹步是填写场景名

[html] view
plain
 copy

二) 第壹步是填充装载的样式

 

   
借使接纳三遍装载固定的用户数,选用第一项Constant Load

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”  
  3.     package=”com.example.servicetest”  
  4.     android:versionCode=”1″  
  5.     android:versionName=”1.0″ >  
  6.   
  7.     ……  
  8.   
  9.     <service  
  10.         android:name=”com.example.servicetest.MyService”  
  11.         android:process=”:remote” >  
  12.         <intent-filter>  
  13.             <action android:name=”com.example.servicetest.MyAIDLService”/>  
  14.         </intent-filter>  
  15.     </service>  
  16.   
  17. </manifest>  

    倘若选拔”Setp
Load”,表示步增,设置好开首时的用户数,以及由此多长期每趟扩充的用户数

 

3) Test Mix

那就印证,MyService能够响应带有com.example.servicetest.MyAIDLService这几个action的Intent。

4) Browser Mix

 

5) Network Mix

当今再一次运维一下顺序,那样就把远程Service端的办事全方位成功了。

陆) 在Counter Sets 选取Add Compuer…,表示要对某些PC进行督察

 

7) Run Settings

接下来创设二个新的Android项目,起名称叫ClientTest,我们就尝试在这一个顺序中国远洋运输总公司程调用MyService中的方法。

9 点击Finish

 

10 点击Run Test,测试就开端了。

ClientTest中的Activity假如想要和MyService建立关系其实也简单,首先须求将MyAIDLService.aidl文件从ServiceTest项目中拷贝过来,注意要将原始的包路径1起拷贝过来,完成后项目标结构如下图所示:

起名 79

 

压力测试运维后,大家就能够选中有个别参数,查看有个别时刻机器个地点的性质。参看下图: 

起名 80

起名 81

 

大家也可以运行perfmon,通过Performance查看机器的各项目标。

下一场打开或新建activity_main.xml,在布局文件中也加盟三个Bind
Service按钮:

出处:http://www.ltesting.net/ceshi/ceshijishu/rjcsgj/qita/vsts/2010/1228/201597.html

[html] view
plain
 copy

 

  1. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”  
  2.     android:layout_width=”match_parent”  
  3.     android:layout_height=”match_parent”  
  4.     android:orientation=”vertical”  
  5.      >  
  6.   
  7.    <Button   
  8.        android:id=”@+id/bind_service”  
  9.        android:layout_width=”match_parent”  
  10.        android:layout_height=”wrap_content”  
  11.        android:text=”Bind Service”  
  12.        />  
  13.   
  14. </LinearLayout>  

接下去打开或新建MainActivity,在其中参加和MyService建立关联的代码,如下所示:

[java] view
plain
 copy

 

  1. public class MainActivity extends Activity {  
  2.   
  3.     private MyAIDLService myAIDLService;  
  4.   
  5.     private ServiceConnection connection = new ServiceConnection() {  
  6.   
  7.         @Override  
  8.         public void onServiceDisconnected(ComponentName name) {  
  9.         }  
  10.   
  11.         @Override  
  12.         public void onServiceConnected(ComponentName name, IBinder service) {  
  13.             myAIDLService = MyAIDLService.Stub.asInterface(service);  
  14.             try {  
  15.                 int result = myAIDLService.plus(50, 50);  
  16.                 String upperStr = myAIDLService.toUpperCase(“comes from ClientTest”);  
  17.                 Log.d(“TAG”, “result is ” + result);  
  18.                 Log.d(“TAG”, “upperStr is ” + upperStr);  
  19.             } catch (RemoteException e) {  
  20.                 e.printStackTrace();  
  21.             }  
  22.         }  
  23.     };  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         Button bindService = (Button) findViewById(R.id.bind_service);  
  30.         bindService.setOnClickListener(new OnClickListener() {  
  31.             @Override  
  32.             public void onClick(View v) {  
  33.                 Intent intent = new Intent(“com.example.servicetest.MyAIDLService”);  
  34.                 bindService(intent, connection, BIND_AUTO_CREATE);  
  35.             }  
  36.         });  
  37.     }  
  38.   
  39. }  

那一部分代码我们自然会要命熟练吧?没有错,那和在ServiceTest的MainActivity中的代码差不离是完全相同的,只是在让Activity和Service建立关系的时候我们使用了隐式Intent,将Intent的action内定成了com.example.servicetest.MyAIDLService。

 

在现阶段Activity和MyService建立关系之后,我们仍旧是调用了plus()和toUpperCase()那三个法子,远程的My瑟维斯会对传播的参数举行拍卖并回到结果,然后将结果打字与印刷出来。

 

那样的话,ClientTest中的代码也就满门形成了,以往运作一下这几个项目,然后点击Bind
Service按钮,此时就会去和远程的MyService建立关系,观望LogCat中的打字与印刷音信如下所示:

 

起名 82

 

不用自家说,大家都曾经见到,大家的跨进程通讯功用已经到家兑现了。

 

只是还有一些亟待验证的是,由于那是在分歧的进度之间传递数据,Android对那类数据的格式协理是老大有限的,基本上只可以传递Java的着力数据类型、字符串、List或Map等。那么1旦本身想传递3个自定义的类该怎么做吧?那就亟需要让那些类去贯彻Parcelable接口,并且要给那一个类也定义五个同名的AIDL文件。那有些情节并不复杂,而且和瑟维斯关系相当小,所以就不再详细进行教学了,感兴趣的对象能够协调去查看一下相关的素材。

 

好了,结合上下两篇,那正是关于Service你所需明白的百分百。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图