C# winform 窗体接收命令行参数自动登录进行系统,模拟600个WCF客户端的并发压力测试...

  我们想要达到的目的是模拟600个客户端的消息提醒功能,当然我们没有600个电脑可以拿来测试,我们只有4-5台电脑可以用来测试,那我们就想办法在一个电脑上执行100来个客户端,用不通的帐户登录,模拟600个并发时的情况.

  现在遇到的问题:

  1:一个个登录,每个电脑上登录100来个用户是很繁琐的事情,人都会眼花缭乱。

  2:在测试过程中往往会发现一些问题,这时候又需要重新部署服务器端,又要部署客户端,那是很要命的事情。

  3:随时想测试程序性能的时候,不需要别人的协助,只要自己一个人是否可以顺利进行测试,又轻松又快的方式是否可以?总不能要求别人总加班,靠自己。

 

解决问题的思路:

 1:先把数据库里的用户名密码,都修改为有规律的密码,由于我们用的是测试数据库,所以密码是可以随便修改的,我们编写一段程序让系统中所有的用户的密码与用户名相同,由于密码在数据库里是加密的,所以需要用程序脚本来设置。

 2:在设置密码的同时,我们把自动运行的DOS脚本指令也获取了,那不是一箭双雕了不是,那我们就编写一段程序来实现一下这2个任务。

ExpandedBlockStart.gifView Code
//--------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. 
//--------------------------------------------------------------------

using System.Data;
using System.IO;
using System.Text;

namespace DotNet.Example
{
    using DotNet.DbUtilities;
    using DotNet.Manager;
    using DotNet.Model;
    using DotNet.Utilities;

    public class UserPassword
    {
        public void SetPassword()
        {
            // 检查密码强度,默认要检查比较好,系统安全性高一些
            BaseSystemInfo.CheckPasswordStrength = true;
            // 打开数据库
            
// IDbHelper dbHelper = new OracleHelper("Data Source=KANGFU;user=usercenter;password=usercenter;");
            IDbHelper dbHelper = new SqlHelper("Data Source=localhost;Initial Catalog=UserCenterV36;User Id = sa ; Password = Password@sa;");
            dbHelper.Open();
            // 批处理指令
            StringBuilder Batch = new StringBuilder(); 
            // 获取用户列表,有效的,没有被删除的
            BaseUserManager userManager = new BaseUserManager(dbHelper);
            DataTable dt = userManager.GetDT(BaseUserTable.FieldDeletionStateCode, "0", BaseUserTable.FieldEnabled, "1");
            BaseUserEntity userEntity = null;
            foreach (DataRow dataRow in dt.Rows)
            {
                userEntity = new BaseUserEntity(dataRow);
                // 设置密码
                userManager.SetPassword(userEntity.Id.ToString(), userEntity.UserName.ToString());
                Batch.AppendLine(string.Format("start D:\\DotNet.Common\\DotNet.CommonV3.6\\DotNet.WinForm\\bin\\Debug\\DotNet.WinForm.exe UserName={0} Password={1}", userEntity.UserName.ToString(), userEntity.UserName.ToString()));
            }
            dbHelper.Close();

            // 将批处理写入文件
            WriterFile(Batch.ToString());
        }

        /// <summary>
        
/// 将批处理写入文件
        
/// </summary>
        
/// <param name="batch">指令</param>
        private void WriterFile(string batch)
        {
            // 把批处理结果保存到文件
            string writerFileName = "D:\\DotNet.Common\\DotNet.CommonV3.6\\DotNet.WinForm\\bin\\Debug\\RunTest.bat";
            StreamWriter streamWriter = new StreamWriter(writerFileName, false, Encoding.Default);
            streamWriter.Write(batch);
            streamWriter.Close();
        }
    }
}

 得到的DOS批量处理的结果如下RunTest.bat,为了节省篇幅就截取一部份:

