TravelingBirds

有责任,我们才有共识.

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  23 随笔 :: 11 文章 :: 4 评论 :: 0 引用

2008年4月10日 #

    很早知道using的对资源应用的作用,但一直就没有在实践中应用过.今天系统的理解了一下!

[1] 因为需要Lanuch起一个应用程序,对其后进行处理.但考虑到在正常Kill()它之前的操作用异常抛出.采用了如下的重用方案!  在重载的Dispose()中我们延迟了Kill()需要操作的应用程序.

public class TestProcess : IDisposable
    
{
        
private Process process;
        
        
public TestProcess(Process processToWrap)
        
{
            process 
= processToWrap;
        }


        
public Process Process
        
{
            
get
            
{
                
return process;
            }

        }

        
        
IDisposable Members
    }

[2] 启动被使用的程序,

使用using 后会自动调用Dispose()方法进行销毁


 using (TestProcess licAdminProcess = new TestProcess(Process.Start(protectorPath)))
            
{
//这里我对已经Lanuch起来的程序开始一些其它的操作.如有异常,它不会阻止被使用程序的关闭!
            }
posted @ 2008-04-10 17:45 zencorn 阅读(30) | 评论 (0)编辑

2008年4月7日 #

posted @ 2008-04-07 17:20 zencorn 阅读(10) | 评论 (0)编辑

2008年3月26日 #

 1 public static void InitTestAssembly(TestContext context)
 2        {
 3            if (AssemblyResolver.referencePaths != null)
 4            {
 5                // already initialized
 6                return;
 7            }

 8
 9            AssemblyResolver.referencePaths = new List<string>();
10
11            // setup assembly resolver
12            string referencePath = System.Configuration.ConfigurationManager.AppSettings["ReferencePath"];
13
14            if (referencePath != null)
15            {
16                // paths should be semi-colon delimited
17                string[] paths = referencePath.Split(';');
18
19                foreach (string path in paths)
20                {
21                    string fullPath = System.Environment.ExpandEnvironmentVariables(path);
22
23                    if (!Path.IsPathRooted(fullPath))
24                    {
25                        // make all relative paths relative to this file
26                        string myAssembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
27                        string myPath = Path.GetDirectoryName(myAssembly);
28
29                        fullPath = Path.GetFullPath(Path.Combine(myPath, fullPath));
30                    }

31
32                    referencePaths.Add(fullPath);
33                }

34            }

35
36            // hook up our ResolveAssembly method in the app domain
37            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
38        }

39
posted @ 2008-03-26 15:58 zencorn 阅读(14) | 评论 (0)编辑

2008年3月12日 #

 class Car
    
{
        
private int iYear = 0;
        
private string sName = "";
        
public Car()
        


        }

        
public Car(int year, string name)
        
{
            Car oTemp 
= new Car();
            Car oStructure 
= new Car(oTemp);
            
this.iYear = year;
            
this.sName = name;
            Console.WriteLine(
"Structureone");
            Console.WriteLine(
this.iYear );
            Console.WriteLine(
this.sName );
        }

        
public Car(Car ocar)
        
{
            
this.iYear = ocar.iYear;
            
this.sName = ocar.sName;
            Console.WriteLine(
"Structuretwo");
            Console.WriteLine(
this.iYear );
            Console.WriteLine(
this.sName );
        }

   class Program
    
{
        
static void Main(string[] args)
        
{
            Car oCarOne 
= new Car(1983"Eagle");
            Car oCarTwo 
= new Car(oCarOne);
            Console.Read() ;
        }

    }

posted @ 2008-03-12 15:44 zencorn 阅读(15) | 评论 (0)编辑

2008年3月11日 #

知识回顾:
IIS:Internet Information Server的缩写为(IIS)是一个World Wide Web server。Gopher server和FTP server全部包容在里面。 IIS意味着你能发布网页,并且有ASP(Active Server Pages)、JAVA、VBscript产生页面,有着一些扩展功能。IIS支持一些有趣的东西,象有编辑环境的界面(FRONTPAGE)、有全文检索功能的(INDEX SERVER)、有多媒体功能的(NET SHOW)
其次,IIS是随Windows NT Server 4.0一起提供的文件和应用程序服务器,是在Windows NT Server上建立Internet服务器的基本组件。它与Windows NT Server完全集成,允许使用Windows NT Server内置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点。

证书:证书是允许服务器和客户彼此验证的数字标识文档。他们请求在服务器和客户端浏览器建立 SSL 连接,通过此连接可以发送加密信息。IIS 中基于证书的 SSL 特性由服务器证书、客户端证书和不同的数字密钥组成。

[讲解:
证书分两种一种是服务器端的,一种是客户端的。他们完成了建立SSL加密连接的功能。
SSL 的英文全称是 “Secure Sockets Layer” ,中文名为 “ 安全套接层协议层 ”。
密钥:加密解密时所使用的参数,可以是一个整数或一串字符,或其它任何加解密方法所能理解的形式]


服务器证书: 给用户提供了一种确认我们的网站身份的方法。服务器证书包含详细的标识信息,如与服务器内容相关的机构的名称,签发证书机构的名称和用于建立加密连接的“公钥”。用户可使用此类信息确定 Web 服务器内容的真实性以及安全 HTTP 连接的完整性。

加密:信息在发送前由加密对其进行“编码”,接收后由解密进行“解码”。IIS 中这种加密的基础是 SSL 3.0 协议,它提供了一种与用户建立加密通讯链接的安全方法。

配置实验:
一,服务器上装有CA(Certificate Server)
1,服务器上安装CA


注意:自己建立CA 机构时,所给CA机构起的名是自己定义的,在客户端的IE中,在一开始并不属于客户端信任的根证书颁发机构,如果,客户端没有把该CA机构加为自己所信任的根证书颁发机构,那么在客户端访问该服务器上的网站时,会出现安全警告信息。如下图

2,建立并安装一个站点证书
步骤如下:
   打开IIS,选定要安装证书的站点,单击右键,选择弹出菜单中的properties 其它操作如下。
   

文件以.txt的格式存于本机目录下。





