qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

CentOS下无法正常获取MySQL数据库表数据的问题

 之前,由于客户要求在centOS下安装系统应用,因此有机会接触了一下CentOS,顺便也了解了下CentOS的常规操作,还有在CentOS下的MySQL相关操作。

  目前技术框架使用JSF(richfaces、facelets)+Spring+JPA(OpenJPA),不使用数据库依赖的触发器或存储过程,所有业务逻辑在web服务器上执行,因此数据库基本不用考虑移植问题。但是本来在windows下运行正常的系统,在linux下却没法获取一些表的内容。由于数据库的初始化,最初只是体现在几个需要手工维护的表数据上,最终却发现原来是因为数据库表名大小写的问题!

  具体操作过程:

  1、在windows下,使用MySQL的客户端工具“Navicat”,将当前的数据库导出到test.sql文件中。说明:导出的.sql文件中,所有的表名都是小写。

  2、将导出的.sql文件拷贝至linux下,导入需要使用的数据库中

  3、启动web服务器,访问服务。问题出现:许多表无法访问。

   4、在mysql中使用“show tables;”命令,发现表名有重复,重复的表名区别在于大小写,大写的表名与对应的实体bean名相同。找到问题:表名大小写造成的数据无法访问。 (linux 下的 MySQL 安装完后,默认区分表名的大小写,不区分列名的大小写;Windows下默认不区分大小写 )

  上述问题有两种解决方案:

  ● 在JPA的实体bean的声明中,使用“Table”的“name”属性,指定表名,表名尽量全部使用小写,不同单词之间使用下划线连接

  例如:

@Table(name="sys_user")

  ● 使用Linux下MySQL的相关参数,使MySQL不区分大小写( lower_case_table_names=1 )

  上述两种方法,第一种是较为通用的解决方案,但是需要开发人员更改全部的实体bean,然后重新编译;第二种方案适合于系统已经进入生产环境的状况,并且对如何修改linux下的MySQL配置需要一定的专业知识及经验,对实施人员技术要求较高。

  关于如何修改CentOS下的MySQL不区分大小写的具体操作方法:

  用 root 帐号登录后,在 /etc/my.cnf 中的 [mysqld] 后添加添加 lower_case_table_names=1 ,重启Mysqld 服务。服务重新启动之后,已设置成功:不区分表名的大小写

  关于lower_case_table_names 参数详解: lower_case_table_names参数有两个值:[0、1 ]其中0 :区分大小写,1 :不区分大小写

  补充说明:

  关于持久层,使用Spring自动生成的DDL来创建对应的持久层数据库表及索引等数据,简化实施工作的复杂度

posted @ 2012-09-07 10:14 顺其自然EVO 阅读(922) | 评论 (1)编辑 收藏

如何系统性地保障软件的性能

一个正在持续增加新功能的软件,尤其是类似QQ这种做为一个超大规模客户端软件,又随时需要适应用户要求和发展的需求,需要不断的做快速的更新,开 发节奏非常快。而且因为我们的用户是海量用户,用户的软硬件环境非常复杂。性能作为软件的用户第一体验,如何去系统性地保障软件的性能,对于QQ来说就变 得非常重要。

  那么要让持续开发的软件的性能能够得到保障,应该做些什么呢?

  1、需求阶段开始考虑性能

   首先从需求提出阶段说起,需求提出阶段应该要开始考虑性能问题了,产品经理提出需求之前,必须要系统性地了解哪些因素会影响到软件的性能,这些因素包括 但不限于:需求的处理时机,需求的处理数量,需求的处理是否涉及大的IO,网络,以及CPU。尤其是在使用特性上要思考清楚,比如涉及到消息记录的需求, 可能要考虑到有的用户的消息记录很大,比如涉及好友列表的需求,可能要考虑到有的用户的好友列表很多等。

  使用时机的话,比如需求是在登录过程中那么可能要考虑该需求是否会影响到登录速度,如果是在登录后的话,是否会造成登录后卡。

   结合这些特征,对于一些从需求侧就可能有问题的需求,要么考虑直接不做这个需求,要么考虑针对不同的使用特征做不同的处理,比如考虑到消息记录可能有很 大的情况,那么涉及消息记录的需求尽量不要去读取整个消息记录。有的时候,也可以考虑切换需求处理的时机,比如在更新好友资料的需求,如果是做在登录过程 可能是会引起登录过程很慢,那么需求可以修改成登录过程先加载本地数据,登录后某个空闲时机再去做必要的更新。

  2、需求开发阶段如何考虑性能

   在一个需求开始开发之前,一个有经验的程序员应该是要先做设计,在架构设计的过程,我们应该要考虑性能,让架构能够支持足够的数据量,保持架构上能在各 种场景都不会出现性能问题。各种处理分别是在什么时机进行也是要在设计的时候就想好的,只有性能出众的架构才是很好的架构。

  在实际开发的过程,要充分考虑用户的使用场景和并发数量,比如开发一个火车票订票系统,如果不考虑春运的时候的特殊情况,那么最终只会在春运的时候系统直接瘫痪。

   可能这个时候有人会问,春运的时候就是有那么多用户在访问,系统就是支持不了那么应该怎么办呢?至少可以从两个方面去解决,一个方面可以考虑在访问量很 大的时候,只提供核心订票等业务的支持,而网页上的一些图片什么的完全可以不提供拉取。另一方方面,可以考虑提供给系统最大支持量的用户正常的服务,而可 以对一些超出负载的用户提出的服务短期内进行拒绝。设置可以提供一种排队进入的机制。

  3、测试阶段如何关注性能

  在测试阶段我们还需要做什么来保障性能呢?

  首先我想强调的是,测试是保证产品的性能最终是否达标的最后保障,所以这个环节一定要严格要求。

  从信念上来说,只要开发同学有对代码进行修改,那么都是要怀疑可能引入性能问题的,之前我们的一个打开好友聊天窗口的时候卡的一个性能问题,就是因为在桌面快捷图标的时候在打开聊天窗口的过程加了一行代码。

   测试方法上,要注意用接近现实的一些数据来进行测试,包括前面说到的消息记录的大小和好友列表的数目。另外要注意覆盖各种使用场景。最后还有一点尤其要 注意的是要注意用多种机器多种网络环境多种软件环境来测试,机器的话,主要包括性能好的机器和性能差的机器,机器的网络环境的话要考虑网络丢包比较大的一 些情况,还要集合局域网广域网以及中国的各大运营商之间的不同网络场景。软件环境的话,一方面包括不同的操作系统,一方面包括同时运行和安装的软件环境,比如杀毒软件,安全软件,或者是同时在运行一些大型游戏的情况。

  当然最好的情况是,建立一系列的自动化测试框架,把一些我们平常关注的重要数据,比如QQ的登录速度,登录后卡不卡,打开好友聊天窗口的速度等等通过自动化跑出来。通过定期进行自动化测试,同时把数据进行各个历史版本横向比较,最后可以做到快速监控,最快速度发现性能问题。

  4、反馈跟踪如何关注性能

  产品发布之后,依然还要继续关注它的性能。一方面由于我们的用户群体非常大,所以难免有些情况和使用场景没有考虑周全,所以最后运营阶段没有问题的版本才是合格的版本。

  我们一般通过定期关注微博,关注产品本身的反馈论坛,以及外面的一些相关论坛来收集信息。同时关注周边的朋友,以及同事的反馈也是一个很重要的方面。

   在用户反馈有问题的时候,应该要及时去处理,处理方法一方面要先了解用户的使用场景和使用情况,另一方面可以给用户一些工具,通过这些工具去记录当时的 CPU,内存,IO的使用情况,当时是否界面有无响应等信息。同时工具最好能够记录在有性能问题的时候软件正在忙什么,当时的堆栈以及系统调用函数是什 么,有了这些信息就可以快速的解决问题了。

  5、总结

  整体来看,贯穿整个软件开发的过程,从需求,到设计,到开发,到测试,最后到发布反馈,都得要持续关注软件的性能,这样才能得到一个系统性地保证。可见,性能优化是一个需要持续运营的过程……