ExpandedBlockStart.gifView Code
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=Administrator Password=Administrator
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=SystemAdmin Password=SystemAdmin
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=UserAdmin Password=UserAdmin
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=jiangyanxiao Password=jiangyanxiao
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=hukuangming Password=hukuangming
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=caoyaping Password=caoyaping
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=gaoyufen Password=gaoyufen
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=xuqianping Password=xuqianping
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=jianglisha Password=jianglisha
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=zhuqingqing Password=zhuqingqing
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=luyizhou Password=luyizhou
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=qianleilei Password=qianleilei
start D:\DotNet.Common\DotNet.CommonV3.6\DotNet.WinForm\bin\Debug\DotNet.WinForm.exe UserName=lijia Password=lijia

 3:调试winform程序,让程序能接受命令行参数,参考代码如下:

ExpandedBlockStart.gifView Code
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // System.Console.WriteLine(WindowsIdentity.GetCurrent().Name);

            
// 主应用程序集名
            BaseSystemInfo.MainAssembly = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
            BaseSystemInfo.StartupPath = Application.StartupPath;
            BaseSystemInfo.AppIco = Path.Combine(Application.StartupPath, "Resource/Form.ico");

            // 获取配置信息
            GetConfig();

            // 这里检查是否有外部用户名密码传输进来过
            if (args.Length > 0)
            {
                for (int i = 0; i < args.Length; i++)
                {
                    if (args[i].ToString().StartsWith("UserName"))
                    {
                        BaseSystemInfo.CurrentUserName = args[i].ToString().Substring("UserName".Length + 1);
                    }
                    else if (args[i].ToString().StartsWith("Password"))
                    {
                        BaseSystemInfo.CurrentPassword = args[i].ToString().Substring("Password".Length + 1);
                        if (BaseSystemInfo.ClientEncryptPassword)
                        {
                            BaseSystemInfo.CurrentPassword = SecretUtil.Encrypt(BaseSystemInfo.CurrentPassword);
                        }
                    }
                    // Console.WriteLine(i.ToString() + ":" + args[i].ToString());
                }
            }

            if (BaseSystemInfo.MultiLanguage)
            {
                // 多语言国际化加载
                ResourceManagerWrapper.Instance.LoadResources(Path.Combine(Application.StartupPath, "Resource/Localization/"));
                // 从当前指定的语言包读取信息
                AppMessage.GetLanguageResource();
            }

            // 初始化服务
            DotNetService.Instance.InitService();

            // 按配置的登录页面进行登录,这里需要运行的是主程序才可以
            Form mainForm = BaseInterfaceLogic.GetForm(BaseSystemInfo.MainAssembly, BaseSystemInfo.MainForm);
            Application.Run(mainForm);
        }

 4:配置项目工程属性,模拟输入命令行参数如下图:

  5:把程序配置为能自动登录的状态如下效果图:

     也可以通过手工修改配置文件的方式把  Config.xml 里的

 <!-- 是否自动登录,默认不自动登录会好一些 -->
 <add key="AutoLogOn"value="True" /> 也可以达到相同的效果.

 

  6:万事大吉,只要双击 RunTest.bat,瞬间几百个客户端就自动登录,能模拟多用户并发压力测试了,将来做其它项目还可以反复使用,不用依靠别人自己一个人就可以测试了,省心省事了。

 

    开发软件很多功能都很简单,但是一个每个功能实现好都需要几个小时时间,例如这个自动登录进行压力测试的程序也编写调试了4个小时左右, 一个软件系统往往需要成白上千的功能点,前后编写花费的时间就会很长了,需要投入很密集的劳动力.

 

   例如我想购买一个软件,软件只有一个要求"姓李的周三不能登录,姓白的周日不能登录",就这么一个软件,你需要多久能开发好? 其实他没说这个软件背后的100个需求,当你开发好了后,客户会说,怎么没有权限管理功能? 怎么没有角色管理功能? 怎么没设置密码功能? 怎么没锁定帐户功能??????????

 

   就像是我想购买一个进销存,需要分级管理分级授权,你要开价多少? 其实他想要用友软件的所有功能,同时也想要金蝶的所有的优点之上要结合他们自己在用的系统优点,再加一个分级管理分级授权的功能,所以我们做任何软件系统,都需要把那些公用的,基础的1000个功能点都做好了,再去开发第1001个功能,才好满足客户的需要。

 