B   在安装了Certificate Service的机器上可以从位于http://localhost/certsrv 的Certificate Server Administration Tools Web页面可以访问该注册控件。

后记:为了学习本文的知识,查了许多的网页资料。可很遗憾很多人都是为了解释而解释,通篇冗余的概念堆砌真是“先生之学,即空且庸”。但仍然向那些负责任且撰写了有实际参考意义的广大网友致以崇高的敬意!也希望本文有所不足的地方大家能够留言指出,我会立即更正。
posted @ 2008-03-11 17:28 zencorn 阅读(49) | 评论 (0)编辑

2008年3月6日 #

基于windows平台的各种绘图第三方控件很多,从.NET的CrystalReportg到ActiveReport自己还用过几款.今天初步试了一下ZedGraph,体会了一下它的使用原理与应用方向.整理如下.

1.ZedGraph 是一种绘图类的第三方控件,因此有别与用于定制打印输出的报表系列的控件.
2.ZedGraph 功能很强,可以动态/静态的展现客户体验,调用简单方便(只需将DLL加入Reference).
3.ZedGraph 中文的帮助文档没找着郁闷中(不能系统的学习),不过在CodeProject中找到了较全面帮助可以拿来看看.

使用ZedGraph的一个实例:



实现步骤
1. 去CodeProject把ZedGraph的DLL文件down到本地,并引入Project中.



2. 在CS文件中准备绘图数据.
    2.1 与其他控件集合一样,zedGraph也都有基本的显示属性设置,如下。
            this.zedGraphControl1.GraphPane.Title.Text = // 表头
            this.zedGraphControl1.GraphPane.XAxis.Title.Text = // 横坐标lable
            this.zedGraphControl1.GraphPane.YAxis.Title.Text = // 纵坐标label
     2.2 高级属性设置 
     BarItem myCurve = myPane.AddBar("住户室温", list, Color.Blue);//BarItem  标识项
     ZedGraph.AxisType.DateAsOrdinal
3. 绘图方法
   zedGraphControl1.GraphPane.AddCurve("住户室温", x1, y1, Color.Red, SymbolType.None);// AddCurve 方法用四个重载,可以用多种方法载入要绘制的对象方法。
    this.zedGraphControl1.AxisChange();        //固定用法。
    this.zedGraphControl1.Refresh();              //如果是用Timer动态的描绘图形就使用此方法多次重画。

posted @ 2008-03-06 17:51 zencorn 阅读(762) | 评论 (2)编辑

2008年3月5日 #

[读后感:一个成熟的软件企业有能力应当选取如下 的测试工艺流程来生产它的软件产品,就像拥有一套标准化的流水线来完成将产品最终定型的任务。而众多无力进行这种经营规模如何在进行“手工”产品加工的过程中严格保证质量呢,我想一个是一人兴邦的原则即有一位统领全局“一把手”来分析需要分析与现实实现的差距,而这样的人才一定要有远大的发展眼光才能足够重视软件品质并基于此开展开发与测试的质量保证。另一种可能性,就是国家的传统部门应当跟上时代潮流,能有相应的软件产品质量保证的质检部门应运而生来研究对这类常常难以定位的产品来进行类似传统商品的质检,而不是被动的依赖几家国有型的生产厂家每年投入大量的政府采购了。并有益于新的竞争机制下有更多的公司成立起来,保证市场的健康发展!]

微软的软件测试方法