posted @ 2012-09-07 10:03 顺其自然EVO 阅读(239) | 评论 (0)编辑 收藏

七问七答:构建虚拟测试与开发环境

  无论进行虚拟化与否,在投入生产运作之前,一定要使用虚拟测试环境对应用程序、 操作系统以及硬件进行测试。

  因为虚拟测试环境是和生产运作相分离的,而且经常采用免费、简单的虚拟化工具,为应用程序和其他服务提供了安全、高效和经济的测试方法。你可以测试服务器配置、存储资源分配等。

  如果你感到信心十足,你也可以像许多虚拟化爱好者一样,在家或者在办公室创建一个虚拟测试实验室。在实验室中进行实验,是一个提升自身技能、试用新工具的好方法。家庭式的虚拟测试环境还提供了一个安全的环境,从而可以进行除了生产运作方面以外的修补。

  通过这些关于虚拟化测试环境常见问题的解决方案,你将学习到如何构建一个虚拟测试实验室,虚拟测试是如何改善服务器的虚拟化部署,以及如何对VMware虚拟实验室进行深入研究。

  应该如何使用虚拟测试环境来进行软件测试

   测试软件可能是一项花费巨大、过程复杂的尝试,但是通过减少硬件,虚拟的测试环境将会使得整个过程变得更加简单、成本花费更少。你可以根据需要,设定你 想要的虚拟测试实验室大小。例如,在运行VMware工作站时,它甚至可以当作一个简易的笔记本来使用。如果要测试应用程序,你可以在单个物理服务器上, 模拟具有不同操作系统的计算机。你还可以在各种不同的平台上,对它们进行测试,并使用不同的配置。

  如果你众多的网络虚拟机(VM)聚集在一起,并且它们是和生产运作相分离的,你甚至可能不会需要用到防火墙或者防病毒软件,这也将可以减少虚拟测试的成本。

  我是否应该在一个虚拟的测试环境中使用集群?

  对于某些虚拟的测试环境来说,一点故障停机时间并没有什么大不了。但是,如果你测试的是重要的工作负 载,你可能会要求高可用性(HA)。你可以在你的虚拟化测试实验室创建一个虚拟服务器集群,以此来增强可用性。这样,你就可以在修复或者重新启动服务器 时,把虚拟机移动到其他主机。但是要记住,如果你需要更多的硬件、许可证或者共享存储,创建一个服务器集群可能会产生额外的费用。如果你可以接受你的虚拟 测试实验室出现一些停机时间的话,那么你可以简单地储存一些备用的相同硬件,以防主机出现问题。

  我可以在同一台主机上运行测试服务器和生产服务器吗?

   这个问题很棘手。一些专家说,你永远不应该让虚拟测试和生产服务器共存于同一部机器,因为这样会增加安全风险和资源共享问题。同一台主机上的虚拟机之间 存在着逻辑隔离,但是这可能不足以保护用于生产环境的虚拟机,从而确保其在测试虚拟机过程中不出现问题。除此之外,分离虚拟测试实验室,可以使管理测试虚 拟机和建立集群变得更加容易。

  另一方面,如果你对服务器托管进行正确的配置,这可能会是一个具有成本效益的,用以创建一个虚拟测试环境的方法。你还可以为单独生产和非生产性虚拟机的管理程序水平设置规则。

  我将面临哪些关于虚拟测试方面的挑战?

  虽然一个虚拟的测试环境可以带来很多优势,但是,如果你拥有很多虚拟机和通用的硬件,这些可能也很难管理。当你把测试环境进行虚拟化时,你需要确保你有一套可以整合现有基础构建的,虚拟测试管理工具。如果你需要把远程办公室和虚拟测试实验室连接起来,这将是另一项挑战。你可能还不得不升级硬件,以确保虚拟测试环境中的运作。幸运的是,还有很多种自动化和管理化工具,可以使这些过程变得更加容易和简单。

  哪些工具适用于虚拟测试环境?

  一些常见的虚拟化部署和管理工具,非常适合应用于例如虚拟测试实验室这样的非关键性的基础构建。举例来说,Oracle的 VirtualBox4,是一种宿主的,轻量级的管理程序,它支持多种操作系统,而且非常适用于虚拟测试环境,因为这款程序是免费的。 VMware vCloud Director慢慢地取代了VMware Lab Manager,它是另一种组织化和自动化虚拟测试工作负载的产品。 VMware Workstation是一种应用于虚拟化测试实验室的常用工具,因为其用户可以在他们的台式机上直接运行WindowsLinux的虚拟化系统。

  我应该如何创建一个用于虚拟测试的VMware实验室?

   创建一个应用VMware技术的虚拟测试实验室,可以帮助你提升自身的技能和测试应用技术。你可以通过使用像VMware Server或者VMware Workstation等宿主服务器,来创建一个VMware实验室,你也可以把ESX或者ESXi运行在一台家用电脑上,同时使用它来进行其他工作和任 务。创建一个虚拟测试实验室需要时间和金钱,但是,如果在VMware实验室和你的工作生产环境之间进行分段,那么你将会从中获的效率的平衡。

  什么是VMware实验室,以及它是如何促进虚拟测试的?

   VMware实验室是企业的在线测试和开发网站,是VMware的工程师发布名为“flings for users to check out” 的虚拟测试项目的地方。例如,Onyx软件,会监控你的vCenter活动,并且把你的选择转换成PowerCLI代码。 VCenter Mobile Access是一种虚拟应用,它可以为手机提供了一个类网页的接口。一个名为XVP Manager的试验产品,可以让vCenter对微软Hyper - V主机和虚拟机进行管理。VMware公司的某些新尝试,可能会变成真正的产品或者功能,所以这非常值得对这些虚拟测试实验室的产品进行修补完善。

