變異
測試是通過改變被測對象的源碼,比較
單元測試用例的結(jié)果,來判斷單元測試用例的質(zhì)量。了解不是很深,只能粗粗介紹,歡迎大家補(bǔ)充。
網(wǎng)上發(fā)現(xiàn)變異測試的資料很少,大多是學(xué)術(shù)論文為主。
變異測試的公主要是mujava與
muclipse,muclipse是基于mujava的,并且集成于eclipse上的插件,官網(wǎng)介紹
mujava http://cs.gmu.edu/~offutt/mujava/
muclipse http://muclipse.sourceforge.net/index.php
根據(jù)官網(wǎng)一步步來,居然沒有成功,逐個(gè)改變參數(shù)摸索,終于能出結(jié)果了,所以寫下這邊
文章,希望減少大家研究的時(shí)間
1. 安裝muclipse
由于官網(wǎng)提供的下載url打不開,只好網(wǎng)上找個(gè)edu.ncsu.muclipse_1.3.0.jar下載,放入eclipse plugins目錄下,重新啟動(dòng)eclipse,就算安裝上啦,eclipse的這種安裝方法真簡單。
2. 準(zhǔn)備的測試案例
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. 配置環(huán)境
1. 新建或者導(dǎo)入項(xiàng)目,下載extendedOJ.jar包,導(dǎo)入到Libraries
右擊project name -> properties ->
java build path -> Libraries -> Add External JARs, select it and click ok
in source tab, 可以修改output folder,就是編譯后的.class文件的地址,這里默認(rèn)是bin
在本節(jié)中,我們將介紹一個(gè)例子,編寫自定義記錄器和
TestNG的方法。要編寫一個(gè)定制的記錄器類,我們的擴(kuò)展類應(yīng)實(shí)現(xiàn)IReporter接口。讓我們繼續(xù)前進(jìn),并創(chuàng)建一個(gè)示例使用自定義的記錄器。
創(chuàng)建一個(gè)
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); } } |
上述測試類的包含三個(gè)測試方法,其中testMethodOne 和 testMethodThree將通過在執(zhí)行時(shí),而testMethodTwo由通過一個(gè)falseBoolean的值A(chǔ)ssert.assertTrue方法,它是用于在測試中的真值條件失敗。
創(chuàng)建自定義報(bào)告類
創(chuàng)建另一個(gè)新的類名為 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()); } } } } |
前面的的類實(shí)現(xiàn)org.testng.IReporter 接口。它實(shí)現(xiàn)了IReporter接口定義的方法GenerateReport。這個(gè)方法有三個(gè)參數(shù):
第一個(gè)是xmlSuite,這是TestNG的測試XML正在執(zhí)行中提到的列表套件
第二個(gè)是套件,其中包含一套測試執(zhí)行后信息,該對象包含了所有的信息包,類,測試方法和測試執(zhí)行結(jié)果。
第三的outputDirectory,報(bào)告將產(chǎn)生的輸出文件夾路徑,其中包含的信息。
創(chuàng)建 testng.xml
創(chuàng)建一個(gè)文件testng.xml 在 C:\ > TestNG_WORKSPACE 來執(zhí)行測試用例
<?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
運(yùn)行 testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
驗(yàn)證輸出
===============================================
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
前面的例子顯示了一個(gè)簡單的自定義報(bào)告器,打印的數(shù)量在控制臺上對每個(gè)套件包含在上述的測試執(zhí)行失敗,通過跳過測試。報(bào)告器主要是用于測試的執(zhí)行,以生成最終的報(bào)告。擴(kuò)展程序可以被用來生成XML,HTML,CHM,CSV或文本格式的文件,根據(jù)報(bào)告要求。
以前曾經(jīng)寫了一篇博文談如何推廣
單元測試,最近有朋友問我如下的問題,因此便又寫了本文,閱讀時(shí)請綜合原來的博文。
問題:
有開發(fā)人員認(rèn)為進(jìn)行單元測試會花費(fèi)大量時(shí)間來編寫
測試用例,因此他們做單元測試的意愿比較低,請問有何好的建議進(jìn)行單元測試的改進(jìn)?
解答:
1、首先應(yīng)該明確單元的含義。單元在面向?qū)ο蟮某绦蛑兄傅氖且粋€(gè)類,在結(jié)構(gòu)化的方法中指的是一個(gè)函數(shù)。
2、其次應(yīng)該明確單元測試的方法。單元測試的常用方法包括:
(1) 靜態(tài)檢查,即采用靜態(tài)代碼檢查的工具對程序進(jìn)行內(nèi)部邏輯的分析,以分析程序中可能的錯(cuò)誤或壞味道。
(2) 動(dòng)態(tài)測試,通過編寫單元測試程序,設(shè)計(jì)單元測試用例,測試每個(gè)函數(shù)或每個(gè)類的邏輯正確性。
3如果一個(gè)類或一個(gè)函數(shù)對其他的類或環(huán)境依賴性很強(qiáng),需要編寫大量的樁程序或驅(qū)動(dòng)程序,那恰恰說明了這個(gè)類或這個(gè)函數(shù)的設(shè)計(jì)有問題,違背了“低耦合”的基本設(shè)計(jì)原則,這也正式
敏捷方法中提倡的“測試驅(qū)動(dòng)開發(fā)”的作用之一。
4、質(zhì)量的投入產(chǎn)出也是一種平衡,需要在單元測試上投入到什么程度首先是公司的一個(gè)管理方針。如果每個(gè)單元都進(jìn)行單元測試則測試代碼的規(guī)模和產(chǎn)品代碼的規(guī)模能夠達(dá)到1:1,也就是說編寫測試代碼的
工作量還是比較大的,但是也要看到單元測試的產(chǎn)出。在單元測試、集成測試、
系統(tǒng)測試中,單元測試是投入產(chǎn)出比最大的測試種類,即單元測試在單位時(shí)間內(nèi)發(fā)現(xiàn)的缺陷個(gè)數(shù)大于集成與系統(tǒng)測試。原則上單元測試的投入最大,找到的缺陷最多,集成測試與系統(tǒng)測試依次遞減。
5、在實(shí)踐中推廣單元測試時(shí)可以采用如下的方法:
(1) 加大靜態(tài)檢查的力度。通過靜態(tài)檢查的工具快速地識別程序中的錯(cuò)誤、警告、壞味道,公司可以規(guī)定對檢查出的哪些警告、壞味道必須進(jìn)行修改,注意如果修改所有的警告、壞味道可能工作量比較大。靜態(tài)檢查是一種投入產(chǎn)出比很高的單元測試方法。在JAVA下可以采用check Style, Source monitor,PMD,F(xiàn)ind Bugs,Jslink等。
(2) 通過測試策略的選擇減少測試程序的工作量。單元測試一般有三種策略:
策略一:自底向上的策略:先測底層的函數(shù)或類,再測上層的函數(shù)或類,此時(shí)只需要編寫驅(qū)動(dòng)程序,不需要編寫樁程序。
策略二:自頂向下的策略:先測上層的函數(shù)或類,再測試底層的函數(shù)類,此時(shí)只需要編寫樁程序,不需要或很少需要編寫驅(qū)動(dòng)程序。
策略三:混合策略:綜合上述的2種策略,需要綜合編寫樁程序與驅(qū)動(dòng)程序。
如果被測的單元需要調(diào)用很多其他的單元,則可以采用自底向上的策略減少驅(qū)動(dòng)程序的編寫量。如果被測的單元需要很多外圍的環(huán)境準(zhǔn)備則可以采用自頂向下的策略。
(3) 在組織級可以規(guī)定執(zhí)行單元測試的時(shí)機(jī),比如:
i)系統(tǒng)中最核心的、最關(guān)鍵的功能模塊;
ii)算法復(fù)雜的功能模塊;
iii)出錯(cuò)最多的功能模塊;
iv)客戶最常使用的功能模塊;
v)復(fù)用的底層代碼
根據(jù)Pareto定律,我們可以選擇少部分代碼執(zhí)行單元測試。
6、單元測試的技術(shù)
(1) XUnit的工具
(2) 生成測試用例時(shí)可以采用如下的方法:
i)單元功能分析
ii)入口參數(shù)等價(jià)類分析
iii)入口參數(shù)邊界分析
iv)全程變量、共享數(shù)據(jù)的等價(jià)類與邊界分析
v)調(diào)用函數(shù)返回值的等價(jià)類與邊界分析
vi)覆蓋率分析
上述的方法要求的嚴(yán)格程度可以循序漸進(jìn),不能的嚴(yán)格程度需要投入的工作量不同。
一、AppScan安裝時(shí)出現(xiàn)錯(cuò)誤1603。
是因?yàn)橹鞍惭b過,沒有卸載干凈導(dǎo)致報(bào)錯(cuò)。解決方法如下:
1、控制面板→程序和功能→選中程序卸載。
2、刪除AppScan安裝路徑以及下面的所有內(nèi)容。
3、在系統(tǒng)[開始]->[運(yùn)行(R)...]中,運(yùn)行命令regedit來刪除全部注冊鍵(如果存在的話),以及下列的子 鍵:
A.HKEY_LOCAL_MACHINE\SOFTWARE\IBM\
Rational AppScan
B.HKEY_CURRENT_USER\Software\IBM\ Rational AppScan
A.點(diǎn)擊系統(tǒng)[開始]->[運(yùn)行(R)...],輸入 %temp%并運(yùn)行
B.當(dāng)文件夾打開后,選擇菜單[編輯]->[全部選定(A)],在選定文件的任何部分右擊鼠標(biāo)并選擇[刪除
(D)](跳過當(dāng)前可能還在使用的文件,盡可能的刪除所有可以刪除的文件)
5、同樣打開APPSCAN_TEMP文件夾:
A.打開后刪除里面所有的內(nèi)容
B.如果發(fā)生下面的錯(cuò)誤,忽略該錯(cuò)誤開始下一步操作
%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自帶的磁盤清理設(shè)置來清理您的電腦:
A.在系統(tǒng)[開始]->[運(yùn)行(R)...]中,輸入命令: cleanmgr/sageset,選擇"臨時(shí)安裝文件","安裝日志
文件","臨時(shí)文件"并取消其他項(xiàng)目的勾選(這樣工具的配置已經(jīng)完成)。
B.在系統(tǒng)[開始]->[運(yùn)行(R)...]中,輸入命令: cleanmgr/sagerun(這樣就啟動(dòng)了清除功能,一般需 要幾分鐘才能完成)。
7、重新啟動(dòng)電腦。
二、AppScan掃描后篡改網(wǎng)站代碼。
在掃描配置→
測試策略→勾選了侵入式,有可能會篡改掉網(wǎng)站的代碼。如果會篡改的話在掃描的時(shí)候去掉這個(gè)勾選即可。(不過這個(gè)就呵呵了,要從代碼上放置被侵入攻擊)
三、AppScan掃描過程中C盤空間不足。
1、建議不要勾選啟用掃描日志,當(dāng)掃描網(wǎng)站過大或掃描時(shí)間過長,隨著日志文件變大會導(dǎo)致系統(tǒng)崩潰。如果已經(jīng)勾選了,可以在工具→選項(xiàng)→啟用掃描日志勾選去掉即可。
2、如果要勾選的話,可以把用戶文件保存到其它硬盤。默認(rèn)的用戶文件是:C:\Documents and Settings\Administrator\My Documents\AppScan;可以修改為其他路徑。該路徑可以在菜單欄中依次選擇工具→選項(xiàng)→一般→文件位置部分修改。
3、如果已經(jīng)把上面的地址都修改到了其他盤,但是在掃描過程中還是發(fā)現(xiàn)C 盤的空間快速被消耗,是因?yàn)楹芏嗯R時(shí)文件都保存在C 盤,AppScan 中有一個(gè)隱藏的參數(shù)APPSCAN_TEMP 來設(shè)置臨時(shí)文件位置。可以通過修改系統(tǒng)變量來修改到其他硬盤空間。臨時(shí)文件位置說明:描述正常操作期間AppScan 將其臨時(shí)文件保存到的位置。缺省情況下,AppScan 將其臨時(shí)文件存儲在以下位置:C:\Documents and Settings\All Users\Application Data\IBM\Rational AppScan\temp如果需要修改此缺省位置,請按照要求編輯環(huán)境變量APPSCAN_TEMP 的路徑。
訪問環(huán)境變量的方法是:右鍵單擊我的電腦,然后依次選擇屬性→高級→環(huán)境變量。
注意:在新位置的路徑中絕不能有任何Unicode字符。
修改AppScan 中的臨時(shí)文件:桌面上鼠標(biāo)右鍵選擇我的電腦→屬性→高級系統(tǒng)設(shè)置→高級→環(huán)境變量,增加一個(gè)新的“用戶環(huán)境變量”,名字是“APPSCAN_TEMP”,設(shè)定路徑,指向您希望保存臨時(shí)文件的目錄。
4、還可以始終暫停掃描稍后再啟動(dòng),當(dāng)然有了前面的方法我想也不需要這樣了。
四、AppScan掃描時(shí)虛擬內(nèi)存不足。
1、一個(gè)小時(shí)保存一次,以免出現(xiàn)故障的時(shí)候之前掃描的結(jié)果白費(fèi)了;在工具→選項(xiàng)→掃描過程中自動(dòng)保存設(shè)置為60分鐘自動(dòng)保存一次。
2、可以在工具→選項(xiàng)→高級搜索PerformanceMonitor.RestartOnOutOfMemory把屬性值改為true。使Rational AppScan當(dāng)內(nèi)存使用量相對過大時(shí)自動(dòng)重新啟動(dòng)。 這樣當(dāng)掃描因?yàn)槭S嗟奶摂M內(nèi)存量過低從而被迫停止時(shí),Rational AppScan會監(jiān)測系統(tǒng)注冊表的設(shè)定來決定是否重新啟動(dòng)。
五、AppScan掃描時(shí)出現(xiàn)通信問題。
1、減小線程數(shù),掃描配置→通信和代理。
2、加大超時(shí)數(shù),掃描配置→通信和代理。
3、服務(wù)器有防火墻,防火墻關(guān)閉之后即可掃描。
六、AppScan打開文件時(shí)提示“文件出現(xiàn)損壞”。
1、先試試這個(gè)、可能是因?yàn)镮ssch和ISUSPM自啟動(dòng)項(xiàng)被禁用了。運(yùn)行“msconfig”看下,如果禁用狀態(tài),開啟為開機(jī)啟動(dòng)即可。
七、AppScan整個(gè)掃描流程簡述。
AppScan 使用步驟:計(jì)劃、執(zhí)行、檢查、分析。
1、在計(jì)劃階段(plan):明確目的,進(jìn)行策略性的選擇和任務(wù)分解
A、明確目的:選擇合適的掃描策略
B、了解對象:首先進(jìn)行探索,了解網(wǎng)站結(jié)構(gòu)和規(guī)模
C、確定策略:進(jìn)行對應(yīng)的配置
D、按照目錄進(jìn)行掃描任務(wù)的分解
E、按照掃描策略進(jìn)行掃描任務(wù)的分解
2、執(zhí)行階段(Do):一邊掃描一遍觀察
A、先爬后掃(繼續(xù)僅測試)
3、檢查階段(Check)
A、檢查和調(diào)整配置(過程中可能會產(chǎn)生一些問題)
4、結(jié)果分析(Analysis)
A、對比結(jié)果
B、匯總結(jié)果(整合和過濾)
Ps.一般掃描的時(shí)候選擇綜合掃描會掃描的全面些。
八、修改后驗(yàn)證。
1、右擊需要驗(yàn)證的問題,點(diǎn)擊重新測試,如果修復(fù)了的話,此問題會消失掉。
2、對于HTML注釋敏感信息泄露驗(yàn)證不掉的問題,可以點(diǎn)擊具體問題然后查看請求/響應(yīng)點(diǎn)擊下一行突出顯示看具體問題,然后在網(wǎng)站相應(yīng)頁面前臺中查看是否已去掉此注釋。
第三方支付平臺的功能和結(jié)構(gòu)特點(diǎn)
在信用方面,第三方支付平臺作為中介,在網(wǎng)上交易的商家和消費(fèi)者之間作一個(gè)信用的中轉(zhuǎn),通過改造支付流程來約束雙方的行為,從而在一定程度上緩解彼此對雙方信用的猜疑,增加對網(wǎng)上購物的可信度。
在技術(shù)層面,第三方支付平臺承擔(dān)安全保障和技術(shù)支持的作用,提供一系列的應(yīng)用接口程序,支持多家銀行的多卡種支付,將多家簽約銀行的支付方式整 合到一個(gè)界面上,負(fù)責(zé)交易結(jié)算中心與銀行的對接。銀行與商家通過接入第三方支付平臺實(shí)現(xiàn)二次結(jié)算,并采用國際先進(jìn)SSL加密模式,在銀行、消費(fèi)者和商家之 間傳輸和存儲資料。第三方支付服務(wù)商所提供的支付系統(tǒng)能夠承載很大的數(shù)據(jù)量、吞吐率,并具有極高的支付成功率。同時(shí)還可以根據(jù)不同用戶的需要,對界面、功 能等進(jìn)行調(diào)整,增加個(gè)性化和人性化的特征。
目前國內(nèi)出現(xiàn)了數(shù)百個(gè)第三方支付平臺,這些平臺的業(yè)務(wù)模式和技術(shù)實(shí)現(xiàn)方法不盡相同,但平臺的結(jié)構(gòu)則具有一個(gè)相似的基本點(diǎn),即第三方支付平臺前端直接面對網(wǎng)上客戶,平臺的后端連接各家商業(yè)銀行,或通過人民銀行的相關(guān)支付系統(tǒng)連接各家商業(yè)銀行。
第三方支付平臺業(yè)務(wù)流分析
根據(jù)電子支付產(chǎn)業(yè)鏈的分析我們看到,第三方支付最初的支付模式只是作為銀行和網(wǎng)上商戶的中介,這就是第三方支付“一般模式”;隨著支付業(yè)務(wù)的發(fā)展,小商戶和網(wǎng)民之間的信用風(fēng)險(xiǎn)導(dǎo)致了“提供擔(dān)保”的支付模式。
第三方支付一般模式的流程:在中國,消費(fèi)者通過第三方網(wǎng)上支付平臺進(jìn)行支付一般必須涉及到發(fā)卡銀行(網(wǎng)銀)、網(wǎng)上商戶和第三方網(wǎng)上支付平臺。一個(gè)典型的消費(fèi)交易,通過第三方網(wǎng)上支付平臺支付的流程圖如下:
第三方支付一般模式流程說明
一般支付流程如下:
a)網(wǎng)上消費(fèi)者瀏覽檢索商戶網(wǎng)頁,并在商戶網(wǎng)站選擇商品、下訂單;
b)商戶網(wǎng)站列出可以選擇的支付網(wǎng)關(guān),消費(fèi)者選擇其一,商戶網(wǎng)站將連接到第三方支付網(wǎng)關(guān)的支付頁面;
c)網(wǎng)上消費(fèi)者在第三方支付平臺的支付頁面,選擇相應(yīng)的銀行、卡種;
d)第三方支付平臺將網(wǎng)上消費(fèi)者的支付信息,按照各銀行支付網(wǎng)關(guān)的技術(shù)要求,傳遞到各相關(guān)銀行,進(jìn)入銀行支付頁面;
e)銀行(銀聯(lián))提供輸入卡號、金額、密碼等關(guān)鍵信息的安全頁面;網(wǎng)上銀行轉(zhuǎn)發(fā)給銀行賬務(wù)系統(tǒng),由相關(guān)銀行(銀聯(lián))檢查相應(yīng)賬戶(網(wǎng)上消費(fèi)者)的支付能力,實(shí)行凍結(jié)、扣賬或劃賬,并將賬務(wù)系統(tǒng)的處理結(jié)果返回給網(wǎng)上消費(fèi)者本身和第三方支付平臺;
f)第三方支付平臺將支付結(jié)果轉(zhuǎn)發(fā)給網(wǎng)上商戶;
g)網(wǎng)上商戶確認(rèn)收到成功支付應(yīng)答的,向網(wǎng)上消費(fèi)者發(fā)貨或提供服務(wù);
h)第三方平臺根據(jù)協(xié)議于第二天或約定的周期向商戶支付扣除手續(xù)費(fèi)后的資金;第三方平臺為網(wǎng)上商戶提供差錯(cuò)交易處理的服務(wù);
i)第三方平臺作為商戶與網(wǎng)上銀行對帳,核對資金、核對;第三方平臺代表網(wǎng)上商戶與網(wǎng)上銀行處理差錯(cuò)交易。
從整個(gè)過程上來看,多家銀行和簽約商家通過支付網(wǎng)關(guān)連成通道,消費(fèi)者通過第三方支付平臺付款給商家,通過第三方支付為商家提供一個(gè)可以兼容多銀行支方式的接口平臺。
第三方支付擔(dān)保模式的流程:第三方支付擔(dān)保模式,也稱為信用中介型模式。該種運(yùn)營模式,基本是由大型的電子交易平臺獨(dú)立開發(fā)或與其他投資人共同 開發(fā),憑借運(yùn)營商的實(shí)力和信譽(yù)與各大銀行合作,同時(shí)能夠?yàn)橘I賣雙方提供中間擔(dān)保的第三方支付運(yùn)營模式。這種模式的運(yùn)營商主要是借助電子交易平臺和中間擔(dān)保 支付平臺與用戶開展業(yè)務(wù),在交易過中采用充當(dāng)信用中介的模式,保證交易的正常進(jìn)行。
以支付寶模式流程為例,其具體運(yùn)行流程是:
支付寶模式流程說明
以支付寶支付模式為例,其具體運(yùn)行流程是:
a)買家確定購買之后從支付寶的個(gè)人賬戶中劃撥出來,保留在支付寶監(jiān)管賬戶中;事先用戶應(yīng)當(dāng)保證賬戶中有足夠的資金;如果余額不足,支付寶會自動(dòng)跳轉(zhuǎn)到充值頁面,讓客戶通過網(wǎng)銀充值;
b)支付寶扣賬成功后,通知賣家發(fā)貨;
c)賣家通過其配送渠道向買家發(fā)貨;
d)待買方收到商品并確認(rèn)無誤后,通知支付寶收到貨物;
e)支付寶將監(jiān)管賬戶中資金劃撥到賣家在支付寶的賬戶中。
支付寶作為代收代付的中介,主要是為了維護(hù)網(wǎng)絡(luò)交易的安全性。
在網(wǎng)上交易中, 客戶在商家網(wǎng)站下訂單后,先把貨款付給大家都信任的第三方中介機(jī)構(gòu),在商家知道貨款己到第三方中介機(jī)構(gòu)后把貨物發(fā)送給客戶。如果客戶對貨物滿意,貨款就通過第三方中介機(jī)構(gòu)付給商家;如果不滿意,客戶把貨物返回給商家,并從第三方中介機(jī)構(gòu)處取回貨款。
第三方支付平臺測試方法
從上述的兩種支付流程來看,作為網(wǎng)絡(luò)交易的主要支付渠道,第三方網(wǎng)上支付平臺在發(fā)卡銀行、網(wǎng)上商戶間提供了接口平臺,在電子支付產(chǎn)業(yè)鏈中起到重 要的中介作用。面對這樣的電子化信息系統(tǒng)及其網(wǎng)絡(luò)交易中可能存在的風(fēng)險(xiǎn),我們不得不實(shí)時(shí)地關(guān)注:第三方支付業(yè)務(wù)的流程是否能夠正確實(shí)現(xiàn)、功能是否正確、網(wǎng) 上大量客戶的并發(fā)交易會不會導(dǎo)致支付系統(tǒng)崩潰、支付系統(tǒng)的不穩(wěn)定或者互聯(lián)網(wǎng)誠信體系的不健全會不會影響網(wǎng)上購物和交易等等問題。
目前亟待解決的問題就集中在;如何通過有效地方法和策略以驗(yàn)證第三方支付系統(tǒng)的功能是否正確實(shí)現(xiàn),是否會造成網(wǎng)絡(luò)擁堵及如何通過現(xiàn)有的網(wǎng)絡(luò)技術(shù) 如Internet Web、數(shù)據(jù)加密、防火墻技術(shù)、各種交易協(xié)議、客戶端瀏覽技術(shù)和軟件等,使得客戶和商家能透明安全地進(jìn)行交易等。因此,為了防范第三方支付系統(tǒng)的交易風(fēng) 險(xiǎn),保障系統(tǒng)的穩(wěn)定運(yùn)行,必須考慮采取強(qiáng)有力的措施加以管理和控制,積極地引入軟件測試,強(qiáng)化系統(tǒng)質(zhì)量測試和安全評估,為網(wǎng)絡(luò)交易支付系統(tǒng)提供可靠地服務(wù) 保證。
根據(jù)支付系統(tǒng)的業(yè)務(wù)流程和發(fā)展需要,下面從系統(tǒng)的測試重點(diǎn)出發(fā),主要討論第三方支付系統(tǒng)的功能、性能及安全性的測試方法。
功能測試方法
在對第三方支付平臺實(shí)施測試過程中,應(yīng)采用黑盒測試策略,使用等價(jià)類劃分、邊界值分析、因果圖法、判定表法、正交試驗(yàn)法、功能圖法等測試用例設(shè) 計(jì)方法的原理與實(shí)現(xiàn),分別對第三方支付系統(tǒng)的功能、第三方賬戶和交易風(fēng)險(xiǎn)監(jiān)控、系統(tǒng)性能及安全性等測試指標(biāo)項(xiàng)進(jìn)行測試。黑盒測試法應(yīng)制訂覆蓋全部功能模塊 的測試用例,通過執(zhí)行測試用例以實(shí)現(xiàn)系統(tǒng)功能、業(yè)務(wù)流程和其它質(zhì)量特性的測試。
針對第三方支付平臺的業(yè)務(wù)功能,如“會員管理、賬戶管理、中間賬戶資金管理、差錯(cuò)處理、資金結(jié)算、對賬處理、統(tǒng)計(jì)報(bào)表”等等,應(yīng)綜合應(yīng)用各類測 試設(shè)計(jì)方法:首先對業(yè)務(wù)流程進(jìn)行等價(jià)類劃分,設(shè)計(jì)的測試用例應(yīng)是業(yè)務(wù)主流程和流程主分支的最小集,所有的判別分支都能被覆蓋,在流程覆蓋的同時(shí),完成等價(jià) 功能的測試;采用邊界值分析法,針對功能說明中的輸入輸出域,進(jìn)行邊界值和極限值的設(shè)計(jì)和測試;采用逆向思維方式,結(jié)合以往測試經(jīng)驗(yàn)和直覺設(shè)計(jì)軟件在功能 和流程上可能存在的各種錯(cuò)誤,靠經(jīng)驗(yàn)用錯(cuò)誤推測法追加一些測試用例,進(jìn)行容錯(cuò)性測試;針對程序功能說明有各種輸入條件組合的,用因果圖和判定表驅(qū)動(dòng)法進(jìn)行 測試;參數(shù)配置類的情況,用正交試驗(yàn)法選擇較少組合方式達(dá)到最佳效果;功能圖法通過不同時(shí)期條件的有效性設(shè)計(jì)數(shù)據(jù);對于業(yè)務(wù)清晰且復(fù)雜的系統(tǒng)利用場景法貫 穿整個(gè)測試過程。
在本地的虛擬機(jī)環(huán)境一直湊合著用英文,今天想看看中文的東西都顯示亂碼,下定決心要把問題解決了。
如果直接打印文本內(nèi)容,通過putty也會顯示亂碼。
[ora11g@rac1 ~]$ cat aa.sh
δ? ε??ο?θ?ζ―δ?δ??ζ?θ―
[ora11g@rac1 ~]$
這個(gè)時(shí)候很可能是putty的編碼轉(zhuǎn)換的問題,通過查看putty的設(shè)置,如上,可以看到應(yīng)該選為utf-8。
選為UTF-8以后,重新打印,就沒有問題了。
[ora11g@rac1 ~]$ cat aa.sh
[ora11g@rac1 ~]$ sqlplus n1/n1
ID NAME
---------- -----------------------------
1 ??????
這個(gè)時(shí)候看看環(huán)境變量NLS_LANG的設(shè)置,如果為空,很可能會出問題。
[ora11g@rac1 ~]$ echo $NLS_LANG
[ora11g@rac1 ~]$
簡單設(shè)置一下,這個(gè)最好和數(shù)據(jù)庫層面的字符集要一致。
[ora11g@rac1 ~]$ echo $NLS_LANG
american_america.AL32UTF8
再來查看一下,就沒有問題了。
SQL> select *from test;
ID NAME
---------- -----------------------------
1 突破玩法界限
當(dāng)然了,我的這個(gè)問題剛好數(shù)據(jù)庫層面是完全支持的,這樣就省去了很多額外的
工作,如果數(shù)據(jù)庫層面的字符集不支持,那很可能就得重建庫來改變字符集了。
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 |
另外系統(tǒng)層面的亂碼,網(wǎng)上查看了一下,有些人建議修改/etc/sysconfig/i18n的設(shè)置。
[ora11g@rac1 ~]$ cat /etc/sysconfig/i18*
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
如果修改為中文的,一定要注意設(shè)置的值,在我本地做測試,是不需要修改的,本身就支持,我修改的時(shí)候,竟然改錯(cuò)了,結(jié)果重新登錄及報(bào)了一大堆的錯(cuò)誤,如下:
[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
如果修改,應(yīng)該改為zh_CN,算是一個(gè)低級錯(cuò)誤。
SQLite 事務(wù)(Transaction)
事務(wù)(Transaction)是一個(gè)對
數(shù)據(jù)庫執(zhí)行
工作單元。事務(wù)(Transaction)是以邏輯順序完成的工作單位或序列,可以是由用戶手動(dòng)操作完成,也可以是由某種數(shù)據(jù)庫程序自動(dòng)完成。
事務(wù)(Transaction)是指一個(gè)或多個(gè)更改數(shù)據(jù)庫的擴(kuò)展。例如,如果您正在創(chuàng)建一個(gè)記錄或者更新一個(gè)記錄或者從表中刪除一個(gè)記錄,那么您正在該表上執(zhí)行事務(wù)。重要的是要控制事務(wù)以確保數(shù)據(jù)的完整性和處理數(shù)據(jù)庫錯(cuò)誤。
實(shí)際上,您可以把許多的 SQLite 查詢聯(lián)合成一組,把所有這些放在一起作為事務(wù)的一部分進(jìn)行執(zhí)行。
1,事務(wù)的屬性
事務(wù)(Transaction)具有以下四個(gè)標(biāo)準(zhǔn)屬性,通常根據(jù)首字母縮寫為 ACID:
·原子性(Atomicity):確保工作單位內(nèi)的所有操作都成功完成,否則,事務(wù)會在出現(xiàn)故障時(shí)終止,之前的操作也會回滾到以前的狀態(tài)。
·一致性(Consistency):確保數(shù)據(jù)庫在成功提交的事務(wù)上正確地改變狀態(tài)。
·隔離性(Isolation):使事務(wù)操作相互獨(dú)立和透明。
·持久性(Durability):確保已提交事務(wù)的結(jié)果或效果在系統(tǒng)發(fā)生故障的情況下仍然存在。
2,事務(wù)控制
使用下面的命令來控制事務(wù):
·BEGIN TRANSACTION:開始事務(wù)處理。
·COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
·ROLLBACK:回滾所做的更改。
事務(wù)控制命令只與 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他們不能在創(chuàng)建表或刪除表時(shí)使用,因?yàn)檫@些操作在數(shù)據(jù)庫中是自動(dòng)提交的。
3,BEGIN TRANSACTION 命令
事務(wù)(Transaction)可以使用 BEGIN TRANSACTION 命令或簡單的 BEGIN 命令來啟動(dòng)。此類事務(wù)通常會持續(xù)執(zhí)行下去,直到遇到下一個(gè) COMMIT 或 ROLLBACK 命令。不過在數(shù)據(jù)庫關(guān)閉或發(fā)生錯(cuò)誤時(shí),事務(wù)處理也會回滾。以下是啟動(dòng)一個(gè)事務(wù)的簡單語法:
BEGIN;
or
BEGIN TRANSACTION;
4,COMMIT 命令
COMMIT 命令是用于把事務(wù)調(diào)用的更改保存到數(shù)據(jù)庫中的事務(wù)命令。
COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以來的所有事務(wù)保存到數(shù)據(jù)庫。
COMMIT 命令的語法如下:
COMMIT;
or
END TRANSACTION;
5,ROLLBACK 命令
ROLLBACK 命令是用于撤消尚未保存到數(shù)據(jù)庫的事務(wù)的事務(wù)命令。
ROLLBACK 命令只能用于撤銷自上次發(fā)出 COMMIT 或 ROLLBACK 命令以來的事務(wù)。
ROLLBACK 命令的語法如下:
ROLLBACK;
6,實(shí)例操作
[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));
現(xiàn)在,讓我們開始一個(gè)事務(wù),并從表中刪除 age = 25 的記錄,最后,我們使用 ROLLBACK 命令撤消所有的更改。
先開啟事務(wù),然后刪除AGE為25的記錄,查詢COMPANY表,會看到?jīng)]有這條記錄,如下圖所示:
再ROLLBACK,再去查詢COMPANY表,會看到AGE為25的記錄被恢復(fù)。
現(xiàn)在開啟一個(gè)事務(wù),刪除AGE為25的記錄,再執(zhí)行COMMIT提交所以的更改,那么就不會再看到已經(jīng)刪除的記錄,如下所示:
再ROLLBACK,再去查詢COMPANY表,會看到AGE為25的記錄被恢復(fù)。
現(xiàn)在開啟一個(gè)事務(wù),刪除AGE為25的記錄,再執(zhí)行COMMIT提交所以的更改,那么就不會再看到已經(jīng)刪除的記錄,如下所示:
現(xiàn)在常有人“把質(zhì)量第一”的所謂時(shí)髦詞語掛在嘴邊,左一個(gè)認(rèn)證,右一個(gè)活動(dòng),仿佛告訴你企業(yè)重視質(zhì)量的決心,已經(jīng)擺在最優(yōu)先的項(xiàng)目上了。有個(gè)笑話 是:企業(yè)在生產(chǎn)現(xiàn)場的產(chǎn)品質(zhì)量無人把關(guān),看不到管理者,就問上哪了,回答,都去聽“質(zhì)量在我心中”的演講去了。而我并不認(rèn)為質(zhì)量是一個(gè)優(yōu)先項(xiàng)目,而且要特 別說明的是,我不認(rèn)為質(zhì)量是一個(gè)值得經(jīng)常考慮的項(xiàng)目。
如果把質(zhì)量當(dāng)作一個(gè)方案或特別的系統(tǒng)來驅(qū)使的話,則很容易因?yàn)橥ㄟ^與其它商業(yè)活動(dòng)的優(yōu)先程度比較而導(dǎo)致錯(cuò)位。這就像在關(guān)系里給予愛以優(yōu)先權(quán)一樣。而愛,并不是一個(gè)與其它活動(dòng)相競爭的項(xiàng)目,它需要把時(shí)間傾注在全部的關(guān)系中。
質(zhì)量不是項(xiàng)目,質(zhì)量就是符合要求。我們何時(shí)才符合要求呢?我們每一次的業(yè)務(wù)活動(dòng)都是為某些人獲得輸出。故而,優(yōu)先性應(yīng)給予
工作業(yè)務(wù),或它的輸 出,或那些輸出的使用者。如果某人是位有誠信的人,符合要求(或做你答應(yīng)要做的事),也就因此成為人們做任何工作時(shí)想要得到的東西,無論怎樣都應(yīng)該是優(yōu)先 的。
質(zhì)量是從現(xiàn)場中來的,沒有深入到現(xiàn)場去,你永遠(yuǎn)不可能管理好你的質(zhì)量,當(dāng)然這里的現(xiàn)場是廣義的包括銷售現(xiàn)場、設(shè)計(jì)現(xiàn)場、生產(chǎn)現(xiàn)場等等。很多朋友 都談到了質(zhì)量認(rèn)證和質(zhì)量活動(dòng),我想不管什么樣的措施或管理方法,只要確實(shí)能提高產(chǎn)品品質(zhì),能持續(xù)改進(jìn)質(zhì)量水平,那么不管是什么方法什么體系什么活動(dòng)我都認(rèn) 可,反之我都堅(jiān)決反對。
時(shí)下咨詢行業(yè)有這樣一句行話:“你又搞跨了幾家公司”,這是一個(gè)現(xiàn)象,當(dāng)然并不是說咨詢師不行,是因?yàn)樗麄儧]有深入到現(xiàn)場去,不能有針對性的開 展輔助工作,亂開處方,有的企業(yè)也是“病急亂投醫(yī)”認(rèn)為咨詢公司或策劃公司能幫他們解決實(shí)質(zhì)性管理問題,當(dāng)然部分好的咨詢師或策劃人的確是能幫助企業(yè)的, 但是象某些書本咨詢師或書本策劃人我是不敢茍同。
企業(yè)要發(fā)展練好內(nèi)功是關(guān)鍵,不管是品質(zhì)管理還是其他管理更多的還是依賴于企業(yè)自身的管理水平和執(zhí)行水平,因此所有的企業(yè)經(jīng)營活動(dòng)或管理方法體系都要踏踏實(shí)實(shí)的去做,而不是說的,企業(yè)是做出來的,不是說出來的也不是想出來的。
* 題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5。
* 分析:對n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按下述步驟完成:
*(1)如果這個(gè)質(zhì)數(shù)恰等于n,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可。
*(2)如果n>k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)你n,重復(fù)執(zhí)行第一步。
*(3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
*這個(gè)題目很明顯是要用遞歸算法來實(shí)現(xiàn)的,打印“*”有些技巧,但也很容易解決,程序如下:
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("請輸入一個(gè)整數(shù):"); int n = input.nextInt(); fenjie(n); } } |
使用vbs腳本啟動(dòng)
QTP并運(yùn)行
測試,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 |