作者:Jeff W
       
       国内近年来关于软件测试的问题和讨论越来越活跃。但从总体上说交流软件测试技术的多,而探讨软件测试方法的少。这里的“技术”指的是具体的战术问题,比如说如何使用某种工具来解决某一特定测试问题,或者某一类型软件有哪些测试手段等等。而这里的“方法”指的是宏观的战略问题,或者叫方法论,这包括从软件测试的概念或理念,到企业软件质量控制体系;从软件测试的过程,到测试团队的设置及其职责的界定等等。作为测试人员,热衷于“技术”讨论和交流是一件可喜可贺的事。从中可以感觉到软件测试在中国迅速发展的开端和潜力。但是作为企业的管理决策者,是否也应该以同样的热情来思考“方法”问题呢?特别是当一个软件企业的软件测试从无到有,或者当企业已有一定的软件测试的投入,但发现其实效并不显著,甚至由于测试的引入而带来了新的管理上的混乱。这个时候方法论的思考,更有利于发现问题的根源。即便是一个基层的测试人员,当积累了一定的技术经验后,也应该不时从日常的具体工作中走出来,在一个较高层次上进行回顾总结和借鉴,并试着提出一些优化和改进的措施,这无论对专业上还是对事业上的成长都是非常有意义的。微软在软件测试方面有很多值得一提的经验,在此我想以我个人的体会和思考,同大家一同进行一些探讨。这里有一点须要特别说明,尽管微软的方法已被微软的实践多次证明是成功的,非常有效的,但这并不意味着这些方法在中国的软件企业中有广泛的可行性。一种方法是否可行还受到很多其他因素的影响,比如企业类型(微软是生产平台软件和通用软件产品的企业),企业管理体制,企业文化等等。所以我的目的只是给大家一些思路和借鉴。两类经典的软件测试方法 在具体介绍微软的软件测试方法之前,我想首先从概念,或理念的层面上来理解究竟甚么是软件测试,目的是从中导出微软测试方法的理论根源。传统上认为软件测试的方法从总体上分为两类。第一类测试方法是试图验证软件是“工作的”,所谓“工作的”就是指软件的功能是按照预先的设计执行的;而第二类测试方法则是设法证明软件是“不工作的”。提出第一类方法的代表人物是软件测试领域的先驱Dr. Bill Hetzel(代表论著《The Complete Guide to Software Testing》),他曾于1972年6月在美国的北卡罗来纳大学组织了历史上第一次正式的关于软件测试的论坛。他首先在1973年给软件测试一个这样的定义:“就是建立一种信心,认为程序能够按预期的设想运行。Establish confidence that a program does what it is supposed to do. ”后来在1983年他又将定义修订为:“评价一个程序和系统的特性或能力,并确定它是否达到预期的结果。软件测试就是以此为目的的任何行为。 Any activities aimed at evaluating an attribute or capability of a program or system. ”在他的定义中的“设想”和“预期的结果”其实就是我们现在所说的用户需求或功能设计。他还把软件的质量定义为“符合要求”。第一类测试可以简单抽象地描述为这样的过程:在设计规定的环境下运行软件的功能,将其结果与用户需求或设计结果相比较,如果相符则测试通过,如果不相符则视为Bug。这一过程的终极目标是将软件的所有功能在所有设计规定的环境全部运行,并通过。在软件行业中一般把第一类方法奉为主流和行业标准。1990年的IEEE/ANSI标准将软件测试进行了这样的定义:“就是在既定的状况条件下,运行一个系统或组件,观察记录结果,并对其某些方面进行评价的过程。The process of operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component (IEEE/ANSI, 1990 [Std 610.12-1990]”这里所谓“既定的状况”也可理解为需求或设计。尽管如此,这一方法还是受到很多业界权威的质疑和挑战。代表人物是Glenford J. Myers(代表论著《The Art of Software Testing》)。他认为测试不应该着眼于验证软件是工作的,相反应该首先认定软件是有错误的,然后去发现尽可能多的错误。他还从人的心理学的角度论证,将 “验证软件是工作的”作为测试的目的,非常不利于测试人员发现软件的错误。于是他于1979年提出了他对软件测试的定义:“就是以发现错误为目的而运行程序的过程。The process of executing a program or system with the intent of finding errors.” 这就是软件测试的第二类方法,简单地说就是验证软件是“不工作的”,或者说是有错误的。他甚至极端地认为,一个成功的测试必须是发现Bug的测试,不然就没有价值。这就如同一个病人(假定此人确有病),到医院做一项医疗检查,结果各项指标都正常,那说明该项医疗检查对于诊断该病人的病情是没有价值的,是失败的。我并不完全同意这一看法。第二类软件测试方法在业界也很流行,受到很多学术界专家的支持。大家熟悉的Ron Patton在《软件测试》( 中文版由机械工业出版社出版,具说此书是目前国内测试新手入门的经典教材)一书的第10页,有一个明确而简洁的定义:“软件测试员的目标是找到软件缺陷,尽可能早一些,并确保其得以修复。”有些软件企业以Bug数量来作为考核测试人员业绩的一项指标,其实就是接受了这样的方法。 两类方法的优劣对比 虽然软件测试总的目的是为了软件产品的质量,但很明显这两类测试方法在具体目标、或指导思想上截然相反。由此也决定了它们在思路、过程和测重点上有很大的差别,并各有利弊的。第一类测试方法以需求和设计为本,因此有利于界定测试工作的范畴,更便于部署测试的侧重点,加强针对性。这一点对于大型软件的测试,尤其是在有限的时间和人力资源情况下显得格外重要。而第二类测试方法与需求和设计没有必然的关联,如果计划管理不当,测试活动很容易丢失重点,走入歧途。第一类测试方法可以与软件的架构和软件开发的计划相配合,使软件测试活动逐层次的展开,从而使软件的功能和质量有计划地逐步完善和提高(关于测试的层次问题,我会在今后的讨论中专门介绍)。第二类测试方法不具备这种过程的渐进性。第一类测试方法的缺点是缺乏灵活性,不利于测试人员主观能动性的发挥,正像Myers先生所说,不容易找到软件的错误(Bug)。而这方面正是第二类测试方法的长处。微软的策略 正是因为认识到两类测试方法各有利弊,微软在软件测试活动中将两类方法结合起来,以第一类测试方法为基础和主要线索,阶段性地运用第二类测试方法。 微软的第一类测试微软的第一类测试总体上说分为三个步骤进行:审核需求和设计—〉设计测试—〉实施运行测试。前文已述,第一类测试是以需求和设计为本来验证软件的正确性。大家很自然的想到,需求和设计本身也有正确性的问题。依据不正确的需求和设计不可能开发出正确的软件产品,测试也将是徒劳的。因此验证需求和设计是微软进行第一类测试的第一步。有必要指出的是,这里所说的需求和设计具体说来它一般包括:(1)由项目经理根据用户要求(信息来源于市场部门,用户支持部门等等)而编写的需求文本(Requirement Specification);(2)由项目经理根据需求文本而编写的功能设计文本(Functional Design Specification);(3)由开发人员根据功能文本而编写的实施设计文本(Implementation Design Specification)。微软的测试人员要参与所有这些文本的审核。作为测试人员,审核重点是检查文本对用户需求定义的完整性、严密性和功能设计的可测性。同时这种审核对于测试人员也是一种热身活动,使他们尽早地进入技术和业务状态。第二步,测试人员要根据已审核通过的需求和设计编制测试计划,设计测试用例。在前面提到的三种文本中,功能设计文本是主要依据。原因很简单,这类测试关心的是软件是否能正确地实现功能,而不是这些功能如何被具体实施的。从这里大家可以看出这是典型的“黑盒测试”。确实微软的测试主要是从用户角度进行的黑盒测试。这一步的完成就意味着“测试计划”和“测试用例设计”两个文本的完成。“测试计划” 文本主要阐述测试的范畴、领域、方法、工具、资源和计划时间表等等。“测试用例设计”文本要列出测试用例、每个用例的设置、执行步骤和预期结果。测试的这两个文本也要被项目经理和开发人员审核。这样经过各种相互的审核,大家对项目形成了基本的共识。第三步的实施运行测试是整个开发过程中最长最复杂的一个阶段。从总体上说就是将上一步设计的测试用例按计划付诸实施的过程。这包括编写自动化测试程序、反复运行自动化测试程序,也包括阶段性执行手动测试用例。这一阶段的测试必须在周密的计划下进行,在前面我已提到,这正是第一类测试的特点和长处。这种计划性首先体现在开发和测试的相互协调配合,根据产品的架构和功能模块的依赖关系,按照项目的总体计划共同推进。从测试的过程来看,总是先运行或执行简单用例,然后再复杂用例;先验证单一的基本功能,再综合的端到端的功能;先发现解决表面的,影响面大的Bug,再深层的,不容易重现的Bug。因此随着项目开发和测试的进程,产品的功能不断完善,质量不断提高。这里有一点要特别指出,有很多测试用例是要反复运行的,特别是基本的自动化测试每一天,每一个Build上都要运行。尽管这些测试大多数情况下都是通过的,很少再发现新的Bug,但其价值是显而易见的,就是为了防止质量回归。可见Myers的理论在这里是不适用的。这一阶段测试人员还有一项繁琐但却很重要的工作,就是对已有的测试用例的维护。比如通常以下两种情况下要新增一些测试用例,一是对于当初测试设计不周全的领域,二是对于外部的Bug(比如从Beta客户报告来的),没有被现有测试用例所覆盖。当产品的功能设计出现更改时(在微软这是常事),所涉及的测试用例当然也要相应地修改。微软的第二类测试 微软的第二类测试是阶段性的,常常根据需要而带有随机性和突击性。对于这类测试,在微软有一个专门的名称:“Bug Bash(Bug大扫除)”。 Bug Bash通常发生在项目开发各阶段(微软叫里程碑)的末期,比如Beta版发布前,划出一个专门的时间段(通常1-3天),在这期间所有参与项目的人员,集中全部精力,运用各方面的知识,尽全部智慧来搜寻项目的Bug。这是一个非常有意思的活动,但要组织好这样的活动并非易事。一般有以下要点:(1)尽管这是一个测试活动,但参与者并不仅限于测试人员。项目经理,开发人员甚至于高层管理人员都应参加,如同全民动员。目的是要集思广益;(2)要鼓励各部门,领域交叉搜索,因为新的思路和视角通常有助于发现更多的Bug;(3)为调动积极性,增强趣味性,可以适当引入竞争机制,比如当活动结束时,评出发现Bug最多,发现最严重Bug的个人,给以物质和精神奖励。(4)可以分专题展开,比如安全性、用户界面可用性、国际化和本地化等等。微软的第二类测试除了Bug Bash外,经常还有一些专业性的测试,最典型的是针对安全性攻击测试。一般会邀请公司内部,或业界的专家来搜寻产品的安全漏洞。以上我从传统软件测试概念的角度,介绍了微软的策略和两类传统测试方法的具体做法,及其侧重点。这其实仅仅是一个基础,一个很原始的基础。软件测试在微软软件产品开发中的作用、地位远不是这些原始的方法所能达到的,也不是传统软件测试概念所涵盖的。微软在软件测试方面有很多特有的做法,和概念上的突破,比如“软件测试的信息服务功能”、“以用户为中心的宏观质量体系”、“分级测试”、“项目的质量管理系统”、“Bug三方会审”、“测试自动化”和“软件测试的软硬件—部门、团队、人和基础设施”等等。这些我会在以后的讨论中分专题进行介绍。

测试何时结束? 在按计划结束的那一天结束!我这个答案你听了一定不满意。但这个答案告诉你微软所依据的最基本的原则,这就是计划。在我前面介绍微软的第一类测试时我提到“测试计划”,这个“测试计划”实际上就是要回答测试的投入问题,包括人力资源、时限和过程。确定测试计划有这么几个依据:1)产品的功能。功能的量和复杂性直接影响测试的工作量;2)质量标准,有公司的标准、行业的标准、市场反馈的标准和客户要求的标准等;3)以往的经验,有以往的产品的经验,也有个人的经验。这一“测试计划”还要被项目的各方(开发,项目管理)审核通过,从而在整个产品部门形成一种共识,这种共识最终被纳入项目总体计划的一部分。对于第二类测试,它也是总项目总体计划的一部分,而且量也是可知的。一般地说在每个里程碑都会有几个分专题的“Bug Bash”,每次历时1-3天。在微软的项目计划书中总有那么一天,叫做“测试完成日 Test Complete Day”。它标志着所有计划的测试活动已全部完成,所有被发现的Bug被全部解决,并被测试所验证(有一些会因为某些原因被研究决定推迟解决)。 对于以上的分析你也许仍然不满意:难道微软的计划总能按期完成吗?当然不是,逾期的情况时常会有。几乎可以肯定,项目的实际执行与预先的计划一定会有或多或少的差距。微软会在项目过程中采取一些方法来感知这种差距,比如bitter提到的代码“覆盖率”分析和bug数量的变化趋势分析等。目的是为了尽早地发现差距,重新评估和修订计划。这样计划可以变化,但测试总是在计划结束的那一天结束。