posted @ 2012-09-07 09:57 顺其自然EVO 阅读(308) | 评论 (0)编辑 收藏

如何测试一个纸杯-----利用引导词整理测试思路

  测试专家:请测试一个纸杯?

  测试菜鸟:什么?

  测试专家:如果给你一个喝水的一次性一次纸杯,你将如何测试它?

  测试菜鸟:。。。我想想啊。。。

  几分钟后。。。。。。。

  测试菜鸟:倒满水看看漏不漏。。。。嗯。。。。

  测试专家:还有么?

  测试菜鸟:能不能倒出水来。。。会不会变形?。。。。。。一个纸杯怎么测啊?脑子全乱了?。哦,对了!

  你有需求么?

  测试专家:嗯,不错的问题,你见过纸杯的需求说明书么?

  测试菜鸟:没需求说明书我咋测?

  测试专家:好吧,假设我是你老板,是你客户,你也这么回答我?

  测试菜鸟:。。。我要积极。。。想办法,您能告诉我该怎么做么?

  测试专家:跟着我念: FDSFSCURA - CIDTESTD - SFDPOT - CRUSSPIC - STMPL

  测试菜鸟:神马?

  测试专家:再念几遍:FDSFSCURA - CIDTESTD - SFDPOT - CRUSSPIC - STMPL
            FDSFSCURA - CIDTESTD - SFDPOT - CRUSSPIC - STMPL
            FDSFSCURA - CIDTESTD - SFDPOT - CRUSSPIC - STMPL
            FDSFS。。。

  测试菜鸟:等等等等。。。。您在教我念咒么?这就行?您是邓布利多我可不是哈利波特。

  测试专家:不开玩笑,把这些字母记住并应用自如,你就能够非常好的做测试设计了。

  测试菜鸟:真的?那。。。FDSFSCURA。。。。。

  测试专家:你还真听话。不逗你了,先解释一下这些字母的含义吧。

  基于多年的测试经验,测试大牛James Bach总结出了一套测试设计的方法论,那就是启发式测试策略模型( Heuristic Test Strategy Model)。这套模型包含了一组精心挑选出来的测试设计策略。测试者只要把这些策略熟记在心,在测试设计时依次对照这些策略,测试思路就会源源不断的从你脑子里迸发出来了,还不跑偏。

  这套模型非常简单,只有4个域(见下图),每个域有那么几条测试策略,每个策略可以用1到2个单词描述,把这些单词的首字母串起来就是上面蓝色字体的字符串也就是我们所说的引导词。

  来解释一下启发式测试模型。我们在做测试设计时,首先想到的是要应用我们已有的测试技术(Test Techniques)并综合考虑项目环境(Project Environment)、产出物(Product element)、质量准则(quality Criteria)。这样我们就能够得到一个有基本保障的(看得到的)质量(Perceived Quality)

  回到刚才所说的“测试一个纸杯”,我们目前能拿到的只有手中的“一个纸杯”,对照一下刚才所说的图,其实最先想到的应该是产出物(Product element)。模型给出了产出物域需要思考的项:

  结构(Structure)- 所有组成产出物的东西。
            代码,界面,接口,硬件,非可执行文件,附属物件。

  功能(Functions)- 所有产品所实现的功能
            用户界面,系统接口,应用,计算,时间相关性功能,变化(如改变字体),
            开启/关闭,多媒体,错误处理,交互,可测性

  数据(Data) -所有产品处理的数据
         输入,输出,预设值,持久数据,序列,大小数量变化,噪声数据,生命周期等

  平台(Platform)-所有被测软件所依赖的外部事物
           外部硬件,外部软件,内部组建

  操作(Operation)-所有产品可执行的操作
           用户,环境,常见操作,非正常操作,极限操作

  时间(Time)-所有与产品相关的时间指标
         输入/输出,快/慢,并发,变化率

  注意到上述几项中英文被标蓝的首字母了么? SFDPOT 就是刚才测试专家念的引导词中的一组。我们再次回到“测试一个纸杯”,现在可以一项一项来了:

  结构:用料是否环保?是否能平稳放在桌面上?放了水是否能平稳放在说面上?杯口是否光滑?。。。。。

  功能:到进水是否不漏,是否不变形?拿起来是否能够不显著变形?水是不是能倒出来?。。。。。

  数据:放半杯水,放一整杯水,放冷水,放热水,放茶叶,放可乐。。。。。。。

  平台:能否放在桌子上不倒?手拿着是否不变形,不会感到不舒服?是否能放到杯架、套到别的杯子上?。。。

  操作:倒进水,喝水,再倒水,倒开水,捏变形,弹烟灰,丢弃。。。。

  时间:看喝水的时候水是不是很快的能流出来。。。

  这里边有重复项,这没关系,合并同类项就好了,我们不是要强制归类,而是要利用这些引导词帮你想到该测试的地方。

  剩下的就是把其他几个测试域中的关键字找到,根据这些关键字设计测试用例。限于篇幅,这里就不一一展开了,大家可以 参考启发式测试策略模型中给出的详细说明进行比照。如果把它们都用作测试这个纸杯,那么你至少有30种以上的手段来测试它(当然得根据实际需求做一定取 舍),谁说测试是没什么技术含量的工作?

