測試用例是
軟件測試的基礎(chǔ),是測試人員和開發(fā)團隊其他成員深入了解產(chǎn)品開發(fā)需求的介質(zhì)之一,也是產(chǎn)品質(zhì)量的保障。因此合理設(shè)計測試用例不僅有助于掌握客戶的產(chǎn)品真實需求,使得研發(fā)團隊所有人員對需求的理解處于同一平面上,也確保產(chǎn)品在整個動態(tài)的研發(fā)過程中,始終符合用例的設(shè)計,實現(xiàn)用戶最終期望的功能。
在傳統(tǒng)開發(fā)模式中,需求分析往往占用較長時間,分析階段由核心的開發(fā)人員和測試人員參與。在進入研發(fā)階段后,將需求傳遞給其他開發(fā)和測試人員,測試人員根據(jù)需要在設(shè)計完測試用例和開發(fā)完成以后,進行各種類型的測試。這樣的結(jié)果往往由于測試人員沒有參與最初的需求討論,因此對需求的理解存在一定偏差,很多用例的編寫基于測試人員的假設(shè)。而且因為開發(fā)周期較長,最終交付的功能已經(jīng)發(fā)生改變。
在
敏捷開發(fā)模式中,測試人員和開發(fā)人員的節(jié)奏是同步的,即開發(fā)人員增量地開發(fā)功能的同時或甚至之前,測試人員也增量地設(shè)計相應(yīng)的測試用例,等功能完成后馬上可以對功能性測試。對于還未開始開發(fā)或者需求暫不明確的功能,不進行測試用例的深度分析
工作。這樣就能把更多的精力投入到最重要功能上去。
功能性測試用例和需求的關(guān)聯(lián)
在
敏捷測試中,需求一般以用戶故事的形式存在,是將用戶的需求用實例或者故事的方式記錄到待辦事項列表中(backlog)。 測試用例和用戶故事之間是緊密關(guān)聯(lián)的,在產(chǎn)品經(jīng)理(PO)設(shè)計、解釋完成用戶故事后,測試人員根據(jù)用戶故事設(shè)計測試用例。測試用例可以是對用戶故事驗收標準的細分,也可以把多個用戶故事進行串聯(lián)形成一個用例,這取決于用戶故事和測試用例設(shè)計的粒度大小。由于用戶故事會隨著需求的細化和拆分,因此很難對用戶故事和測試用例做一一對應(yīng),而且后期維護成本較高,因此需要在用戶故事和測試用例中增加模塊屬性,來管理測試用例和用戶故事之間的關(guān)聯(lián)關(guān)系。而且兩者應(yīng)該在一個統(tǒng)一平臺進行維護和更新。
非功能性測試用例和需求的關(guān)聯(lián)
對于非功能性的測試用例,往往并不關(guān)聯(lián)具體功能模塊,但是會有對應(yīng)的用戶故事,例如:性能需求,安全需求等,建立這類測試的測試用例的時候,可以通過建立性能模塊,安全模塊等并不存在的模塊,和其他用例等同處理。
單元/組件測試用例的關(guān)聯(lián)
敏捷
軟件開發(fā)的其中一個非常有用的實踐是測試驅(qū)動開發(fā),這需要開發(fā)人員編寫
單元測試,在單元測試過程中,對于復(fù)雜邏輯的函數(shù)或者組件,也需要設(shè)計單元測試用例。這些測試用例本身不以實際文檔的形式存在用例庫中,往往和測試人員一起討論并參考測試人員設(shè)計的測試用例來進行編寫簽入到單元測試中。因此做測試用例個數(shù)統(tǒng)計時,需要包括單元/組件測試測試用例數(shù)量,或者為單元測試/組件測試單獨設(shè)立統(tǒng)計指標。同時沒有特別必要和模塊或者用戶故事做關(guān)聯(lián)。
11-3URLTestDemo
1、File -> New -> Project
在左邊模板中選擇Visual C#里的Web,對應(yīng)到的項目類型選擇ASP.NET MVC3 Web Application,并給項目取名字為11-3URLTestDemo,默認的解決方案名自動為相應(yīng)的11-3URLTestDemo。
2、在解決方案管理器中,鼠標右擊解決方案名字Solution’ 11-3URLTestDemo’,選擇Add -> New Project,如下圖。
打開“Add New Project”對話框后,在左邊的模板選擇Visual C#里的
Test,對應(yīng)的項目類型選擇Test Project,并取名字為URLTestDemo.UnitTests,如下圖。
創(chuàng)建好項目后,可以將不用的Class1.cs文件和URLTestDemo.UnitTests項目中的UnitTest1.cs文件刪除掉。
3、給URLTestDemo.UnitTests項目添加Moq程序包和對項目11-3URLTestDemo的依賴。
在URLTestDemo.UnitTests項目名上右擊鼠標,選擇Manage NuGet Packages…,在打開的對話框中在線搜索Moq,并安裝。再次在URLTestDemo.UnitTests項目名上右擊鼠標,選擇Add Reference,在打開的對話框中選擇對項目11-3URLTestDemo的依賴。
Linux內(nèi)置支持keepalive機制,為了使用它,你需要使能TCP/IP網(wǎng)絡(luò),為了能夠配置內(nèi)核在運行時的參數(shù),你還需要procfs和sysctl的支持。
這個過程涉及到keepalive使用的三個用戶驅(qū)使的變量:
tcp_keepalive_time:表示的是最近一次數(shù)據(jù)包(簡單的不含數(shù)據(jù)的ACKs包)發(fā)送與第一次keepalive探針發(fā)送之間的時間間隔;當(dāng)連接被標記為keepalive之后,這個計數(shù)器就不會再使用。
tcp_keepalive_intvl:表示的是并發(fā)keepalive探針之間的時間間隔。
tcp_keepalive_probes:在確定連接已經(jīng)斷開并且通知應(yīng)用層之前所發(fā)送的沒有得到回復(fù)的探針數(shù)。
對于這三個參數(shù)可以在Linux系統(tǒng)的終端中查看和修改它們的缺省值:
查看三個參數(shù)的值:
[root@Server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 [root@Server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 [root@Server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_probes 9 |
通過命令對這三個參數(shù)值進行修改(圖中將三個參數(shù)值分別設(shè)為:600、60、20):
[root@Server3 ~]# echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
[root@Server3 ~]# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
[root@Server3 ~]# echo 6 > /proc/sys/net/ipv4/tcp_keepalive_probes
這種方式重置三個參數(shù)值,在系統(tǒng)重啟后三個參數(shù)的值又會恢復(fù)到默認值,具體如何讓系統(tǒng)永遠記住自己設(shè)置的值,可參考其他資料,我們現(xiàn)在關(guān)系的是如何在程序中使用keepalive機制并設(shè)置這三個參數(shù)的值。
在程序中使用keepalive機制
想在程序中使用這種機制,只需要使用setsockopt()函數(shù)。
setsockopt()函數(shù)用于任意類型、任意狀態(tài)套接口的設(shè)置選項值。盡管在不同協(xié)議層上存在選項,但本函數(shù)僅定義了最高的“套接口”層次上的選項。選項影響套接口的操作,諸如加急數(shù)據(jù)是否在普通數(shù)據(jù)流中接收,廣播數(shù)據(jù)是否可以從套接口發(fā)送等等。
下面為setsockopt()函數(shù)的原型:
#include <sys/types.h>
#include <sys/socket.h>
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
參數(shù):
sock:將要被設(shè)置或者獲取選項的套接字。
level:選項所在的協(xié)議層。
optname:需要訪問的選項名。
optval:對于getsockopt(),指向返回選項值的緩沖。對于setsockopt(),指向包含新選項值的緩沖。
optlen:對于getsockopt(),作為入口參數(shù)時,選項值的最大長度。作為出口參數(shù)時,選項值的實際長度。對于setsockopt(),現(xiàn)選項的長度。
為了使用函數(shù)setsockopt()將某個特定的套接字的keepalive機制打開,參數(shù)s是一個socket文件描述符,必須要在這之前使用socket()函數(shù)進行創(chuàng)建;參數(shù)level必須設(shè)置為SOL_SOCKET;第三個參數(shù)必須設(shè)置為SO_KEEPALIVE;optval參數(shù)必須是一個布爾型整型變量,表示想要使能這個選項;最后一個參數(shù)表示第四個參數(shù)的大小。
程序?qū)崿F(xiàn)心跳包檢測機制
首先要在備份機和源機之間建立一個專門的socket鏈路來進行心跳檢測。
在源機端,在進行數(shù)據(jù)遷移之前,會建立一個socket來監(jiān)聽備份機的連接,并將這個socket和對應(yīng)的處理函數(shù)放入原軟件的io處理列表中,代碼如下:
int listenfd; struct sockaddr_in server_sin; /* establish socket */ listenfd=socket(AF_INET,SOCK_STREAM,0); server_sin.sin_family=AF_INET; server_sin.sin_addr.s_addr=htonl(INADDR_ANY); server_sin.sin_port=htons(PORT); bind(listenfd,(struct sockaddr *)&server_sin,sizeof(server_sin)); /* establish end */ listen(listenfd,1024); qemu_set_fd_handler2(listenfd, NULL, tcpkeepalive_server, NULL, (void *)(intptr_t)listenfd); 該socket對應(yīng)的處理函數(shù)如下: static void tcpkeepalive_server(void *opaque) { int connfd; struct sockaddr_in client_sin; socklen_t client_len=sizeof(client_sin); int listenfd = (intptr_t)opaque; connfd=accept(listenfd,(struct sockaddr *)&client_sin,&client_len); } |
在備份機端,當(dāng)其開始作為備份機時,會建立socket連接源機的監(jiān)聽端,并設(shè)置對應(yīng)的tcpkeepalive參數(shù),然后將socket和對應(yīng)的處理函數(shù)加入io處理列表。
我們建立的socket是一個心跳檢測專用鏈路,其上不會有數(shù)據(jù)流動,只有一種情況備份機端會收到數(shù)據(jù),那就是源端出現(xiàn)了故障,tcpkeepalive機制會返回一個錯誤信息,所以捕捉到了這個信息,備份機就會跳轉(zhuǎn)到對應(yīng)的處理函數(shù),接替源機開始運行。
對應(yīng)代碼如下:
int sockfd; struct sockaddr_in sin; int optval; socklen_t optlen = sizeof(optval); sockfd=socket(AF_INET,SOCK_STREAM,0); sin.sin_family=AF_INET; sin.sin_addr.s_addr=addr.sin_addr.s_addr; sin.sin_port=htons(PORT); optval = 1; setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen); optval = 5; setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &optval, optlen); optval = 1; setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, &optval, optlen); optval = 1; setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, &optval, optlen); connect(sockfd,(struct sockaddr *)&sin,sizeof(sin)); qemu_set_fd_handler2(sockfd, NULL, tcpkeepalive_vm_start, NULL, (void *)(intptr_t)sockfd); |
該socket對應(yīng)的處理函數(shù)很簡單,就是讓備份機開始運行:
static void tcpkeepalive_vm_start(void *opaque)
{
vm_start();
}
寫了一個簡單的
JAVA類,定時從一個ORACLE數(shù)據(jù)庫取數(shù)據(jù)放到另一個mysql數(shù)據(jù)庫中,寫了一個腳本如下:
set classpath=.;%classpath%;./classes12.jar;./mysql-connector-java-5.1.6-bin.jar;E:\workfile\SAP-to-MYSQL\getsapdata.class set path=%path%;D:\develop\Java\jdk1.6\bin set JAVA_HOME=D:\develop\Java\jdk1.6 cd E:\workfile\SAP-to-MYSQL java getsapdata >>getsapdata.log |
手動執(zhí)行的時候完全沒有問題,當(dāng)時加到windows計劃任務(wù)里就是執(zhí)行不成功,程序執(zhí)行的DOS窗口一閃而過,也看不到是什么錯誤,網(wǎng)上搜了半天,也沒找到可行的答案,后來在腳本里加入了延遲語句 ping -n 5 127.1>nul,才看到報的是找不到類的錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: getsapdata Caused by: java.lang.ClassNotFoundException: getsapdata at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301 at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: getsapdata. Program will exit. |
明明就在這個目錄下,怎么就找不到呢,迷惑,又是一陣搜索,還是沒答案,想著難道windows定時任務(wù)挑分區(qū)嗎,就把程序挪到C盤,結(jié)果計劃任務(wù)真的執(zhí)行成功了,那是怎么回事呢,想想找不到類怎么也應(yīng)該是環(huán)境變量路徑類的問題吧,后來想到我以前經(jīng)常用DOS窗口敲命令,打開DOS窗口默認在C盤,而我的應(yīng)用一般都在其他分區(qū),所以每次敲命令比如:cd e:\work\shell,運行完后當(dāng)前路徑并沒有改變,必須再敲一下e:,才進入到e:\work\shell目錄,會不會是windows計劃任務(wù)開啟DOS執(zhí)行窗口也是默認在C盤,我雖然在腳本里加了 cd E:\workfile\SAP-to-MYSQL命令,但實際上系統(tǒng)的當(dāng)前路徑還是會在默認的C:\Users\Administrator 目錄下,我的程序
移動到C盤的時候,因為系統(tǒng)默認路徑也在C盤,所以 cd 命令是成功進入了c盤的我的應(yīng)用程序目錄,但不是C盤的就不行了,網(wǎng)上查了下,原來cd 的時候加個 /d 參數(shù)可以直接改變盤符,哎,以前居然一致沒用過,把腳本中的 cd 命令改為 cd /d E:\workfile\SAP-to-MYSQL 后,再次執(zhí)行計劃任務(wù)則執(zhí)行成功。
具體步驟:
1、在server.xml中設(shè)置數(shù)據(jù)源,以sql server 2008數(shù)據(jù)庫為例,如下: 在<GlobalNamingResources> </GlobalNamingResources>節(jié)點中加入,
<Resource name="jdbc/DBPool" type="javax.sql.DataSource" password="aaaaaa" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxIdle="2" maxWait="5000" username="sa" url="jdbc:sqlserver://localhost:1433;DataBaseName=COFFEE" maxActive="4"/> |
屬性說明:name,數(shù)據(jù)源名稱,通常取”jdbc/XXX”的格式;
type,”javax.sql.DataSource”;
password,數(shù)據(jù)庫用戶密碼;
driveClassName,數(shù)據(jù)庫驅(qū)動;
maxIdle,最大空閑數(shù),數(shù)據(jù)庫連接的最大空閑時間。超過空閑時間,數(shù)據(jù)庫連接將被標記為不可用,然后被釋放。設(shè)為0表示無限制。
MaxActive,連接池的最大數(shù)據(jù)庫連接數(shù)。設(shè)為0表示無限制。
maxWait ,最大建立連接等待時間。如果超過此時間將接到異常。設(shè)為-1表示無限制。
2、在你的web應(yīng)用程序的web.xml中設(shè)置數(shù)據(jù)源參考,如下: 在<web-app></web-app>節(jié)點中加入,
<resource-ref> <description>DB Connection Pool</description> <res-ref-name>jdbc/DBPool</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> |
子節(jié)點說明: description,描述信息;
res-ref-name,參考數(shù)據(jù)源名字,同上一步的屬性name;
res-type,資源類型,”javax.sql.DataSource”;
res-auth,”Container”;
res-sharing-scope,”Shareable”;3、在tomcat目錄下的context.xml中設(shè)置數(shù)據(jù)源鏈接,如下:
在<Context></Context>中加入:
<ResourceLink name="jdbc/DBPool" type="javax.sql.DataSource" global="jdbc/DBPool"/> |
屬性說明:name,同第2步和第3步的屬性name值,和子節(jié)點res-ref-name值;
type,同樣取”javax.sql.DataSource”;
global,同name值。
4、測試:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class Test { private static DataSource pool; public static void main(String[] args) { Context env = null; try { env = (Context) new InitialContext().lookup("java:comp/env"); pool = (DataSource)env.lookup("jdbc/DBPool"); if(pool==null) System.err.println("'DBPool' is an unknown DataSource"); } catch(NamingException ne) { ne.printStackTrace(); } Connection conn; try { conn = pool.getConnection(); String sql = "select * from allbook"; PreparedStatement ps; ps = conn.prepareStatement(sql); ResultSet rs=ps.executeQuery(); while(rs.next()){ System.out.println(rs.getString("BOOKNAME")); } } catch (SQLException e) { e.printStackTrace(); } } } |
參數(shù)化:簡單的來理解一下,我們錄制了一個腳本,這個腳本中有登錄操作,需要輸入用戶名和密碼,假如系統(tǒng)不允許相同的用戶名和密碼同時登錄,或者想更好的模擬多個用戶來登錄系統(tǒng)。
這個時候就需要對用戶名和密碼進行參數(shù)化,使每個虛擬用戶都使用不同的用戶名和密碼進行訪問。
前提:
假如,我們錄制好了一個腳本(可以用badboy工具錄制),在jmeter中打開,找到有用戶名和密碼的頁面。如下:
1.我們需要“參數(shù)化”的數(shù)據(jù),這里我用記事本寫了五個用戶名和密碼,保存為.dat格式的文件。
我將這個文件放在了我的( D:\test.dat )路徑下。關(guān)于如何得到成百上千的用戶名和密碼,首先要在
數(shù)據(jù)庫中創(chuàng)建這些數(shù)據(jù),將數(shù)據(jù)導(dǎo)出,整理保存,這里就不深究。
2.好,我們要編寫函數(shù)來調(diào)用這個
test.dat文件,怎么弄,
點擊菜單欄“選項”---->函數(shù)助手對話框,看下圖。

