变异
测试是通过改变被测对象的源码,比较
单元测试用例的结果,来判断单元测试用例的质量。了解不是很深,只能粗粗介绍,欢迎大家补充。
网上发现变异测试的资料很少,大多是学术论文为主。
变异测试的公主要是mujava与
muclipse,muclipse是基于mujava的,并且集成于eclipse上的插件,官网介绍
mujava http://cs.gmu.edu/~offutt/mujava/
muclipse http://muclipse.sourceforge.net/index.php
根据官网一步步来,居然没有成功,逐个改变参数摸索,终于能出结果了,所以写下这边
文章,希望减少大家研究的时间
1. 安装muclipse
由于官网提供的下载url打不开,只好网上找个edu.ncsu.muclipse_1.3.0.jar下载,放入eclipse plugins目录下,重新启动eclipse,就算安装上啦,eclipse的这种安装方法真简单。
2. 准备的测试案例
package demo1; public class Example { public int multiply(int a, int b) { return a * b; } } package demo1; public class ExampleTest { public void setUp() throws Exception { } public void tearDown() throws Exception { } public int testMultiply() { Example ex = new Example(); return ex.multiply(1, 1); } } |
3. 配置环境
1. 新建或者导入项目,下载extendedOJ.jar包,导入到Libraries
右击project name -> properties ->
java build path -> Libraries -> Add External JARs, select it and click ok
in source tab, 可以修改output folder,就是编译后的.class文件的地址,这里默认是bin
在本节中,我们将介绍一个例子,编写自定义记录器和
TestNG的方法。要编写一个定制的记录器类,我们的扩展类应实现IReporter接口。让我们继续前进,并创建一个示例使用自定义的记录器。
创建一个
Java类为 SampleTest.java 在 C:\ > TestNG_WORKSPACE
import org.testng.Assert; import org.testng.annotations.Test; public class SampleTest { @Test public void testMethodOne(){ Assert.assertTrue(true); } @Test public void testMethodTwo(){ Assert.assertTrue(false); } @Test(dependsOnMethods={"testMethodTwo"}) public void testMethodThree(){ Assert.assertTrue(true); } } |
上述测试类的包含三个测试方法,其中testMethodOne 和 testMethodThree将通过在执行时,而testMethodTwo由通过一个falseBoolean的值Assert.assertTrue方法,它是用于在测试中的真值条件失败。
创建自定义报告类
创建另一个新的类名为 CustomReporter.java 在 C:\ > TestNG_WORKSPACE
import java.util.List; import java.util.Map; import org.testng.IReporter; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestContext; import org.testng.xml.XmlSuite; public class CustomReporter implements IReporter{ @Override public void generateReport(List xmlSuites, List suites, String outputDirectory) { //Iterating over each suite included in the testfor (ISuite suite : suites) { //Following code gets the suite name String suiteName = suite.getName(); //Getting the results for the said suite Map<string, isuiteresult=""> suiteResults = suite.getResults(); for (ISuiteResult sr : suiteResults.values()) { ITestContext tc = sr.getTestContext(); System.out.println("Passed tests for suite '" + suiteName + "' is:" + tc.getPassedTests().getAllResults().size()); System.out.println("Failed tests for suite '" + suiteName + "' is:" + tc.getFailedTests().getAllResults().size()); System.out.println("Skipped tests for suite '" + suiteName + "' is:" + tc.getSkippedTests().getAllResults().size()); } } } } |
前面的的类实现org.testng.IReporter 接口。它实现了IReporter接口定义的方法GenerateReport。这个方法有三个参数:
第一个是xmlSuite,这是TestNG的测试XML正在执行中提到的列表套件
第二个是套件,其中包含一套测试执行后信息,该对象包含了所有的信息包,类,测试方法和测试执行结果。
第三的outputDirectory,报告将产生的输出文件夹路径,其中包含的信息。
创建 testng.xml
创建一个文件testng.xml 在 C:\ > TestNG_WORKSPACE 来执行测试用例
<?xml version="1.0" encoding="UTF-8"?> <suite name="Simple Reporter Suite"> <listeners> <listener class-name="CustomReporter" /> </listeners> <test name="Simple Reporter test"> <classes> <class name="SampleTest" /> </classes> </test> </suite> |
编译SampleTest,CustomReporter类使用javac
C:\TestNG_WORKSPACE>javac CustomReporter.java SampleTest.java
运行 testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
验证输出
===============================================
Simple Reporter Suite
Total tests run: 3, Failures: 1, Skips: 1
===============================================
Passed tests for suite 'Simple Reporter Suite' is:1
Failed tests for suite 'Simple Reporter Suite' is:1
Skipped tests for suite 'Simple Reporter Suite' is:1
前面的例子显示了一个简单的自定义报告器,打印的数量在控制台上对每个套件包含在上述的测试执行失败,通过跳过测试。报告器主要是用于测试的执行,以生成最终的报告。扩展程序可以被用来生成XML,HTML,CHM,CSV或文本格式的文件,根据报告要求。
以前曾经写了一篇博文谈如何推广
单元测试,最近有朋友问我如下的问题,因此便又写了本文,阅读时请综合原来的博文。
问题:
有开发人员认为进行单元测试会花费大量时间来编写
测试用例,因此他们做单元测试的意愿比较低,请问有何好的建议进行单元测试的改进?
解答:
1、首先应该明确单元的含义。单元在面向对象的程序中指的是一个类,在结构化的方法中指的是一个函数。
2、其次应该明确单元测试的方法。单元测试的常用方法包括:
(1) 静态检查,即采用静态代码检查的工具对程序进行内部逻辑的分析,以分析程序中可能的错误或坏味道。
(2) 动态测试,通过编写单元测试程序,设计单元测试用例,测试每个函数或每个类的逻辑正确性。
3如果一个类或一个函数对其他的类或环境依赖性很强,需要编写大量的桩程序或驱动程序,那恰恰说明了这个类或这个函数的设计有问题,违背了“低耦合”的基本设计原则,这也正式
敏捷方法中提倡的“测试驱动开发”的作用之一。
4、质量的投入产出也是一种平衡,需要在单元测试上投入到什么程度首先是公司的一个管理方针。如果每个单元都进行单元测试则测试代码的规模和产品代码的规模能够达到1:1,也就是说编写测试代码的
工作量还是比较大的,但是也要看到单元测试的产出。在单元测试、集成测试、
系统测试中,单元测试是投入产出比最大的测试种类,即单元测试在单位时间内发现的缺陷个数大于集成与系统测试。原则上单元测试的投入最大,找到的缺陷最多,集成测试与系统测试依次递减。
5、在实践中推广单元测试时可以采用如下的方法:
(1) 加大静态检查的力度。通过静态检查的工具快速地识别程序中的错误、警告、坏味道,公司可以规定对检查出的哪些警告、坏味道必须进行修改,注意如果修改所有的警告、坏味道可能工作量比较大。静态检查是一种投入产出比很高的单元测试方法。在JAVA下可以采用check Style, Source monitor,PMD,Find Bugs,Jslink等。
(2) 通过测试策略的选择减少测试程序的工作量。单元测试一般有三种策略:
策略一:自底向上的策略:先测底层的函数或类,再测上层的函数或类,此时只需要编写驱动程序,不需要编写桩程序。
策略二:自顶向下的策略:先测上层的函数或类,再测试底层的函数类,此时只需要编写桩程序,不需要或很少需要编写驱动程序。
策略三:混合策略:综合上述的2种策略,需要综合编写桩程序与驱动程序。
如果被测的单元需要调用很多其他的单元,则可以采用自底向上的策略减少驱动程序的编写量。如果被测的单元需要很多外围的环境准备则可以采用自顶向下的策略。
(3) 在组织级可以规定执行单元测试的时机,比如:
i)系统中最核心的、最关键的功能模块;
ii)算法复杂的功能模块;
iii)出错最多的功能模块;
iv)客户最常使用的功能模块;
v)复用的底层代码
根据Pareto定律,我们可以选择少部分代码执行单元测试。
6、单元测试的技术
(1) XUnit的工具
(2) 生成测试用例时可以采用如下的方法:
i)单元功能分析
ii)入口参数等价类分析
iii)入口参数边界分析
iv)全程变量、共享数据的等价类与边界分析
v)调用函数返回值的等价类与边界分析
vi)覆盖率分析
上述的方法要求的严格程度可以循序渐进,不能的严格程度需要投入的工作量不同。
一、AppScan安装时出现错误1603。
是因为之前安装过,没有卸载干净导致报错。解决方法如下:
1、控制面板→程序和功能→选中程序卸载。
2、删除AppScan安装路径以及下面的所有内容。
3、在系统[开始]->[运行(R)...]中,运行命令regedit来删除全部注册键(如果存在的话),以及下列的子 键:
A.HKEY_LOCAL_MACHINE\SOFTWARE\IBM\
Rational AppScan
B.HKEY_CURRENT_USER\Software\IBM\ Rational AppScan
A.点击系统[开始]->[运行(R)...],输入 %temp%并运行
B.当文件夹打开后,选择菜单[编辑]->[全部选定(A)],在选定文件的任何部分右击鼠标并选择[删除
(D)](跳过当前可能还在使用的文件,尽可能的删除所有可以删除的文件)
5、同样打开APPSCAN_TEMP文件夹:
A.打开后删除里面所有的内容
B.如果发生下面的错误,忽略该错误开始下一步操作
%APPSCAN_TEMP%
Windows cannot find '%APPSCAN_TEMP%'. Make sure you typed the name
correctly, and then try again. To search for a file, slick the Start
button, and then click Search.
6、使用Windows自带的磁盘清理设置来清理您的电脑:
A.在系统[开始]->[运行(R)...]中,输入命令: cleanmgr/sageset,选择"临时安装文件","安装日志
文件","临时文件"并取消其他项目的勾选(这样工具的配置已经完成)。
B.在系统[开始]->[运行(R)...]中,输入命令: cleanmgr/sagerun(这样就启动了清除功能,一般需 要几分钟才能完成)。
7、重新启动电脑。
二、AppScan扫描后篡改网站代码。
在扫描配置→
测试策略→勾选了侵入式,有可能会篡改掉网站的代码。如果会篡改的话在扫描的时候去掉这个勾选即可。(不过这个就呵呵了,要从代码上放置被侵入攻击)
三、AppScan扫描过程中C盘空间不足。
1、建议不要勾选启用扫描日志,当扫描网站过大或扫描时间过长,随着日志文件变大会导致系统崩溃。如果已经勾选了,可以在工具→选项→启用扫描日志勾选去掉即可。
2、如果要勾选的话,可以把用户文件保存到其它硬盘。默认的用户文件是:C:\Documents and Settings\Administrator\My Documents\AppScan;可以修改为其他路径。该路径可以在菜单栏中依次选择工具→选项→一般→文件位置部分修改。
3、如果已经把上面的地址都修改到了其他盘,但是在扫描过程中还是发现C 盘的空间快速被消耗,是因为很多临时文件都保存在C 盘,AppScan 中有一个隐藏的参数APPSCAN_TEMP 来设置临时文件位置。可以通过修改系统变量来修改到其他硬盘空间。临时文件位置说明:描述正常操作期间AppScan 将其临时文件保存到的位置。缺省情况下,AppScan 将其临时文件存储在以下位置:C:\Documents and Settings\All Users\Application Data\IBM\Rational AppScan\temp如果需要修改此缺省位置,请按照要求编辑环境变量APPSCAN_TEMP 的路径。
访问环境变量的方法是:右键单击我的电脑,然后依次选择属性→高级→环境变量。
注意:在新位置的路径中绝不能有任何Unicode字符。
修改AppScan 中的临时文件:桌面上鼠标右键选择我的电脑→属性→高级系统设置→高级→环境变量,增加一个新的“用户环境变量”,名字是“APPSCAN_TEMP”,设定路径,指向您希望保存临时文件的目录。
4、还可以始终暂停扫描稍后再启动,当然有了前面的方法我想也不需要这样了。
四、AppScan扫描时虚拟内存不足。
1、一个小时保存一次,以免出现故障的时候之前扫描的结果白费了;在工具→选项→扫描过程中自动保存设置为60分钟自动保存一次。
2、可以在工具→选项→高级搜索PerformanceMonitor.RestartOnOutOfMemory把属性值改为true。使Rational AppScan当内存使用量相对过大时自动重新启动。 这样当扫描因为剩余的虚拟内存量过低从而被迫停止时,Rational AppScan会监测系统注册表的设定来决定是否重新启动。
五、AppScan扫描时出现通信问题。
1、减小线程数,扫描配置→通信和代理。
2、加大超时数,扫描配置→通信和代理。
3、服务器有防火墙,防火墙关闭之后即可扫描。
六、AppScan打开文件时提示“文件出现损坏”。
1、先试试这个、可能是因为Issch和ISUSPM自启动项被禁用了。运行“msconfig”看下,如果禁用状态,开启为开机启动即可。
七、AppScan整个扫描流程简述。
AppScan 使用步骤:计划、执行、检查、分析。
1、在计划阶段(plan):明确目的,进行策略性的选择和任务分解
A、明确目的:选择合适的扫描策略
B、了解对象:首先进行探索,了解网站结构和规模
C、确定策略:进行对应的配置
D、按照目录进行扫描任务的分解
E、按照扫描策略进行扫描任务的分解
2、执行阶段(Do):一边扫描一遍观察
A、先爬后扫(继续仅测试)
3、检查阶段(Check)
A、检查和调整配置(过程中可能会产生一些问题)
4、结果分析(Analysis)
A、对比结果
B、汇总结果(整合和过滤)
Ps.一般扫描的时候选择综合扫描会扫描的全面些。
八、修改后验证。
1、右击需要验证的问题,点击重新测试,如果修复了的话,此问题会消失掉。
2、对于HTML注释敏感信息泄露验证不掉的问题,可以点击具体问题然后查看请求/响应点击下一行突出显示看具体问题,然后在网站相应页面前台中查看是否已去掉此注释。
第三方支付平台的功能和结构特点
在信用方面,第三方支付平台作为中介,在网上交易的商家和消费者之间作一个信用的中转,通过改造支付流程来约束双方的行为,从而在一定程度上缓解彼此对双方信用的猜疑,增加对网上购物的可信度。
在技术层面,第三方支付平台承担安全保障和技术支持的作用,提供一系列的应用接口程序,支持多家银行的多卡种支付,将多家签约银行的支付方式整 合到一个界面上,负责交易结算中心与银行的对接。银行与商家通过接入第三方支付平台实现二次结算,并采用国际先进SSL加密模式,在银行、消费者和商家之 间传输和存储资料。第三方支付服务商所提供的支付系统能够承载很大的数据量、吞吐率,并具有极高的支付成功率。同时还可以根据不同用户的需要,对界面、功 能等进行调整,增加个性化和人性化的特征。
目前国内出现了数百个第三方支付平台,这些平台的业务模式和技术实现方法不尽相同,但平台的结构则具有一个相似的基本点,即第三方支付平台前端直接面对网上客户,平台的后端连接各家商业银行,或通过人民银行的相关支付系统连接各家商业银行。
第三方支付平台业务流分析
根据电子支付产业链的分析我们看到,第三方支付最初的支付模式只是作为银行和网上商户的中介,这就是第三方支付“一般模式”;随着支付业务的发展,小商户和网民之间的信用风险导致了“提供担保”的支付模式。
第三方支付一般模式的流程:在中国,消费者通过第三方网上支付平台进行支付一般必须涉及到发卡银行(网银)、网上商户和第三方网上支付平台。一个典型的消费交易,通过第三方网上支付平台支付的流程图如下:
第三方支付一般模式流程说明
一般支付流程如下:
a)网上消费者浏览检索商户网页,并在商户网站选择商品、下订单;
b)商户网站列出可以选择的支付网关,消费者选择其一,商户网站将连接到第三方支付网关的支付页面;
c)网上消费者在第三方支付平台的支付页面,选择相应的银行、卡种;
d)第三方支付平台将网上消费者的支付信息,按照各银行支付网关的技术要求,传递到各相关银行,进入银行支付页面;
e)银行(银联)提供输入卡号、金额、密码等关键信息的安全页面;网上银行转发给银行账务系统,由相关银行(银联)检查相应账户(网上消费者)的支付能力,实行冻结、扣账或划账,并将账务系统的处理结果返回给网上消费者本身和第三方支付平台;
f)第三方支付平台将支付结果转发给网上商户;
g)网上商户确认收到成功支付应答的,向网上消费者发货或提供服务;
h)第三方平台根据协议于第二天或约定的周期向商户支付扣除手续费后的资金;第三方平台为网上商户提供差错交易处理的服务;
i)第三方平台作为商户与网上银行对帐,核对资金、核对;第三方平台代表网上商户与网上银行处理差错交易。
从整个过程上来看,多家银行和签约商家通过支付网关连成通道,消费者通过第三方支付平台付款给商家,通过第三方支付为商家提供一个可以兼容多银行支方式的接口平台。
第三方支付担保模式的流程:第三方支付担保模式,也称为信用中介型模式。该种运营模式,基本是由大型的电子交易平台独立开发或与其他投资人共同 开发,凭借运营商的实力和信誉与各大银行合作,同时能够为买卖双方提供中间担保的第三方支付运营模式。这种模式的运营商主要是借助电子交易平台和中间担保 支付平台与用户开展业务,在交易过中采用充当信用中介的模式,保证交易的正常进行。
以支付宝模式流程为例,其具体运行流程是:
支付宝模式流程说明
以支付宝支付模式为例,其具体运行流程是:
a)买家确定购买之后从支付宝的个人账户中划拨出来,保留在支付宝监管账户中;事先用户应当保证账户中有足够的资金;如果余额不足,支付宝会自动跳转到充值页面,让客户通过网银充值;
b)支付宝扣账成功后,通知卖家发货;
c)卖家通过其配送渠道向买家发货;
d)待买方收到商品并确认无误后,通知支付宝收到货物;
e)支付宝将监管账户中资金划拨到卖家在支付宝的账户中。
支付宝作为代收代付的中介,主要是为了维护网络交易的安全性。
在网上交易中, 客户在商家网站下订单后,先把货款付给大家都信任的第三方中介机构,在商家知道货款己到第三方中介机构后把货物发送给客户。如果客户对货物满意,货款就通过第三方中介机构付给商家;如果不满意,客户把货物返回给商家,并从第三方中介机构处取回货款。
第三方支付平台测试方法
从上述的两种支付流程来看,作为网络交易的主要支付渠道,第三方网上支付平台在发卡银行、网上商户间提供了接口平台,在电子支付产业链中起到重 要的中介作用。面对这样的电子化信息系统及其网络交易中可能存在的风险,我们不得不实时地关注:第三方支付业务的流程是否能够正确实现、功能是否正确、网 上大量客户的并发交易会不会导致支付系统崩溃、支付系统的不稳定或者互联网诚信体系的不健全会不会影响网上购物和交易等等问题。
目前亟待解决的问题就集中在;如何通过有效地方法和策略以验证第三方支付系统的功能是否正确实现,是否会造成网络拥堵及如何通过现有的网络技术 如Internet Web、数据加密、防火墙技术、各种交易协议、客户端浏览技术和软件等,使得客户和商家能透明安全地进行交易等。因此,为了防范第三方支付系统的交易风 险,保障系统的稳定运行,必须考虑采取强有力的措施加以管理和控制,积极地引入软件测试,强化系统质量测试和安全评估,为网络交易支付系统提供可靠地服务 保证。
根据支付系统的业务流程和发展需要,下面从系统的测试重点出发,主要讨论第三方支付系统的功能、性能及安全性的测试方法。
功能测试方法
在对第三方支付平台实施测试过程中,应采用黑盒测试策略,使用等价类划分、边界值分析、因果图法、判定表法、正交试验法、功能图法等测试用例设 计方法的原理与实现,分别对第三方支付系统的功能、第三方账户和交易风险监控、系统性能及安全性等测试指标项进行测试。黑盒测试法应制订覆盖全部功能模块 的测试用例,通过执行测试用例以实现系统功能、业务流程和其它质量特性的测试。
针对第三方支付平台的业务功能,如“会员管理、账户管理、中间账户资金管理、差错处理、资金结算、对账处理、统计报表”等等,应综合应用各类测 试设计方法:首先对业务流程进行等价类划分,设计的测试用例应是业务主流程和流程主分支的最小集,所有的判别分支都能被覆盖,在流程覆盖的同时,完成等价 功能的测试;采用边界值分析法,针对功能说明中的输入输出域,进行边界值和极限值的设计和测试;采用逆向思维方式,结合以往测试经验和直觉设计软件在功能 和流程上可能存在的各种错误,靠经验用错误推测法追加一些测试用例,进行容错性测试;针对程序功能说明有各种输入条件组合的,用因果图和判定表驱动法进行 测试;参数配置类的情况,用正交试验法选择较少组合方式达到最佳效果;功能图法通过不同时期条件的有效性设计数据;对于业务清晰且复杂的系统利用场景法贯 穿整个测试过程。
在本地的虚拟机环境一直凑合着用英文,今天想看看中文的东西都显示乱码,下定决心要把问题解决了。
如果直接打印文本内容,通过putty也会显示乱码。
[ora11g@rac1 ~]$ cat aa.sh
δ? ε??ο?θ?ζ―δ?δ??ζ?θ―
[ora11g@rac1 ~]$
这个时候很可能是putty的编码转换的问题,通过查看putty的设置,如上,可以看到应该选为utf-8。
选为UTF-8以后,重新打印,就没有问题了。
[ora11g@rac1 ~]$ cat aa.sh
第一个问题解决了,第二个问题又来了,来看看
数据库层面的乱码问题。
[ora11g@rac1 ~]$ sqlplus n1/n1
ID NAME
---------- -----------------------------
1 ??????
这个时候看看环境变量NLS_LANG的设置,如果为空,很可能会出问题。
[ora11g@rac1 ~]$ echo $NLS_LANG
[ora11g@rac1 ~]$
简单设置一下,这个最好和数据库层面的字符集要一致。
[ora11g@rac1 ~]$ echo $NLS_LANG
american_america.AL32UTF8
再来查看一下,就没有问题了。
SQL> select *from test;
ID NAME
---------- -----------------------------
1 突破玩法界限
当然了,我的这个问题刚好数据库层面是完全支持的,这样就省去了很多额外的
工作,如果数据库层面的字符集不支持,那很可能就得重建库来改变字符集了。
select *from nls_database_parameters SQL> / PARAMETER VALUE ------------------------------ ---------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET AL32UTF8 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 11.2.0.3.0 |
另外系统层面的乱码,网上查看了一下,有些人建议修改/etc/sysconfig/i18n的设置。
[ora11g@rac1 ~]$ cat /etc/sysconfig/i18*
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
如果修改为中文的,一定要注意设置的值,在我本地做测试,是不需要修改的,本身就支持,我修改的时候,竟然改错了,结果重新登录及报了一大堆的错误,如下:
[ora11g@rac1 caipiao]$ su - ora11g
Password:
-bash: warning: setlocale: LC_CTYPE: cannot change locale (zn_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (zn_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (zn_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (zn_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (zn_CN.UTF-8): No such file or directory
如果修改,应该改为zh_CN,算是一个低级错误。
SQLite 事务(Transaction)
事务(Transaction)是一个对
数据库执行
工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。
事务(Transaction)是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。
实际上,您可以把许多的 SQLite 查询联合成一组,把所有这些放在一起作为事务的一部分进行执行。
1,事务的属性
事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID:
·原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
·一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。
·隔离性(Isolation):使事务操作相互独立和透明。
·持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。
2,事务控制
使用下面的命令来控制事务:
·BEGIN TRANSACTION:开始事务处理。
·COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
·ROLLBACK:回滚所做的更改。
事务控制命令只与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。
3,BEGIN TRANSACTION 命令
事务(Transaction)可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法:
BEGIN;
or
BEGIN TRANSACTION;
4,COMMIT 命令
COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。
COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库。
COMMIT 命令的语法如下:
COMMIT;
or
END TRANSACTION;
5,ROLLBACK 命令
ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。
ROLLBACK 命令只能用于撤销自上次发出 COMMIT 或 ROLLBACK 命令以来的事务。
ROLLBACK 命令的语法如下:
ROLLBACK;
6,实例操作
[root@localhost sqlite-autoconf-3080403]# sqlite3 tim.db
SQLite version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for usage hints.
sqlite> CREATE TABLE COMPANY(ID INT NOT NULL, NAME VARCHAR(20),AGE INT,ADDRESS VARCHAR(20),SALARY DECIMAL(7,2));
现在,让我们开始一个事务,并从表中删除 age = 25 的记录,最后,我们使用 ROLLBACK 命令撤消所有的更改。
先开启事务,然后删除AGE为25的记录,查询COMPANY表,会看到没有这条记录,如下图所示:
再ROLLBACK,再去查询COMPANY表,会看到AGE为25的记录被恢复。
现在开启一个事务,删除AGE为25的记录,再执行COMMIT提交所以的更改,那么就不会再看到已经删除的记录,如下所示:
再ROLLBACK,再去查询COMPANY表,会看到AGE为25的记录被恢复。
现在开启一个事务,删除AGE为25的记录,再执行COMMIT提交所以的更改,那么就不会再看到已经删除的记录,如下所示:
现在常有人“把质量第一”的所谓时髦词语挂在嘴边,左一个认证,右一个活动,仿佛告诉你企业重视质量的决心,已经摆在最优先的项目上了。有个笑话 是:企业在生产现场的产品质量无人把关,看不到管理者,就问上哪了,回答,都去听“质量在我心中”的演讲去了。而我并不认为质量是一个优先项目,而且要特 别说明的是,我不认为质量是一个值得经常考虑的项目。
如果把质量当作一个方案或特别的系统来驱使的话,则很容易因为通过与其它商业活动的优先程度比较而导致错位。这就像在关系里给予爱以优先权一样。而爱,并不是一个与其它活动相竞争的项目,它需要把时间倾注在全部的关系中。
质量不是项目,质量就是符合要求。我们何时才符合要求呢?我们每一次的业务活动都是为某些人获得输出。故而,优先性应给予
工作业务,或它的输 出,或那些输出的使用者。如果某人是位有诚信的人,符合要求(或做你答应要做的事),也就因此成为人们做任何工作时想要得到的东西,无论怎样都应该是优先 的。
质量是从现场中来的,没有深入到现场去,你永远不可能管理好你的质量,当然这里的现场是广义的包括销售现场、设计现场、生产现场等等。很多朋友 都谈到了质量认证和质量活动,我想不管什么样的措施或管理方法,只要确实能提高产品品质,能持续改进质量水平,那么不管是什么方法什么体系什么活动我都认 可,反之我都坚决反对。
时下咨询行业有这样一句行话:“你又搞跨了几家公司”,这是一个现象,当然并不是说咨询师不行,是因为他们没有深入到现场去,不能有针对性的开 展辅助工作,乱开处方,有的企业也是“病急乱投医”认为咨询公司或策划公司能帮他们解决实质性管理问题,当然部分好的咨询师或策划人的确是能帮助企业的, 但是象某些书本咨询师或书本策划人我是不敢苟同。
企业要发展练好内功是关键,不管是品质管理还是其他管理更多的还是依赖于企业自身的管理水平和执行水平,因此所有的企业经营活动或管理方法体系都要踏踏实实的去做,而不是说的,企业是做出来的,不是说出来的也不是想出来的。
* 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
* 分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
*(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
*(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
*(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
*这个题目很明显是要用递归算法来实现的,打印“*”有些技巧,但也很容易解决,程序如下:
import java.util.Scanner; public class Yinshifenjie { public static void fenjie(int n) { for (int i=2;i <=n;i++) { if (i == n) { System.out.print(i); return; } if (n > i && (n % i == 0)) { System.out.print(i+"*"); fenjie(n / i); break; } } } public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个整数:"); int n = input.nextInt(); fenjie(n); } } |
使用vbs脚本启动
QTP并运行
测试,startQTP.vbs
'************************************************************************************************************************ 'Description: ' 'This example opens a test, configures run options and settings, 'runs the test, and then checks the results of the test run. ' 'Assumptions: 'There is no unsaved test currently open in QuickTest. 'For more information, see the example for the Test.SaveAs method. 'When QuickTest opens, it loads the add-ins required for the test. 'For more information, see the example for the Test.GetAssociatedAddins method. '************************************************************************************************************************ Dim qtApp 'As QuickTest.Application ' Declare the Application object variable Dim qtTest 'As QuickTest.Test ' Declare a Test object variable Dim qtResultsOpt 'As QuickTest.RunResultsOptions ' Declare a Run Results Options object variable Set qtApp = CreateObject("QuickTest.Application") ' Create the Application object qtApp.Launch ' Start QuickTest qtApp.Visible = False ' Make the QuickTest application visible ' Set QuickTest run options qtApp.Options.Run.ImageCaptureForTestResults = "OnError" qtApp.Options.Run.RunMode = "Fast" qtApp.Options.Run.ViewResults = False qtApp.Open "D:\NewTest\Scripts\BeforeGlobal\Login", False ' Open the test in read-only mode ' set run settings for the test Set qtTest = qtApp.Test qtTest.Settings.Run.IterationMode = "oneIteration" ' Runs the test only once, using only the first row in the global Data Table 'qtTest.Settings.Run.IterationMode = "rngIterations" ' Run only iterations 2 to 4 'qtTest.Settings.Run.StartIteration = 2 'qtTest.Settings.Run.EndIteration = 4 qtTest.Settings.Run.OnError = "NextStep" ' Instruct QuickTest to perform next step when error occurs qtApp.Test.Settings.Web.BrowserNavigationTimeout = 60000 ' Configure other Web settings Set qtResultsOpt = CreateObject("QuickTest.RunResultsOptions") ' Create the Run Results Options object qtResultsOpt.ResultsLocation = "D:\NewTest\Res1" ' Set the results location qtTest.Run qtResultsOpt ' Run the test 'MsgBox qtTest.LastRunResults.Status ' Check the results of the test run qtTest.Close ' Close the test qtApp.Quit 'Close the QTP Set qtResultsOpt = Nothing ' Release the Run Results Options object Set qtTest = Nothing ' Release the Test object Set qtApp = Nothing ' Release the Application object |