对于TL_geong提到的随机测试造成收敛的缺陷趋势出现严重的发散现象,在微软也有。通常Bug Bash会产生超乎寻常数量的Bug。一般我们认为,产生Bug的量越大越好。因为,如果产生Bug的数量少,你很难判断是因为产品的质量确实很高,还是Bug Bash做得不彻底。而且事实往往是后者。 那么对Bug Bash所产生的大量Bug该怎么办?在微软,我们有“Bug Triage (测试,开发和项目管理,三方会审)”的制度。对于每个Bug,经过会审后不外乎有以下三中归宿(总体上来说): (1)被确认为“缺陷性”Bug,这样的Bug必须交开发人员解决,然后由原发现人验证。 (2)被调整为非“缺陷性”Bug,不用开发人员作任何更改,但必须将问题纳入产品用户文档,明确向用户解释,并告诉用户如何避免和应对。比如这里举一个假想的例子:产品的某个功能在系统内存严重不足的情况下,会暂时停止工作,并生成很多不易被用户理解的警告信息。这显然是个Bug(按微软的标准),正确的应该是,首先软件不应该完全停止工作,其次不应该多次警告,第三,警告信息应简明易懂,并给用户以措施和建议。但是考虑到,一方面这种情况在用户实际使用产品时发生的机率很低,而另一方面,从开发角度,解决这个问题有很大的技术难度,影响面也太大。这种情况下会把这个Bug改为“文本性”Bug,也就是要求文本遍写人员将这一情况作一技术性解释,并建议用户不要将此产品同其他消耗大量内存的软件同时使用。这类的Bug在Bug Bash中很常见,因为大家在这种测试活动中思维方式比较超常。(3)被完全否定,立刻关闭,不再纠缠。这类的情况在Bug Bash中也很常见。因为参与Bug Bash人并不都很了解产品功能的准确用法,误报是难免的。尽管对这类问题没有直接的后续措施,但这些信息仍然是有一定价值的,因为将来用户中的新手很可能会犯同样的毛病,而产品支持部门如果预先有这样的经验,就能及时准确地提供帮助。所以这些信息要保存在Bug的管理库中,以备将来产品支持部门查询。 经过这样的会审,筛选,如果(1)(2)类Bug,特别是(1)类Bug仍然很多,那测试部门很可能需要重新论证原先的测试计划和测试用例设计,看是否需要增加测试用例。必要时还要尽早提出更改项目总体计划和发布日期。大量Bug的出现也许不是件愉快的事,但和把这些Bug留给用户相比,代价要小得太多了。总之对于产品的Bug,要相对待身体的疾病一样,切末讳疾忌医。