好了,現(xiàn)在我們的參數(shù)化設(shè)置完成,在腳本的時候,會調(diào)用我們D盤下面的test.dat文件,第一列是用戶,第二列是密碼。
注意用戶名和密碼是一一對應(yīng)的,中間用戶逗號(,)隔開。
一、 安裝準備
http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.0.3-x32.exe
2. 去Jira官方網(wǎng)站注冊一個帳號,以便獲取license。
https://id.atlassian.com/profile/signUp.action?application=mac&continue=https://my.atlassian.com
二、 安裝
1. 雙擊atlassian-jira-6.0.3-x32.exe文件啟動安裝過程。
安裝完成后默認將打開Jira Portal進行配置。
Server Language選擇English(United States),其他保留默認選項,一直單擊Next按鈕。
當(dāng)跳轉(zhuǎn)到license key頁面時,選擇"I have an account but no key". 這時會讓你輸入注冊帳號和密碼,然后單擊按鈕“sign in and generate license key”,將為你自動生成一個試用版的license key. 繼續(xù)直到安裝完成。
這時你會看到在System Dashboard頁面時License顯示為
JIRA: Evaluation
(Expires in 29 days, 2 hours on 12/Mar/14)
2. Stop Jira Service
開始菜單 -> Jira -> Stop Jira Service。
三、 破解
1. 下載Jira 6.0.3破解包
http://download.csdn.net/download/joinandjoin/5542683
2. 解壓破解包到你的硬盤指定目錄下,然后按如下指令操作。
2.a 用atlassian-extras-2.2.2.jar替換你的JIRA的安裝目錄的\atlassian-jira\WEB-INF\lib同名jar包。
2.b 用atlassian-universal-plugin-manager-plugin-2.10.1.jar替換你的JIRA的安裝目錄的\atlassian-jira\atlassian-bundled-plugins.zip中的同名jar包。
2.c 查看你在Jira網(wǎng)站的注冊帳號信息,按照如下格式填寫好自己的license,保存為txt文件,稍后使用。
Description=JIRA: Commercial, CreationDate=你的安裝日期,格式(yyyy-mm-dd), jira.LicenseEdition=ENTERPRISE, Evaluation=false, jira.LicenseTypeName=COMMERCIAL, jira.active=true, licenseVersion=2, |
MaintenanceExpiryDate=你想設(shè)置的失效日期如:2099-12-31,
Organisation=你的Company Name,
SEN=你申請到的SEN注意沒有前綴LID,
ServerID=你申請到的ServerID,
jira.NumberOfUsers=-1,
LicenseID=LID你申請到的SEN,注意LID前綴不要丟掉,
LicenseExpiryDate=你想設(shè)置的失效日期如:2099-12-31,
PurchaseDate=你的安裝日期,格式(yyyy-mm-dd)
(注意,各項之間以逗號分隔)
3. 啟動Jira Service
開始菜單 -> Jira -> Start Jira Service
4. 訪問Jira Portal,更新License。
4.a 開始菜單 -> Jira -> Access JIRA,你將進入System Dashboard。這時候你看到的License顯示為“JIRA:EVALUATION”。
4.b 單擊JIRA:EVALUATION鏈接,進入License管理頁面。打開你在2.c步驟準備好的txt文件,將內(nèi)容拷貝、粘貼到License文本框,單擊“Add”按鈕,License即更新成功。這時你應(yīng)該看到License Type顯示為
JIRA:Commercial
(Support and updates available until 30/Dec/99)。
恭喜,破解成功!
1: VS2010中需要添加的DLL文件如下(注意,某些DLL是在http://docs.seleniumhq.org/download/下載,請選用匹配的.net 文件夾中的DLL文件,因為同樣的DLL名稱的文件會在不同文件夾中,請選對文件夾)
名稱
2:C#語句參照的是
網(wǎng)址:http://www.docin.com/p-748751347.html
3:可以
測試多種瀏覽器,我正在研究其中的用途中,希望能跟大家分享經(jīng)驗。
多種瀏覽器打開的語句:
ISelenium
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.baidu.com/");
//Open FireFox
ISelenium selenium = new DefaultSelenium("localhost", 4444, "*iexploreproxy", "http://www.baidu.com/");
//Open IE
ISelenium selenium = new DefaultSelenium("localhost", 4444, "*googlechrome", "http://www.baidu.com/");
4: 我再總結(jié)一下流程
參考:
http://blog.csdn.net/chadcao/article/details/7989550
1:下載IDE
2:下載并安裝jdk
3:下載RC Server
http://docs.seleniumhq.org/download/
(啟動Server后,就可以在VS2010中執(zhí)行C#的腳本)
4:下載selenium-remote-control-1.0.3 (因為里面有相關(guān)的DLL文件可以放到VS2010中使用)
5:下載Selenium Client & WebDriver Lanugage Bindings
http://docs.seleniumhq.org/download/ (因為里面有相關(guān)的DLL文件可以放到VS2010中使用)
6:錄制,編輯IDE的運行腳本,把以上相關(guān)的DLL文件放入VS2010中,運行RC Server
版權(quán)聲明:本文出自 wchair 的51Testing軟件測試博客:http://www.51testing.com/?153101
原創(chuàng)作品,轉(zhuǎn)載時請務(wù)必以超鏈接形式標明本文原始出處、作者信息和本聲明,否則將追究法律責(zé)任。
測試build是通過TestFlight遞交的,測試人員手上沒有源代碼,開發(fā)人員在國外,不方便共享源碼,如何能做IOS的
自動化測試?
經(jīng)過折騰,發(fā)現(xiàn)了個可能的辦法,
1. 先通過TestFlight安裝build
2. 再把build通過ifanbox把build導(dǎo)出來成為ipa文件
3. 下面就需要把ipa文件重新簽名,方法有兩種
方法一:
利用商業(yè)化工具簽名,SeeTest支持把ipa重新簽名,簽名需要提供 provision文件,和開發(fā)者證書私鑰和密碼
方法二:
自己想辦法簽,代碼參考如下
unzip app.ipa rm -rf Payload/MyApp.app/_CodeSignature/ cp ~/Downloads/AdHoc.mobileprovision Payload/MyApp.app/embedded.mobileprovision codesign -f -s "iPhone Distribution: Company Certificate" --resource-rules Payload/MyApp.app/ResourceRules.plist Payload/MyApp.app zip -qr app-resigned.ipa Payload/ |
其中"iPhone Distribution: Company Certificate"是你證書的common name, 別的沒什么要注意的。
方法三:
網(wǎng)上有推薦用一個叫iresign的工具簽名,其實挺好用,該工具只能
工作在mac下面
個人推薦用方法三,但是要注意一個問題,就是iresign需要你提供四個信息,一個是ipa文件,一個是provision文件,一個是證書的common name,最后一個是entitlements.plist文件。前三個想必大家都懂,但是第四個之前真沒聽過,網(wǎng)上資料也有限。
請用下面的方法生成entitlements.plist文件
/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i production.app/embedded.mobileprovision) > entitlements.plist /usr/libexec/PlistBuddy -c 'Set :get-task-allow true' entitlements.plist |
生成之后,再利用iresign,就可以做出一個可以被xcode instrument的ipa包了。
在我們?nèi)粘i_發(fā)
android app的時候,需要不斷地進行
測試,所以使用
JUnit測試框架顯得格外重要,學(xué)會JUnit可以加快應(yīng)用的開發(fā)周期。
Android中建立JUnit測試環(huán)境有以下兩種方法。
一、直接在需要被測試的工程中新建測試類
集成步驟:
1.在androidManifest.xml文件中添加以下代碼:
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.junittest" android:label="@string/app_name" ></instrumentation> |
<uses-library android:name="android.test.runner"/>
以上代碼配置是添加測試指令和引入測試環(huán)境,完整的清單文件如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.junittest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.junittest" android:label="@string/app_name" ></instrumentation> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner"/> <activity android:name="com.example.junittest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
2.新建一個測試測試類并繼承AndroidTestCase類,編寫測試方法,在測試方法內(nèi)使用斷言assert來測試要測試的方法。
3.點擊右面的大綱視圖,選擇要測試的方法,右鍵,run as --->Android JUnit test
下面通過一個簡單的示例來演示一下如何使用JUnit單元測試
1、先創(chuàng)建簡單的待測試類Calculator.java
package com.example.junittest; public class Calculator { public int add(int x,int y){ return x+y; } public int sub(int x,int y){ return x-y; } public int divide(int x,int y){ return x/y; } public int multiply(int x,int y){ return x*y; } } |
2、創(chuàng)建一個測試類,此類需要繼承自AndroidTestCase
示例代碼如下:
package com.example.test; import junit.framework.Assert; import com.example.junittest.Calculator; import android.test.AndroidTestCase; import android.util.Log; public class CalculatorTester extends AndroidTestCase { private static final String TAG = CalculatorTester.class.getSimpleName(); private Calculator calculator; /** * This method is invoked before any of the test methods in the class. * Use it to set up the environment for the test (the test fixture. You can use setUp() to instantiate a new Intent with the action ACTION_MAIN. You can then use this intent to start the Activity under test. */ @Override protected void setUp() throws Exception { Log.e(TAG, "setUp"); calculator = new Calculator(); super.setUp(); } /** * 測試Calculator的add(int x, int y)方法 * 把異常拋給測試框架 * @throws Exception */ public void testAdd() throws Exception{ int result = calculator.add(3, 5); Assert.assertEquals(8, result); } /** * 測試Calculator的divide(int x, int y)方法 * 把異常拋給測試框架 * @throws Exception */ public void testDivide() throws Exception{ int result = calculator.divide(10, 0); Assert.assertEquals(10, result); } /** * This method is invoked after all the test methods in the class. * Use it to do garbage collection and to reset the test fixture. */ @Override protected void tearDown() throws Exception { Log.e(TAG, "tearDown"); calculator = null; super.tearDown(); } } |
一個好的習(xí)慣是每個測試方法都拋出異常:throws Exception,然后通過Assert對結(jié)果進行斷言。
3、通過大綱視圖運行測試方法
綠條表示測試通過,在代碼中我們測試的時3+5是否等于8,所以結(jié)果肯定是通過的,如果我們把assertEquals()中的8改為5的話,會出現(xiàn)以下結(jié)果:
紅條表示測試沒通過,點擊右邊的錯誤信息可以定位到出錯的代碼行。 二、創(chuàng)建一個專門用于測試的工程
推薦創(chuàng)建專門的測試工程,因為這樣可以降低代碼的耦合度。
集成步驟:
1.新建工程,選擇new ---- > other ---->android Test Project
2.選擇要測試的工程
3.接著和第一種建立測試類的方法是一樣的,這里比較簡單就略過了。
使用這種方法的話,androidManifest.xml中已經(jīng)自動配置好相關(guān)的參數(shù),無需在進行配置,比較方便。