转载于:https://www.cnblogs.com/jirigala/archive/2011/10/02/2197964.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UpdatePanel的用法

UpdatePanel控件也是Ajax里用得最多的控件之中的一个&#xff0c;UpdatePanel控件是用来局部更新网页上的内容&#xff0c;网页上要局部更新的内容必须放在UpdatePanel控件里&#xff0c;他必须和上一次说的ScriptManager控件一起使用。如今来看UpdatePanel的属性UpdatePanel重…

JMeter压测笔记

每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。Jmeter 是一款使用Java开发的&#xff0c;开源免费的&#xff0c;测试工具&#…

系统同传软件_如何戴耳机录制自己的同传练习?

在学校上课的话&#xff0c;有同传实验室的模拟会议系统可以完成同传的录制&#xff0c;但是自己的练习的时候就会出现录制的问题。曾经在一次导专课上遇到过这种尴尬&#xff0c;由于需要将自己的同传练习录音分享给老师和同学听&#xff0c;所以就要把源语和译入语都录制下来…

颜宁课题组再发Cell!1个月时间内4篇顶刊!

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;iNature&#xff08;作者&#xff1a;枫叶&#xff09;、微博转自&#xff1a;募格学术6月15日晚&#xff0c;颜宁团队和新南威尔士大学杨洪远团队合作&#xff0c;在Cell 《细胞》在线发表了题为“Structural Basis…

BOOST 线程完全攻略 - 结束语

2019独角兽企业重金招聘Python工程师标准>>> 全文介绍了3个boost::thread的扩展类&#xff0c;希望能给大家书写多线程代码带来便捷。 thread -> controlled_module_ex ->controlled_module 那么我们具体在什么情况下选用不同的扩展类呢&#xff1f; 1.如果你…

.NET Core使用Nlog记录日志

NLog是适用于各种.NET平台&#xff08;包括.NET标准&#xff09;的灵活&#xff0c;免费的日志记录平台。NLog使写入多个目标变得容易 。&#xff08;数据库&#xff0c;文件&#xff0c;控制台&#xff09;并即时更改日志记录配置。NLog支持结构化 和传统日志记录。NLog的重点…

动态路由协议(RIP)

动态路由协议包括距离矢量路由协议和链路状态路由协议。RIP&#xff08;Routing InformationProtocols&#xff0c;路由信息协议&#xff09;是使用最广泛的距离矢量路由协议。RIP 是为小型网络环境设计的&#xff0c;因为这类协议的路由学习及路由更新将产生较大的流量&#x…

这几道挑战极限的烧脑题,烧脑到爽爽爽爽爽!

▲ 点击查看 在美国&#xff0c;有一个天才儿童计划&#xff0c;选拔一批“天才”儿童进入天才班。这个计划是为了保证每个人接受平等教育机会的同时&#xff0c;也为精英成长提供合适的土壤。美国所谓的天才和精英是怎样的标准呢&#xff1f;进入天才班的儿童首先要通过一个叫…

WPF 跟随拖动改变的三次贝塞尔曲线思路

代码不多&#xff0c;思路也很简单&#xff0c;先看看效果&#xff1a;简单示例&#xff0c;所有代码都在MainWindow.xaml和MainWindow.xaml.cs内&#xff0c;Xaml代码&#xff1a;<Window x:Class"WPFDemos.MainWindow"xmlns"http://schemas.microsoft.com/…

php语言难点,PHP知识难点TOP3,挑战一下你

PHP知识难点TOP3,挑战一下你这里有新鲜出炉的PHP设计模式&#xff0c;程序狗速度看过来&#xff01;PHP开源脚本语言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点&#xf…