微软的软件测试方法(二) 我在前一篇“微软的软件测试方法”中介绍了微软的两类基本测试方法,其基本思想大家应该是比较熟悉的,因为它们还只是传统的软件测试方法的综合。所以单从形式上,它并没有体现出对传统框架的突破。但是从另一个层面来考察微软软件测试时,你会对一些基本的事实感到惊讶。比如,“微软的测试人员和开发人员数量大致相等或略多”,“微软的产品成本中测试大约占40%以上”等等。人们会有疑问,仅仅是作为功能验证和搜寻Bug的测试能消耗这么大量的资源吗?有必要付出如此大的代价吗?应该有理由相信,微软作为一个软件企业,其每一份投入都是有意义的,因此也可断定微软在软件测试方面的努力一定超出传统测试方法的范畴。历史回顾 为了更好的理解微软件测试在方法和理念上的突破,我想首先回顾一下软件开发和软件测试的发展历史,并从中揭示其必然性。Edward Kit 在他的畅销书“Software Testing In The Real World : Improving The Process(1995, ISBN: 0201877562)”中将整个软件开发历史分为三个阶段: 第一个阶段是60年代及其以前,那时软件规模都很小、复杂程度低,软件开发的过程随意。开发人员的Debug过程被认为是唯一的测试活动。其实这并不是现代意义上的软件测试,当然一阶段也还没有专门测试人员的出现。 第二个阶段是70年代,这个阶段开发的软件仍然不复杂,但人们已开始思考开发流程问题,并提出“软件工程Software Engineering”的概念。但是这一阶段人们对软件测试的理解仅限于基本的功能验证和Bug搜寻,而且测试活动仅出现在整个软件开发流程的后期,虽然测试由专门的测试人员来承担,但测试人员都是行业和软件专业的入门新手。第三个阶段是80年代及其以后,软件和IT行业进入了大发展。软件趋向大型化。与之相应,人们为软件开发设计了各种复杂而精密的流程和管理方法(比如CMM和MSF),并将“质量”的概念融入其中。软件测试已有了行业标准(IEEE/ANSI ),它再也不是一个一次性的,而且只是开发后期的活动,而是与整个开发流程融合成一体。软件测试已成为一个专业,需要运用专门的方法和手段,需要专门人才和专家来承担。测试与开发的融合 在这一历史发展过程中,最值得注意的是测试与开发流程融合的趋势。人们对这种融合也许并不陌生。比如测试活动的早期展开,让测试人员参与用户需求的验证,参加功能设计和实施设计的审核。再比如测试人员与开发人员的密切合作,随着开发进展而逐步实施单元测试、模块功能测试和系统整合测试。的确这些都是测试与开发融合的表现形式,而且初期的融合也只反映在这个层次上。90年代以后,软件的规模和复杂程度迅速提高,这种形式上的融合也迅速走向更深层次,更具实际意义。具体地说这种融合就是整个软件开发活动对测试的依赖性。传统上认为,只有软件的质量控制依赖于测试,但是现代软件开发的实践证明,不仅软件的质量控制依赖于测试,开发本身离开测试也将无法推进,项目管理离开了测试也从根本上失去了依据。在微软,测试的确有这样的地位和作用。这就是为什么微软在软件测试上有如此大的投入。开发对测试的依赖 现代软件开发,特别是大型软件开发通常会遇到以下两个问题: (1) 在开发初期,如何能够展开大规模团队,群体齐头并进,而同时保持开发的有序性。从而有效利用资源,缩短开发周期。(2) 在开发后期,如何解决深层次的Bug,如何面对设计更改,而能够保证产品的质量不出现或少出现回落。对于小型简单的软件,这两个问题也存在,但不突出,而且容易解决。但对于复杂的大型软件的开发,这两个问题常常会成为难以逾越的障碍。 通常大型项目的功能丰富,但架构、层次也会相当复杂。稳妥的开发方式是,一次投入少量的人员,逐层开发,逐层稳定。但这种方式显然资源利用率低,开发周期长,不能满足现代软件和IT行业高速发展、瞬息万变的需要。因此大型项目需要大型团队。在微软,产品开发团队(主要包括开发、测试和项目管理)一般都有百人以上规模,有些产品甚至上几千人(Windows2000的开发部门曾有3000多人)。这样大规模的人力资源作用在一个动态的,内部相互联系的系统中,若没有有效的协同,其混乱是不可避免的。试想,有两个开发人员,分别在开发两个不同的功能模块,其相互有依赖关系。为了相互协调,他们可以随时进行当面讨论。如果这种关系发生在五个开发人员和五个功能模块之间,这种协调就只能通过定期的会议来进行。而一个大型项目,会有许许多多这样的关系,而且很多时候这种关系有着不确定性和不可预见性。当一个开发人员编写一段新的代码或对已有代码进行改动和调整时,他(或她)常常无法确定,或无法完全确定究竟有哪些相关的模块会受到影响,以及在什么情况下这种影响会带来什么结果。因为系统的复杂性已远远超出了人的逻辑思维、技能和经验所能力及的范畴。因此这种传统的协调手段是远不能满足需要的。在微软,这种协调是通过测试来实现的。具体来说就是:每日建造+自动化测试。关于每日编译和自动化测试,我将来会作专门介绍,这里简单的说就是每天都建造一个新版本,每个版本都要运行通过一定量的自动测试用例,以检验当天工作的质量。这里所说的质量当然有一般意义上质量的概念,但同时它也反映项目在开发过程中的整体协调性。自动测试的最大优点在于它的高度可重复性。一个理想的自动测试系统能够让人随时、方便和迅速的运行大量的测试用例。因此一个开发人员可以通过检查当天的自动测试结果来分析前一天代码的质量(事后检查),也可以在当天存入代码前,先运行自动测试以进一步确保存入代码的质量(事前检查)。在微软,每日建造都是在午夜开始,完成后紧接着就是全面的自动测试,到早晨上班时间之前就会把结果自动通过e-mail等方式发送出来。开发人员上班后的第一件事往往就是检查测试结果。如果没有问题就会开始新的工作。如果有测试有用例没有通过,开发人员则必须协同测试人员一起立刻找出原因,解决后才能开始新的代码。有时一个小的失误会引起大面积的测试用例失败,很大一部分开发团队会受到影响。为尽量避免这种情况,要求开发人员在存入代码之前先在自己的个人建造版本上运行一定量的自动测试,全部通过后在存入。如开发人员没有按照这样的要求,而擅自存入质量不高的代码而造成大量测试失败,这种不负责任的行为是要受到严厉批评的。从这一过程可以看出,开发人员依赖测试来保证开发工作的质量,使开发整体地协调地向前推进。当开发进入后期阶段,尽管项目已总体成型,开发人员也会不时遇到一些技术上的挑战。比如一些Bug的解决涉及对项目深层次结构的调整;再比如由于客户反馈的意见造成设计的修改。每一次这样的修改和调整事实上都是对一个稳定系统的破坏,如果处理不当往往一个Bug的修改会生成很多新的Bug,就像一系列连锁的恶性循环。很多项目工期的延误都是这样造成的。要避免或至少将这种破坏减少到最低限度,开发人员首先需要知道这种破坏的影响面。在这里单靠开发人员自身的逻辑思维、技能和经验是远远不够的,自动测试再一次成为一种有效的工具。往往开发人员会制定不止一个方案,对每个方案上都运行一遍同样一套自动测试用例,然后比较结果,选出最佳方案。自动测试在这方面所起的作用不仅在产品的开发过程中,它还延续到产品发布后。产品支持部门在为客户提供应急解决方案时也要依赖自动测试。管理对测试的依赖 在微软,软件项目管理的主要线索就是Bug的管理,其中最直接具体的管理活动就是“Bug三方讨论会(Bug Triage)”。会议一般由项目管理Program Manager(简称PM)来主持,有开发人员和测试人员参加(所以叫三方会议)。会上对每个新生成的Bug进行讨论,并决定(1)是否接受这个Bug;(2)Bug的严重级别和优先级别;(3)Bug由谁来负责,是由测试提供进一步详细信息,还是交由开发人员解决,以及大致的解决方案等等。会议还要对老的Bug检查解决进度。这种讨论会常常会发生争论,要求测试人员具有足够的技术基础和用户经验,来捍卫产品的质量。可以说项目开发到了某一阶段后就是由这种Bug的管理所驱动的。这其中的原动力来自测试。 项目管理中一项非常重要但也十分困难的工作是衡量项目的进度,包括判断项目的状态,确定项目是否能预期完成。这方面,测试提供了两个非常重要的参数,一个是Bug数量的趋势,另一个是测试结果的趋势。 Bug趋势就是将每天新生成的Bug数和每天被解决的Bug数标成一个趋势图表。一般在项目的开始阶段新生Bug数曲线会呈上升趋势,到项目中后期被解决Bug数曲线会趋于上升,而新生Bug数曲线应下降,到项目最后,两条曲线都趋向于零。PM会持续观察这张图表,确保项目健康发展,同时通过分析预测项目Bug趋于零的时间。在一定的历史经验的基础上分析使用这一图表会得到很多有价值的信息,比如说,可分析开发和测试在人力资源的配比上是否恰当,可以分析出某个严重的Bug所造成的项目质量的波动。 每天的自动测试结果同样可以形成类似的图表。它同样非常有助于了解当前项目的质量状况,开发测试进度。由测试产生的这些数据不仅在项目开发过程中为项目管理提供有效的依据,而且也是产品通过发布的必要条件。在微软,每个产品都要经过评审才能通过发布。前面介绍的几个图表是发布评审的重要内容,如果从图表中发现临评审前还出现过较大的质量波动,评审人员一定会对此提出质疑。因此软件项目管理依赖软件测试提供其基本的管理素材。 可以说,现代大型软件开发过程中开发和管理对测试的依赖性是测试与开发流程融合的一个根本因素。从另一个角度看,测试与开发流程融合决不仅仅是简单的时间上的同步,更不是双方空间上的接近,而是这种内在的依存关系的外在表现。开发对测试的这种依赖性对测试和测是人员提出了更高的要求。在理念上,软件测试已远不仅仅只是软件功能的验证和Bug的搜寻;在具体方法上,自动测试和测试工具的使用已成为基本的要求。在微软,测试不仅使用一些通用的工具,每一个产品还有专门开发的专用工具库,测试的代码量常常超过项目本身的代码量。一个软件企业要提高其软件开发的能力,特别是针对大型软件的大规模的快速开发能力,在测试方面对传统理念和方法进行突破是必要的。微软的实践就是一个很好的印证。