posted @ 2012-09-07 09:56 顺其自然EVO 阅读(647) | 评论 (0)编辑 收藏

软件测试领域中的10个生存和发展技巧

  这些建议不仅使你幸存下来,而且也能推动你在软件测试职业生涯的发展。确保遵循这些建议:

  建议 1)书面沟通-在许多场合我反复说书面沟通,保持所有东西要进行书面沟通。请不要口头信息交流。这适用于你的上级给你的所有指令或任务。无论你的领导或经理多么友善,但请进行电子邮件或文件进行沟通。

  建议 2)尽量使日常工作能够自动化尝试自动化每天的例行工作-不管多么小的工作,通过自动化日常的例行任务来节省时间和精力例如,如果你手动进行每日项目构建,可以写一个批处理脚本通过一次点击执行这些任务。

  建议 3)360度 的测试方法-从各个角度思考,找到软件缺陷。除了软件需求说明书以外,找到所有可能与被测应用相关的信息。使用这些信息来完全理解项目,并且在测试的时候 要应用这些知识。例如,如果你正在测试集成到你应用程序的合作伙伴的网站,那么在开始测试之前确保充分理解合作伙伴的业务。

  建议 4)持续学习-不要停止学习。探索更好的方式来测试应用程序。学习新的自动化工具,如selenium、QTP或任何性能测试工具。如今,性能测试对软件测试工程师来说是一种热门职业目标!掌握这个技能。

  建议 5)承认错误,但是要对你做过的任何任务要有自信--避免再次犯同样的错误。这是最好的来学习和适应新事物的方法。

  建议 6)从开始参与-请你的领导或经理允许你在项目开始时参与设计的讨论/会议。这更适用于没有QA领导或测试经理的小团队。

  建议 7)记录一切事情-记录从这个项目中每日学到的新知识。这可能是为了完成某些任务或完成复杂的测试步骤的简单命令,这样你就不需要向其他测试人员或开发人员询问同样的事情。

  建议 8)提高你的沟通技巧和人际交往能力-在职业发展时期的各个阶段非常重要。

  建议 9)确保你在工作中会被注意到-有时你的领导也许不能向你的经理或公司管理层陈述你的真实状况。在这种情况下,你应该不断寻找合适的时机,向你的高级管理人员展示你的业绩。

  警告-不参与政治工作,如果你认为你的领导或经理能友善的传达你的技能/业绩给你的经理或高层管理人员。在这种情况下不需要遵循这一建议。

  建议 10)软件测试是有趣的,享受它-保持冷静,集中精力,遵循所有的过程,享受测试。看软件测试多么有趣。我必须说的是,对某些人来说软件测试会让他们着迷。

  额外的建议

  阅读,阅读还是阅读----继续读与软件测试和质量保证相关的书籍,白皮书,研究案例。继续关注有关软件测试盒质量保证行业的最新资讯。或继续阅读此博客,来保持自己测试知识的更新。

  原文出处:http://www.softwaretestinghelp.com/tips-progress-in-software-testing/

posted @ 2012-09-07 09:51 顺其自然EVO 阅读(152) | 评论 (0)编辑 收藏

数据库的命脉——记录集

 数据库编程中应用的最多、最复杂的对象就是记录集,数据库中的数据都是通过记录集来输送到用户程序,也是通过记录集将更新的数据返回数据库。下面就来详细说明一下记录集:

  1、记录集的属性和方法

  (1)记录集的常用属性

  ● BOF属性     当记录集记录指针指向第一条记录时返回True

  ● EOF属性     当记录集记录指针指向最后一条记录时返回True

  ● AbsloutePosition属性    返回当前记录集记录指针,第一条记录为0,是只读属性。

  ● Bookmark属性      返回或设置当前记录集指针的书签,是字符型可读写属性。

  每一条记录都有自己唯一的书签,它与记录在记录集中的顺序无关。将Bookmark属性存放到变量中,后面可以通过将该变量赋值给Bookmark属性,并返回到这个记录。

  ● NoMatch属性     当我们使用Find方法查询时,如果未找到则返回True。

  ● Index属性       在执行Seek操作时,需要给此属性设置索引的名字,可以为了不同的需要随时更换,如果没有设置,Seek操作出错。

  ● Filter属性      过滤器,用于筛选符合指定条件的记录。

  ● RecordCount属性      返回记录集中的记录书。为了返回正确的记录数,有时需要先移动到最后一个记录,否则可能得不到正确的结果。

  ● Sort属性      指定记录集的排序方式

  (2)记录集的常用方法(注:个别方法不能适用于每种类型的记录集)

  1)移动记录指针类方法

  ● MoveFirst,将记录集指针移动到第一条记录。

  ● MoveLast,将记录集指针移动到最后一条记录。

  ● MovePrevious,将记录集指针移动到前一条记录。

  ● MoveNext,将记录集指针移动到下一条记录。

  2)增加、删除、修改类方法

  ● AddNew,想记录及增加一条新纪录

  ● Edit,对当前记录进行编辑,修改完成后要用Update方法更新记录。

  ● Update,如果增加或修改了记录,必须用此方法更新。

  ● CancelUpdate,取消更新记录,在使用了Edit或者AddNew方法后放弃修改。

  ● Delete,从记录集中将当前记录删除。

  在删除后常使用MoveNext方法移动指针,否则会出现无当前记录的情况,比如:

<SPAN style="FONT-SIZE: 18px">With Data1.Recordset
 .Delete
 .MoveNext
 If .EOF then .MoveLast
End With</SPAN>

  3)查找类方法

  ● Seek,在记录集中定位符合条件的特定记录,只能对经过索引的字段进行此操作。

  它的语法如下:

  Recordset.Seekcomparison,key1,key2. . .key13

  其中的comparison可以是6中关系运算符中除了“<>”外的其他运算符,如果建立的是复合索引,用Seek方法的时候可以给出多个键值。例如,要查找学号为970222的记录,可以采用下面操作:

<SPAN style="FONT-SIZE: 18px">With rsStudent
 .Index=”XH”
 .Seek “=”,”970222”
 If .NoMatch Then MsgBox”数据未找到”
End With
</SPAN>

  ● FindFirst,在记录集中查询符合条件的第一条记录

  ● FindLast,在记录集中查询符合条件的最后一条记录

  ● FindPrevious,在记录集中查询符合条件的前一条记录

  ● FindNext,在记录集中查询符合条件的下一条记录

  例如,查找[XM]字段中第一个姓李的人的程序如下:

<SPAN style="FONT-SIZE: 18px">Dim S As String
With Data1.Recordset
 S=.Bookmark           ‘记录当前位置
 .FindFirst “XM Like ‘李*’”   '查找姓李的人,用“XM=xx”可进行精确查找
 If .NoMatch then MsgBox “数据未找到”
           .Bookmark=S           ‘如果没找到,返回到原来的位置
 End If
</SPAN><SPAN style="FONT-SIZE: 18px">End With
</SPAN>

  4)其他方法

  ● Clone,克隆(建立一个复本)记录集

  ● Close,关闭记录集,不用的时候应该关闭,以释放资源

  ● OpenRecordset,据本记录集按指定条件生成一个新记录集,如果要创建一个记录集的子集,应该使用此方法。

  2、记录集的使用举例

  打开我们前面创建的数据库,并写一条记录在里面,本例是直接给记录赋值,完全可以设计一个界面,然后从上面的TextBox或者其他空间中取出值并赋值给记录,因为界面设计不是本章的主题,所以从略,程序如下:

<SPAN style="FONT-SIZE: 14px">            </SPAN><SPAN style="FONT-SIZE: 18px"> Dim db As Database  ‘数据库对象
             Dim rs As Recordset       ‘记录集对象</SPAN>
<SPAN style="FONT-SIZE: 18px">  Set db=DBEngine.Workspaces(0).OpenDatabase(“Students.MDB”)
  Set rs=db.OpenRecordset(“students”,dbOpenTable) ‘表的名字也叫students
  rs.AddNew   ‘增加一条新记录,如果是修改原有记录,则使用Edit方法
  With rs
   .Fields(“XH”)=CLng(970111)
   .Fields(“XM”)=”张思强”
   .Fields(“XB”)=”男”
   .Fields(“BORN”)=”河北石家庄”
   .Fields(“BIRTH”)=”1980-1-1”
  End With
  rs.Update        ‘修改或者增加新纪录后,必须更新数据库才能保存
  rs.Close   ‘关闭记录集
  db.Close   ‘关闭数据库
</SPAN>

  Recordset对象中所含的Fields集合包含了一个记录的各个字段,Fields集合中没有若干个Fields对象,Fields对象 的Value属性代表了当前记录的该字段的值,上例中并没有写成像Fields(“XH”).Value或者Fields(0).Value这种形式,是 因为Value属性是对象的默认属性,在编写代码时可以省略。对于基本类型的数据可以至今进行赋值,对于超长类型的数据,如歌曲、电影、图片则需要用 Field对象的AppendChunk方法和GetChunk方法来进行处理。

  3、记录集的种类

  Recordset对象有3中类型,即表(table)、动态集(dynaset)、快照(snapshot)。

  表类型的Recordset对象是指当前数据库中的表在创建表类型的记录集时数据库引擎打开的表。后续的数据操作都是直接对表进行的。只能对单 个的表打开表类型的记录集,而不能对连接或者联合查询打开表类型的记录集。与其他类型的Recordset对象相比,表类型的搜索与排序速度最快。

  动态集类型的Recordset对象可以是本地的表,也可以使返回的行查询结果。它实际上是对一个或者几个表中的记录的一些列引用。可用动态集 从多个表中提取和更新数据,其中包括连接的其他数据库中的表。动态类型具有一种与众不同的特点:不同数据库的可更新连接。利用这种特性,可以对不同类型的 数据库中的表进行可更新的连接查询。动态集和他的基本表可以互相更新。如果动态集中的记录发生改变,同样的变化也将在基本表中反映出来。在打开记录集的时 候,如果其他的用户修改了基本表,那么动态集中也将反映出被修改过的记录。动态集类型是最灵活的,也是功能最强的Recordset类型。

  快照类型的Recordset对象包含的数据是固定的,它反映了在产生快照的一瞬间数据库的状态。从Microsoft Jet数据源得到的快照是不可更新的,从开放数据库互连(ODBC)数据源得到的某些快照是可以更新的,这取决于所有数据库系统本身的能力。与动态集类型 和表类型的Recordset对象相比,快照的处理开销较少。因此,它执行查询和返回数据的速度更快,特别是在使用ODBC数据源时。快照类型保存了表中 所有记录的完整复本,因此,如果记录的个数很多,快照的性能将比动态集慢的多。

  使用什么记录集,取决于需要完成的任务是要更改数据还是简单地查看数据。例如,如果必须对数据进行排序或者使用索引,可以使用表。因为表类型的 Recordset对象是可以索引的,它定位数据的速度是最快的。如果希望能够对查询选定的一系列记录进行更新,可以使用动态集。如果在特殊的情况下不能 使用表类型的记录集,或者只需对记录进行扫描,那么使用快照类型可能会快一些。