thymeleaf加载不了js引用_网站首页加载慢解决方案

打开网页&#xff0c;用户最满意的时间是2-5秒&#xff0c;如果用户等待超过10秒&#xff0c;99%的用户会关闭这个网页。那么&#xff0c;是什么原因会导致网站打开慢&#xff1f;又有什么办法解决呢&#xff1f;一般来说&#xff0c;http请求过多、网页过大、服务器性能过差等…

基础设备----笔记

插一条&#xff1a;OSI七层网络模型网络设备调制解调器&#xff1a;将数据&#xff0c;在数字信号和模拟信号之间转换网卡&#xff1a;基本数据转换、信息包的装配和拆装、网络存取控制、数据缓存、生成网络信号等。网卡按主板总线类型分类&#xff1a;ISA---分为8位和16位两种…

黑客大佬:我是如何让50个文件一起骗过AI安防系统的?

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;大数据文摘编译&#xff1a;邢畅、张睿毅、钱天培你有没有想过当黑客呢&#xff1f;破解手机密码&#xff0c;黑入公司系统&#xff0c;甚至…控制全球电脑。打住打住&#xff01;违法犯罪的念头显然不能有。再退一步讲&…

WTM框架使用技巧之:CI/DI(持续集成/持续部署)

快点关注我们吧作者介绍王晓东&#xff0c;从事工业物联网行业多年&#xff0c;深入了解纺织、汽车零部件等制造业业务。开发过MES、WCS、SCADA、智能产线、质量追溯、工业通讯、linux网关等系统。对跨平台部署、运维有一定经验。使用WTM框架提高了40%的开发效率&#xff0c;WT…

php 建立自己的框架,利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备...

“一个时代结束了&#xff0c;另一个时代开始了。”Framework Interoperability Group(框架可互用性小组)&#xff0c;简称 FIG&#xff0c;成立于 2009 年。FIG 最初由几位知名 PHP 框架开发者发起&#xff0c;在吸纳了许多优秀的大脑和强健的体魄后&#xff0c;提出了 PSR-0 …

python3 UnicodeEncodeError: 'ascii' 错误

2019独角兽企业重金招聘Python工程师标准>>> python 3.4 使用urllib.request.urlopen() 打开url时候&#xff0c;如果url中包含中文&#xff0c;出现了“UnicodeEncodeError: ascii codec cant encode ”的错误&#xff0c;修复步骤如下 在url中有中文的地方加入…

女朋友的道歉方式

1 女朋友的道歉方式2 看吧,无聊的时候什么事都干得出来3 这猫太坏了&#xff01;4 还以为是特效,原来是实物 5 叉子的妙用6 也太信任这块玻璃了吧……7 棉花糖炸酱面......大家感受一下你点的每个赞&#xff0c;我都认真当成了喜欢

单元测试(三)基本使用

介绍本文来演示一下同事教导后的写法&#xff0c;同样有些单元测试是为了演示而写的单元测试。本文使用组件&#xff1a;Xunit、Moq以及dotNet相关知识注&#xff1a;本文内容基于上一篇操作首先指定一个方法编写单元测试&#xff0c;并且要保证没有其他因素干扰的情况下去进行…

帆软帮助文档_帆软:像阿甘一样,奔跑在商业智能的赛道上

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 晶少出品 | CSDN云计算(ID&#xff1a;CSDNcloud)故事开始于一片洁白的羽毛&#xff0c;从空中降落缓缓飘过房屋、街道、树梢&#xff0c;最终落在了主人公阿甘的脚旁&#xff0c;他没有过多思考就将羽毛轻轻收藏书中……这是…

叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界

全世界只有3.14 % 的人关注了爆炸吧知识众所周知&#xff0c;中国拥有约960万平方公里的陆地面积&#xff0c;我们生活在这片大地之上。但却鲜有人知道&#xff0c;中国的水下也有一座城。这是一座位于杭州千岛湖下的千年古城&#xff0c;历经61年&#xff0c;它们在水底&#…