posted @ 2008-03-05 10:51 zencorn 阅读(238) | 评论 (1)编辑

2008年3月3日 #

LOGIGEAR SECURITY POLICIES

At LogiGear® we are committed to the security of our clients' IP, equipment and livelihoods. Therefore we have instituted comprehensive security policies in our testing labs, including the following essential procedures:

Data access security
Network security
Physical security
Non-disclosure agreements
Staff allocation, training and culture
Confidential document control

Data access security

  • Data security firewalls are installed to prevent unauthorized access to the network
  • Password policy in place for accessing PCs and workstations for authorized access
  • Access to important files and directories is given only to specific personnel 
  • All mail and web servers are located at an independent internet data center
  • Backup policy in place. Monthly backups are stored at an off-site location and removable backups are kept safe with logs duly maintained
  • Frequent & surprise security audits are in force to assess any breach with multi level security management in control
  • Email encryption for important emails
  • Password protection for important documents

Network security

  • Each client's process is run on a separate VLAN / VPN when run off-shore/off-site
  • Software defined secure tunnels through the internet
  • Only client authorized personnel is allowed to access the VLAN / VPN. This setup prevents others from accessing the project information
  • Anti-virus protection for desktops & servers
  • Spam and Attachment filter
  • Live monitor of network activity WAN and LAN

