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

  现在遇到的问题:

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

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

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

解决问题的思路:

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

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

View 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,为了节省篇幅就截取一部份:

View 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程序,让程序能接受命令行参数,参考代码如下:

View 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

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

  1. html载入hta文件,HTA文件去除html控件认证和接收命令行参数

    一是利用hta 去掉htm的控件验证 hta1的代码如下: sample html application one activexcontrol.htm代码如下: dim filesystem ' c ...

  2. golang flag包使用示例:接收命令行参数

    flag包 package mainimport "flag" import "fmt"// 定义命令行参数对应的变量,这三个变量都是指针类型 var cliN ...

  3. java 接收命令行参数_java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  4. 【Java学习笔记】接收命令行参数输出指定个数的斐波那契数列

    /*斐波那契数列使用命令行输入参数 */ public class Fibonacci {public static void main(String[] args){if (args.length ...

  5. linux 命令行模式自动登录,实现linux的自动登录--命令行模式启动

    linux的登录主要是由两个文件在控制,/usr/sbin/getty来获得用户名,并进行检查用户名是否存在,然后将用户名传递给/usr/bin/login来获取用户输入密码和检查密码是否正确. 所以 ...

  6. 控制台程序接收命令行参数

    如果通过CreateProcess创建进程来调用控制台程序,那么在传递命令参数时需要加上 空格,如果不加上空格,argv是无法获取到参数的,示例如下主程序: nError = ::CreateProc ...

  7. MFC接收命令行参数的三种方法

    方法一: CString sCmdline = ::GetCommandLine(); AfxMessageBox(sCmdline); 将获取到 "C:\test\app.exe -1 - ...

  8. Spring boot 梳理 - 在bean中使用命令行参数-自动装配ApplicationArguments

    If you need to access the application arguments that were passed to SpringApplication.run(-​), you c ...

  9. 【游戏开发进阶】教你Unity通过Jenkins实现自动化打包,打包这种事情就交给策划了(保姆级教程 | 命令行打包 | 自动构建)

    文章目录 一.前言 二.Jenkins简介 三.Jenkins的下载与安装 1.JDK下载与安装 2.Jenkins下载 3.Jenkins安装 4.Jenkins初始化 四.Jenkins的基本操作 ...

最新文章

  1. 老程序员的忠告:不要做浮躁的软件工程师
  2. python网页登录钉钉_django 钉钉扫码登录
  3. 竞品调研时发现的Android新设计特性
  4. 12套经典java实战教程下载链接
  5. mysql中不要 秒的函数_Mysql中日期和时间函数应用不用求人 | 很文博客
  6. CNCC2018 即将开幕,报名优惠截止倒计时5天!
  7. android内容提供器读取图片,android实现拍照或从相册选取图片
  8. 第一次用Axure~
  9. ARM 指令集 比较指令
  10. 从抓包的角度分析connect()函数的连接过程
  11. 计算机新安装系统后桌面上有什么图标,手把手教你全新安装完win10系统后如何设置显示桌面图标-系统操作与应用 -亦是美网络...
  12. 随机抽奖 php,php随机抽奖
  13. 多因素deseq2 formula 怎么理解 如何设置design 哈佛大学——差异表达分析(七)设计公式(Design formulas)多因素差异分析 多个影响因子会影响差异分析结果 多因子
  14. tplink 无线打印服务器,tplink打印服务器设置
  15. MaNGOS大芒果服务端源码研究(一)——环境安装与源码下载
  16. AI 场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
  17. 计算机画图讲课ppt,画图教学课件
  18. 怎么在一台电脑上同时打开运行两个微信号
  19. Python 基于tkinter模块的GUI可视化学生成绩管理系统实现(含文件保存)
  20. 解决docker-compose up -d 出现Client.Timeout exceeded while awaiting headers的问题(配置docker国内镜像源)

热门文章

  1. 后端技术:Java编程中忽略这些细节,Bug肯定少不了
  2. SQLServer创建数据库详解
  3. 数据库:MySQL大批量SQL插入性能优化
  4. Javascript对象及数组用法笔记
  5. Restful API 中的错误处理方案
  6. 7个免费的Linux FTP客户端工具
  7. 社交中的黄金法则,你要细细体会品味
  8. 计算机b级英语翻译,英语B级考试翻译必备常用短句
  9. python2.面向对象学生管理系统
  10. mongodb 群集图_群集和重叠条形图