posted @ 2012-09-06 09:44 顺其自然EVO 阅读(367) | 评论 (0)编辑 收藏

JVM 优点与缺点的深入分析

 Java 最初诞生的时候,它可以说是其他语言的进化版。不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机。它还是垃圾收集 站,从而令存储管理和内核转储(core dump)不再是麻烦。当然还有它相当全面的类库。虽然它没有什么惊世的新性能,但它把许多语言的优点基于一身。

  Java本来是一个简 单独一的语言,但是Sun在长期运营Java的过程中出现了很多错误,比如将语言与runtime合用一个名字,从而使得用户在识别JVM语言项目如 Jython、JRuby时难以从思想上隔离Java。最主要的是这样对runtime很不公,因为Java Virtual Machine (JVM)有很多自己的独特之处。

  1、缺点

  没有一种技术是完美的,JVM也不例外。如果你工作在一个没有Java语言配置的设备上,JVM便无用武之地。JVM为其他语言提供了基础,但JVM最初不是为这个理念设计的。比如我们作为分配对象来维护我们的堆栈时,通常我们会直接操作实时堆栈并添加我们维护所需的其他字段,除此之外再没有控制堆栈的更好的方法。

  还有,当我们创建一个Ruby Fixnum时也很麻烦,我们把这些值用一个Java对象包装。Ruby的C implementation不过只是传递tagged ints,因为没有包装他们就不会符合各种列表,所以Java 基元(Java primitives)也不会切割它。

  顺便说一下:JVM的启动时间也挺长。

  那些为JVM编写高性能代码的开发者会觉得经常被JVM的black box特性所折磨,一旦你加载你的字节码,你就觉得像是摇动老虎机的游戏手柄一样忐忑,不知道结果如何,black box就是意味着不可知。

  2、优点:

  HotSpot(Java 虚拟机)

   对于初学者来说,尽管Hotspot有些神秘,但是性能方面它确实很棒,因为动态建模(dynamic profiling)是优良性能的捷径。HotSpot从运行应用中采样数据,从而可以优化代码,进而得到良好性能。它相当于以模仿人工的方法进行优化。 在程序运行的开始,Java代码仍然解释执行,但HotSpot引擎开始进行采样(Profiling)。HotSpot引擎可以集中精力来对 HotSpot代码进行深度优化,从而使这部分代码的执行更加迅捷。因此当HotSpot优化时,它为优化设立了一层保护来确保优化的基本原理有效;但当 这层保护失效时,优化就会很慢。

  这里是Hotspot在使用中的一个演示:

   在图表中我们运行了一个Mandelbrot Generator很多次,然后测绘它每次生成的时间。你会看到JRuby 1.4.0明显比Ruby 1.8.7以及1.9.2preview2表现更好。如果只看JRuby的起点,会发现比1.8.7慢,但当Hotspot运行后时间曲线迅速下降。

  这里有个有趣的始建波动发生在循环6那里:实际上那是因为HotSpot的动态反优化启动。然后时间波动回到原来状态,优化结束。

  Hotspot已经被全世界的开发者和拥趸支持了近十年,Java 4, 5, 6之间的提升让人印象深刻。每一次它的升级,性能都会有很多提升,它真是的是JVM的一大利器。

  3、垃圾回收Garbage Collection (GC)

  Java开发者花费大量时间来调试、测试、 提高他们的VM,单是Garbage Collection的开发和维护就持续了15个年头,由此可见它的性能!而且JVM发布了多个垃圾回收器,所以这样一来即使加载的负荷超过了JVM中一 个Garbage Collection,JVM也还可以允许你使用其他的Garbage Collection。因此,你可以自己调整任何你所使用的Garbage Collection,使之符合你的应用。

  各种各样的回收站发挥着不同的作用。它们全部是压缩过的,所以不必担心存储的问题。它们都是增量型的(incremental)以缩短GC停滞 的时间;它们还是分代的(generational),所以短时对象(short-lived object)回收得更快(想了解更多,请参见我的博客:Java 内存模型及GC原理)。有些是并行的,从而回收工作可以在多个核上分开运行;甚至还有同时发生的Garbage Collection,这样就没有了停滞时间。JRuby可以免费得到这些,现在的Java 7以及Java 6的u12,甚至还有一个新的G1回收站。

  关于GC和JVM还有两个很巧妙的地方,从中可以获悉GC运行虚拟化和信息的情况。第一个是-J-verbose:gc flag,从中可以得到回收事件发生的时间、数量以及花费的时间,这可以让我们获悉垃圾回收器处理工作负载的好坏状况:

[GC 16000K->3727K(82496K), 0.0396636 secs]
[Full GC 13021K->5802K(82496K), 0.1468975 secs]
[GC 21802K->9769K(82496K), 0.0292348 secs]
[GC 25769K->12535K(82496K), 0.0243674 secs]
[GC 28535K->13136K(82496K), 0.0169928 secs]
[GC 29136K->15498K(82496K), 0.0213308 secs]
[GC 31498K->16911K(82496K), 0.0213301 secs]
[GC 32911K->19413K(82496K), 0.0186457 secs]
[GC 35413K->20207K(82496K), 0.0146396 secs]

  你可以记录这些事件并且计算出清理垃圾所需的总时间,还可以计算出你加载的工作负荷是否超过了回收器的能力,这可以帮助改变你的设计并通过调节堆栈大小来适配回收器。

  第二个是通过JConsole查询JVM状况。JConsole可以从许多角度查看系统,而且有一个很棒的memory tab来展示GC的运行状况,如下:

  在右下角你可以看到绿色的框格,从中可以看到不同的生成占存储的多少。比如说你看到一个近乎满的survivor 生成,那意味着慢的满GC收集时刻,那么意思就是说这个应用可能不是很健全。

  4、JVM特性

  1)移植性

  无论是GC还是Hotspot都可以用在任何Java可用的地方。比方说,JRuby可以运行在其他平台 上,Rails应用就可以运行在IBM主机上的JRuby上,而且这台IBM主机运行的是CP/CMS。实际上,由于Java和OpenJDK项目的开 源,我们正在看到越来越多的平台的衍生,因此JVM的移植性也将越来越棒。

  2)成熟

  JVM已有超过15年的历史,在过去的这些年里,许多开发者为它做出了许多贡献,使得它的性能一次又一次地提升,让JVM变得更加稳定、快速和广泛。

  3)覆盖面

  JRuby和JVM上的其他语言项目已经被开发者所承认,一个典型的例子是invokedynamic specification (aka JSR292)。JSR越来越配合新的语言,JVM已不再是Java一个人定制规则。JVM正在构建成为类如JRuby等项目的优良平台。

  还有一个MLVM(multiple language VM)项目,好比是新特性的清算机构,是一个许多企业应用的开发者试图添加应用的地方,而这些应用正是他们想在JVM中看到的。而且JVM开发者互相协作、彼此影响,无疑这有利于JVM新特性的诞生。

  这些细节都可以看到JVM正在关注开发者的需求,扩大他的覆盖面。

  5、总结

  JVM已经成为技术界越来越稳定的产品,Oracle/Sun的合并以及其他可能的商业闹剧都不会影响这一点。许多 技术大鳄级公司(如Oracle、IBM、HP、SAP)已经为编写JVM的中间软件花了如此多的钱,以至于在下个十年里他们可能不会再为JVM的发展做 太大的贡献。

posted @ 2012-09-06 09:38 顺其自然EVO 阅读(167) | 评论 (0)编辑 收藏

Android单元测试与日志输出

使用单元测试可以保证我们开发的应用质量,一般我们开发完业务层后对业务层进行测试,确保业务层不会出现bug,对业务层通过之后控制层就可以调用业务层完成所需的功能。

  以前做Java开发的时候用junit进行测试,利用System.out.println()方法在控制台进行打印,下面我来讲讲如何对Android应用进行 单元测试以及日志输出。

  单元测试与日志输出

  1、单元测试步骤:

   第一步:在AndroidManifest.xml文件中插入以下代码,在 <application>元素中插入<use-library android:name="android.test.runner"/>,然后在<manifest>中插入< instrument android:name="android.test.InstrumentationTestRunner" android:targetPackage="此处插入Activity的包名" android:label="此处插入标签名,名字可以自己随意取"

  第二步,编写单元测试代码 测试类必须继承AndroidTestCase类

  第三步,执行测试

  2、测试示例

  首先在AndroidManifest.xml中添加第一步所需代码,最终代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.csdn.android.junit"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="10" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner"/>
        <activity
            android:label="@string/app_name"
            android:name=".Junit_testActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>    

    </application>
<instrumentation
    android:name="android.test.InstrumentationTestRunner"
    android:targetPackage="cn.csdn.android.junit"
    android:label="MyJunitTest"
    >
</instrumentation>

</manifest>

  然后新建测试用例

   用例方法为 public void func1(){}其中初学者常犯的错误是为测试方法添加参数,一定要注意测试方法是不需要传入参数的,如果测试方法内部出现异常,建议是直接抛出,而不 要捕获异常,异常抛出后会被测试框架获取,在控制台显示出来。测试类的内容如下:

package cn.csdn.android.junit;
import junit.framework.Assert;
import android.test.AndroidTestCase;
public class MyTest extends AndroidTestCase{
public void testFunc1() throws Throwable{
User u = new User();
u.func1();
}
public void testFunc2()throws Throwable{
User u = new User();
Assert.assertEquals(20,u.func2());
}
}

  Assert类在此的作用是 判断所得到的结果与期望值的关系

  第三步,运行测试用例:先进入大纲视图(Outline),如果Eclipse中没有,可在工具栏window中找到,然后添加上即可。然后右击测试用例,找到[Run As],点击【Android JUnit Test】,结果条显示为绿色表示正确:

  3、日志输出

  Console控制台只能输出安装信息,如果在程序中添加一行 System.out.println("aaa"),如果是进行Java开发,则会在console控制台打印,但在Android中却不能在 console中打印出来,而是会在LogCat中打印出来,在Android程序中进行信息输出,一般采用Android.util.Log类的静态方 法进行实现,log类所输出的日志的内容从少到多,分别是ERROR,WRAN,INFO,DEBUG,VERBOSE,对应的五种不同类型的首字母,分 别是Log.e(),Log.w(),  Log.i(),   Log.d (), Log.v()五种静态方法,使用不同的方法输出的颜色不同,如下图所示:,单击每个按钮,可以过滤其自身类型以及右侧类型的日志,如点击I 按钮,会显示IEW三种类型的日志,而VD类型的日志则不会显示出来

  1)编写日志输出测试类,代码修改如下

package cn.csdn.android.junit;
import junit.framework.Assert;
import android.test.AndroidTestCase;
public class MyTest extends AndroidTestCase{
private final static String TAG = "myTag";
public boolean onTouchEvent(MotionEvent event) {
Log.i(TAG,"onkeyTouch");
showInfo("   "+ event.getX()+" "+ event.getY());
return super.onTouchEvent(event);
}

  说明:Log.i(String tag,String sag),tag是这条信息定义的一个标签,在开发时通常采用他所在类的类名,这样方便我们追踪输出信息,也方便我们看到信息时知道他出自哪个类,msag是这个参数希望输出的内容

  2)执行测试:执行方法和上面的测试方法几乎相同,打开日志查看器“LogCat”,查看是否输出这个信息,如下图:

  点击上图中的“+”,弹出添加LogFilter界面,在其中填写的信息如下图:

  点击“OK”,在LogCat管理器中多出一个选项卡,“MyTest”,在该选项卡中出现我们在代码中想要的信息:

posted @ 2012-09-06 09:30 顺其自然EVO 阅读(1673) | 评论 (0)编辑 收藏

如何带新员工(测试篇)

  在一个项目中,有很多的人,有很多的不同的职能部门;有的负责测试,有的负责开发,有的负责外场;每年都有很多的人进进出出这个项目、部门,人员变动在人任何一个项目都是非常普遍的情况。如何迅速培养新与员工,是项目管理的一个认真思考的一个问题。

  就测试人员的培养方面,我有以下几点的想法:

  1、测试的目的是什么;测试分为单元、集成、系统,还有外场测试、开局测试;单元和集成测试有开发人员来完成了;系统测试就由专门的测试人员来进行;而且系统测试是最关键的,只有经过严格、系统、全面的、细致的、合理的系统测试,产品才能给客户交付。但是有很多人认为测试就是把产品拿过来,随便敲命令就可以了,非常的简单。

   其实测试有一套非常明确的理论和指导意见在支持。测试的目的是发现故障;但是如何发现故障,如何测试发现故障,如何按照目标测试发现故障;有的人测试唯 故障多少论;这就涉及到测试的合理性问题了,难道发现的故障越多,版本就越稳定吗?一个项目交付有一个时间的问题,大家不可能给这个项目测试非常多的时 间,从项目交付到测试部开始测试,到外场测试、开局测试,到产品商用,都有一个严格的时间规定的;理论上的测试空间是无穷大的,一个测试人员要把所有的测 试条目都过完,而且还要反复的过这些测试条码都是不 太可能的;那有一个问题了:如何在有限的时间能完成测试任务;这个就测试合理性问题。我认为:认真研究客户使用方法,总结一套实际和可用的测试指导方案, 通过系统和循序渐进的培训,来强化测试人员这种测试理解;只有按照客户使用的方法来测试我们的版本,才能发现在商用中出现的问题,才能更好的比较开局故 障、商用故障。

  2、测试人员负责的模块的测试;如何开始测试负责模块?理解要测试模块的功能,熟悉模块设计的相关文档,熟悉测试模块的 商用场景;其中最重要的事要熟悉商用场景,用户是不是要这么使用,是如何使用的。其实一个版本的功能非常多,但是客户真正使用的是功能是其中一部分,其它 的都是默认的配置或者基本功能。

  3、新测试人员的讲解;新员工在未转正之前都要进行负责模块的讲解;讲解什么内容?有的是讲如何测试 的,有的是讲测试模块设计的相关协议的;我认为关键是谈谈测试心理和理念,多讲解商用环境;如何结合商用环境来铺开测试;尽可能的以商用为中心测试更多的 测试案例;如何排列自己的测试顺序。

  ps:唯故障数量论的测试是垃圾。

posted @ 2012-09-06 09:28 顺其自然EVO 阅读(190) | 评论 (0)编辑 收藏

消息中间件及其测试要点

  中间件(middleware)是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。中间件是基础软件的一大类,属于可复用软件的范畴。中间件位于数据库和 应用软件中间,为了解决协议转换、通讯、消息传递、事务管理、内存管理等任务而固化的软件,不再需要编程者处理这些问题,只要解决软件的业务逻辑就行了。 中间件发展与研究在基础软件中最晚,没有达到操作系统、数据库管理系统那样的成熟程度,内涵与外延目前都还不是很清晰。

  中间件的分类没有官方的或者唯一的标准,但是比较流行的一种分法是:屏幕转换及仿真中间件、数据库访问中间件、消息中间件、交易中间件、应用服务器中间件、安全中间件,还有三种中间件也是比较常用的,包括曾经比较流行的门户中间件,和最近兴起的工作流中间件和企业应用集成中间件(ESB)等。

   消息中间件是中间件中的重要类型。消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息 传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。也就是说,消息中间件的主要功能是实现消息传输管理、消息管理、队列管理、多种协议支持、 JMS支持等,主要的消息中间件产品包括:IBM  的MQ、SUN 的JMS、微软的MSMQ以及国内的,如:东方通、协同等厂商等相应产品等。

  对于消息中间件产品的测试需要根据其主要功能展开,所以测试内容包括:

  消息传输管理

  测试内容包括是否支持跨平台消息传输、支持发送消息过程中屏蔽发送端与接收端的网络故障、支持发送消息过程中屏蔽接收端的异常,如:接收端宕机、系统崩溃等情况,是否支持消息传输过程中的故障诊断与日志记录、支持消息传输过程中的故障恢复、支持消息传输过程中的断点续传功能等。

  消息管理

   测试内容包括是否支持查看发送端和接收段消息队列中的消息、支持发送和接收消息队列中的消息、支持接收端消息队列的全部删除和条件删除、支持发送端消息 队列的全部删除和条件删除、支持消息的优先级定义,并根据优先级完成发送和接收的不同策略,是否支持消息生命周期的设置,并根据消息生命周期的设置完成消 息的生命周期管理等。

  队列管理

  测试内容包括是否支持消息队列的分类,包括:本地队列、发送队列、远程队列、系统队列、用户队列等。是否支持对消息队列的删除操作、支持清空消息队列的消息,是否支持对队列中消息状态的查看,状态包括:ready、standing、receiving等。

  支持多种传输协议

  测试内容包括是否支持IPV6协议、SSL协议、HTTP协议、HTTPS协议等。

  JMS支持

  测试内容包括是否支持点到点的消息传输、支持发布/订阅的消息传输、支持JMS发送、接收文件、支持JMS组消息的传送、支持JMS非持久消息和持久消息、支持消息定义符合JMS的从0到9的优先级路线级别等。

  在确定了以上测试要点后,就可以开始准备相关测试案例,进行测试案例的开发。在实际测试中,执行覆盖所有测试要点的测试案例,以验证消息中间件是否很好的实现了应该具备的所有功能。

posted @ 2012-09-06 09:26 顺其自然EVO 阅读(318) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 292 293 294 295 296 297 298 299 300 下一页 Last 
<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