Physical security

  • Photo ID cards and access cards with easy-to-identify bands are issued to all employees of our offshore labs
  • Visitors are provided with separate cards and are not allowed beyond specific access points within our offshore labs
  • Restricted access for each employee in all locations
  • Security guards on duty 24/7.

Non-Disclosure Agreements (NDA)

  • All employees sign individual NDAs, in addition to proprietary information and inventions agreements.
  • Employees may not disclose any proprietary information directly or indirectly to anyone outside the company, or use, copy, publish, summarize or remove such information from company premises.
  • Employees may not use any unfair competitive practices upon termination of employment or engage in any outside business during employment.
  • Any confidential information received from third parties and clients are held in the strictest confidence, and used only as necessary to meet our obligations to the providing party contracting our services.
  • Any inventions and relevant records relating to or derived from work for the company, its vendors or clients must be disclosed to the company, and all information and records pertaining to any ideas, processes, trademarks, service marks, inventions, technology, computer programs, original works of authorship, designs, formulas, discoveries, patents, or copyrights so conceived or developed must be promptly disclosed to the company.

Staff Allocation, Training and Culture

  • Dedicated resources are made available for all projects. This prevents unauthorized usage of client resources and protects all client proprietary information.
  • We instill in all employees, as part of our comprehensive training programs and our company culture, a strong ethical framework that forbids exchange of IP between projects.

Confidential Document Control

  • Access to public mail systems is not allowed, and access to removable media is restricted and controlled by the project manager responsible for client projects.
  • IT controls include monitoring of email messages that exceed a certain size, with or without attachments.
posted @ 2008-03-03 18:07 zencorn 阅读(7) | 评论 (0)编辑

2008年2月29日 #

全面了解Windows任务管理器

Windows的任务管理器提供了有关计算机性能的信息,并显示了计算机上所运行的程序和进程的详细信息,可以显示最常用的度量进程性能的单位;如果连接到网络,那么还可以查看网络状态并迅速了解网络是如何工作的,今天,我们就来全面了解任务管理器的方方面面。

一、如何启动任务管理器

最常见的方法是同时按下“Ctrl+Alt+Del”组合键(“shift+ctrl+ESC”也是可以的),不过如果在windows95/98下不小心接连按了两次键,可能会导致Windows系统重新启动,假如此时还未保存数据的话,恐怕就欲哭无泪了。 XP修改了这个BUG。但是在任务管理器上添加了关机和重新启动的选项。

其实,我们可以选择一种更简单的方法,就是右键单击任务栏的空白处,然后单击选择“任务管理器”命令。或者,按下“Ctrl+Shift+Esc”组合键也可以打开任务管理器,赶快试试吧。当然,你也可以为\Windows\System32\taskmgr.exe文件在桌面上建立一个快捷方式,然后为此快捷方式设置一个热键,以后就可以一键打开任务管理器了。

小提示:需要说明的是,在Windows XP中,如果未使用欢迎屏幕方式登录系统,那么按下“Ctrl+Alt+Del”组合键,弹出的只是“Windows安全”窗口,必须选择“任务管理器”才能够打开。

二、认识任务管理器

任务管理器的用户界面提供了文件、选项、查看、窗口、关机、帮助等六大菜单项,例如“关机”菜单下可以完成待机、休眠、关闭、重新启动、注销、切换等操作,其下还有应用程序、进程、性能、联网、用户等五个标签页,窗口底部则是状态栏,从这里可以查看到当前系统的进程数、CPU使用比率、更改的内存<容量等数据,默认设置下系统每隔两秒钟对数据进行1次自动更新,当然你也可以点击“查看→更新速度”菜单重新设置。

1. 应用程序

这里显示了所有当前正在运行的应用程序,不过它只会显示当前已打开窗口的应用程序,而QQ、MSN Messenger等最小化至系统托盘区的应用程序则并不会显示出来。

你可以在这里点击“结束任务”按钮直接关闭某个应用程序,如果需要同时结束多个任务,可以按住Ctrl键复选;点击“新任务”按钮,可以直接打开相应的程序、文件夹、文档或Internet资源,如果不知道程序的名称,可以点击“浏览”按钮进行搜索,其实这个“新任务”的功能看起来有些类似于开始菜单中的运行命令。

2. 进程

这里显示了所有当前正在运行的进程,包括应用程序、后台服务等,那些隐藏在系统底层深处运行的病毒程序或木马程序都可以在这里找到,当然前提是你要知道它的名称。找到需要结束的进程名,然后执行右键菜单中的“结束进程”命令,就可以强行终止,不过这种方式将丢失未保存的数据,而且如果结束的是系统服务,则系统的某些功能可能无法正常使用。

Windows的任务管理器只能显示系统中当前进行的进程,而Process Explorer可以树状方式显示出各个进程之间的关系,即某一进程启动了哪些其他的进程,还可以显示某个进程所调用的文件或文件夹,如果某个进程是Windows服务,则可以查看该进程所注册的所有服务,需要的朋友可以从 http://www.skycn.com/soft/17580.html 下载。

3. 性能

从任务管理器中我们可以看到计算机性能的动态概念,例如CPU和各种内存的使用情况。

CPU使用情况:表明处理器工作时间百分比的图表,该计数器是处理器活动的主要指示器,查看该图表可以知道当前使用的处理时间是多少。

CPU使用记录:显示处理器的使用程序随时间的变化情况的图表,图表中显示的采样情况取决于“查看”菜单中所选择的“更新速度”设置值,“高”表示每秒2次,“正常”表示每两秒1次,“低”表示每四秒1次,“暂停”表示不自动更新。

PF使用情况:正被系统使用的页面文件的量。

页面文件使用记录:显示页面文件的量随时间的变化情况的图表,图表中显示的采样情况取决于“查看”菜单中所选择的“更新速度”设置值。

总数:显示计算机上正在运行的句柄、线程、进程的总数。

执行内存:分配给程序和操作系统的内存,由于虚拟内存的存在,“峰值”可以超过最大物理内存,“总数”值则与“页面文件使用记录”图表中显示的值相同。

物理内存:计算机上安装的总物理内存,也称RAM,“可用”表示可供使用的内存容量,“系统缓存”显示当前用于映射打开文件的页面的物理内存。

内核内存:操作系统内核和设备驱动程序所使用的内存,“页面”是可以复制到页面文件中的内存,由此可以释放物理内存;“非分页”是保留在物理内存中的内存,不会被复制到页面文件中。

4. 联网

这里显示了本地计算机所连接的网络通信量的指示,使用多个网络连接时,我们可以在这里比较每个连接的通信量,当然只有安装网卡后才会显示该选项。

5. 用户

这里显示了当前已登录和连接到本机的用户数、标识(标识该计算机上的会话的数字ID)、活动状态(正在运行、已断开)、客户端名,可以点击“注销”按钮重新登录,或者通过“断开”按钮连接与本机的连接,如果是局域网用户,还可以向其他用户发送消息呢。

三、任务管理器之特别任务

其实,任务管理器除了终止任务、结束进程、查看性能外,它还可以完成很多更高级的特别任务呢。下面,我们通过几个实例来介绍任务管理器的扩展应用:

实例一:同时最小化多个窗口

切换到“应用程序”标签页,按住Ctrl键同时选择需要同时最小化的应用程序项目,然后点击这些项目中的任意一个,从右键菜单中选择“最小化”命令即可,这里同时还可以完成层叠、横向平铺、纵向平铺等操作。

实例二:降低BT软件的资源占用率

运行BT软件时,往往会占用大量的系统资源,你会看到硬盘灯不停闪烁并伴随着飞速转动的噪音,此时无论是浏览网页或是运行其他应用程序,肯定会有系统停滞的感觉。

打开“任务管理器→进程”窗口,选择BT软件的进程名,然后从右键菜单中选择“设置优先级”命令,这里可以选择实时、高、高于标准、标准、低于标准、低等不同级别,请根据实际情况进行设置,例如设置为“低于标准”可以降低进程的优先级别,从而让Windows为其他进程分配更多的资源。

实例三:打造增强版本的任务管理器

有热心网友从Longhorn中将任务管理器剥离出来并提供下载,我们可以借此来打造一个增强版本的任务管理器。解压缩下载文件,会得到Taskkill.exe、Tasklist.exe、Taskmgr.exe等3个文件,首先覆盖\Windows\System32\Dllcahe\下的同名文件,覆盖前请事先备份源文件,接下来继续覆盖\Windows\System32\下的同名文件,当弹出“Windows文件保护”对话框时,选择“取消”按钮。

更换后的任务管理器不仅程序图标发生了变化,右击进程,可以发现在右键菜单中增加了打开所在目录、创建转储文件两个命令,而“查看→选择列”中增加了命令行、映像路径两个项目,前者可以查看所显示的进程是否被伪装,后者则可以查看进程的文件路径。

实例四:打开处理器的超线程

P4处理器的超线程技术(Hyper-Threading Technology)其实是相当于将一颗处理器分为两个虚拟的处理器,简单地说,实现超线程需要处理器、主板、操作系统三方面的支持。如果你使用的是Windows XP/Server 2003,而且确定自己的主板和处理器支持超线程,那么可以切换到“性能”标签页,如果这里显示两个CPU使用记录图表的话,说明你的处理器确确实实已经打开超线程。

当然,我们也可以在开机信息中查看超线程支持情况,一般会显示CPU1、CPU2两个处理器名称,或者启动后进入“设备管理器”,这样同样会显示两个处理器的信息。

实例五:禁用任务管理器

任务管理器可以完成如此强大的任务,如果你使用的是公用计算机,而又不希望他人私自操作任务管理器,可以在“开始→运行”框中键入Gpedit.msc命令打开组策略窗口,找到“本地计算机策略→用户配置→管理模板→系统→Ctrl+Alt+Del选项”项,然后在右侧窗口中选择“删除任务管理器”项,将其设置为“已启用”,以后按下“Ctrl+Alt+Del”组合键时就无法操作任务管理器了。

当然,通过文中提到的其他两个方法还是可以正常操作任务管理器的,一劳永逸的解决办法是为Taskmgr.exe文件设置用户授权,当然必须使用NTFS文件系统才行,呵呵。

也可以修改注册表来禁用:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\system
新建Dword值:DisableTaskMgr=1(禁用)DisableTaskMgr=0(解禁)
小知识:

句柄:用来惟一标识资源(例如文件中注册表项)的值,以便程序可以访问它。

线程:在运行程序指令的进程的对象,线程允许在进程中进行并发操作,并使一个进程能够在不同处理器上同时运行其程序的不同部分。

进程:一个可执行程序(例如资源管理器)或者一种服务(例如MSTask)   
posted @ 2008-02-29 15:12 zencorn 阅读(72) | 评论 (0)编辑

2008年2月27日 #

作者:Grig Gheorghiu
作者联系方式:http://agiletesting.blogspot.com/

I recently got some comments/questions related to my previous blog entry on performance vs. load vs. stress testing. Many people are still confused as to exactly what the difference is between performance and load testing. I've been thinking more about it and I'd like to propose the following question as a litmus test[试金石] to distinguish between these two types of testing: are you actively profiling your application code and/or monitoring the server(s) running your application? If the answer is yes, then you're engaged in performance testing. If the answer is no, then what you're doing is load testing.

[译:我上一篇发表在自己博客上的文章关于性能、负载、压力的测试文章收到了一些问题和评论,很多人对如何正确的区分性能测试与负载测试仍然