導航:首頁 > 編程語言 > java系統測試

java系統測試

發布時間:2022-07-01 10:37:04

1. 什麼是java開發環境,測試環境及生產環境,及它的過程

1、開發環境
顧名思義,開發同學開發時使用的環境,每位開發同學在自己的dev分支上幹活,提測前或者開發到一定程度,各位同學會合並代碼,進行聯調。
2、測試環境
也就是我們測試同學幹活的環境啦,一般會由測試同學自己來部署,然後在此環境進行測試。bug修復後,需要發版更新測試環境來回歸bug。
3、回歸環境
回歸bug的環境,其實就是我們的測試環境,在測試環境上測試、回歸驗證bug。
4、預發布環境
測試環境到生產環境的過渡。測試環境可能會受到一些限制,一些流程或者數據沒有測試到,就可以在預發布環境進行驗證,從而保證產品上線質量。
預發布環境和生產環境區別:
1)預發環境中新功能為最新代碼,其他功能代碼和生產環境一致。
2)預發環境和生產環境的訪問域名不同。
注意事項:
1)預發布環境一般會連接生產環境的資料庫,測試時要注意,以免產生臟數據,影響生產環境的使用。
5、生產環境
即線上環境,用戶使用的環境。由特定人員來維護,一般人沒有許可權去修改。
另外,還有個灰度發布,發生在預發布環境之後,生產環境之前。
生產環境一般會部署在多台機器上,以防某台機器出現故障,這樣其他機器可以繼續運行,不影響用戶使用。灰度發布會發布到其中的幾台機器上,驗證新功能是否正常。如果失敗,只需回滾這幾台機器即可。

2. 請問java測試工具是什麼

JUnit

JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟體如何(How)完成功能和完成什麼樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。
更多JUnit信息

Cactus

Cactus是一個基於JUnit框架的簡單測試框架,用來單元測試服務端Java代碼。Cactus框架的主要目標是能夠單元測試服務端的使用Servlet對象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等
更多Cactus 信息

Abbot

Abbot是一個用來測試Java GUIs的框架。用簡單的基於XML的腳本或者Java代碼,你就可以開始一個GUI。
更多Abbot信息

JUnitPerf

Junitperf實際是junit的一個decorator,通過編寫用於junitperf的單元測試,我們也可使測試過程自動化。
更多JUnitPerf信息

DbUnit

DbUnit是為資料庫驅動的項目提供的一個對JUnit 的擴展,除了提供一些常用功能,它可以將你的資料庫置於一個測試輪回之間的狀態。
更多DbUnit信息

Mockrunner

Mockrunner用在J2EE環境中進行應用程序的單元測試。它不僅支持Struts actions, servlets,過濾器和標簽類還包括一個JDBC和一個JMS測試框架,可以用於測試基於EJB的應用程序。
更多Mockrunner信息

DBMonster

DBMonster是一個用生成隨機數據來測試SQL資料庫的壓力測試工具。
更多DBMonster信息

MockEJB

MockEJB是一個不需要EJB容器就能運行EJB並進行測試的輕量級框架。
更多MockEJB信息

StrutsTestCase

StrutsTestCase 是Junit TestCase類的擴展,提供基於Struts框架的代碼測試。StrutsTestCase同時提供Mock 對象方法和Cactus方法用來實際運行Struts ActionServlet,你可以通過運行servlet引擎來測試。因為StrutsTestCase使用ActionServlet控制器來測試你的代碼,因此你不僅可以測試Action對象的實現,而且可以測試mappings,from beans以及forwards聲明。StrutsTestCase不啟動servlet容器來測試struts應用程序(容器外測試)也屬於Mock對象測試,但是與EasyMock不同的是,EasyMock是提供了創建Mock對象的API,而StrutsTest則是專門負責測試Struts應用程序的Mock對象測試框架。
更多StrutsTestCase信息

JFCUnit

JFCUnit使得你能夠為Java偏移應用程序編寫測試例子。它為從用代碼打開的窗口上獲得句柄提供了支持;為在一個部件層次定位部件提供支持;為在部件中發起事件(例如按一個按鈕)以及以線程安全方式處理部件測試提供支持。
更多JFCUnit信息

JTestCase

JTestCase 使用XML文件來組織多測試案例數據,聲明條件(操作和期望的結果),提供了一套易於使用的方法來檢索XML中的測試案例,按照數據文件的定義來聲明結果。
更多JTestCase信息

SQLUnit

SQLUnit是一個單元測試框架,用於對資料庫存儲過程進行加歸測試。用 Java/JUnit/XML開發。
更多SQLUnit信息

JTR

JTR (Java Test Runner)是一個開源的基於反轉控制(IOC)的J2EE測試框架。它允許你構建復雜的J2EE測試套件(Test Suites)並連到應用伺服器執行測試,可以包括多個測試實例。JTR的licensed是GPL協議。
更多JTR信息

Marathon

Marathon是一個針對使用Java/Swing開發GUI應用程序的測試框架,它由recorder, runner 和 editor組成,測試腳本是python代碼。Marathon的焦點是放在最終用戶的測試上。
更多Marathon信息

TestNG

TestNG是根據JUnit 和 NUnit思想而構建的一個測試框架,但是TestNG增加了許多新的功能使得它變得更加強大與容易使用比如:
*支持JSR 175注釋(JDK 1.4利用JavaDoc注釋同樣也支持)
*靈活的Test配置
*支持默認的runtime和logging JDK功能
*強大的執行模型(不再TestSuite)
*支持獨立的測試方法。
更多TestNG信息

Surrogate Test framework

Surrogate Test framework是一個值得稱贊單元測試框架,特別適合於大型,復雜Java系統的單元測試。這個框架能與JUnit,MockEJB和各種支持模擬對象(mock object )的測試工具無縫給合。這個框架基於AspectJ技術。
更多Surrogate Test framework信息

MockCreator

MockCreator可以為給定的interface或class生成模擬對象(Mock object)的源碼
更多MockCreator信息

jMock

jMock利用mock objects思想來對Java code進行測試。jMock具有以下特點:容易擴展,讓你快速簡單地定義mock objects,因此不必打破程序間的關聯,讓你定義靈活的超越對象之間交互作用而帶來測試局限,減少你測試地脆弱性。
更多jMock信息

EasyMock

EasyMock為Mock Objects提供介面並在JUnit測試中利用Java的proxy設計模式生成它們的實例。EasyMock最適合於測試驅動開發。
更多EasyMock信息

Grinder

Grinder是一個開源的Java負載測試框架,它通過很多負載注射器來為分布式測試提供了便利。
支持用於執行測試腳本的Jython腳本引擎
HTTP測試可通過HTTP代理進行管理。
更多Grinder信息

XMLUnit

XMLUnit不僅有Java版本的還有.Net版本的。Java開發的XMLUnit提供了兩個JUnit 擴展類XMLAssert和XMLTestCase,和一組支持的類。這些類可以用來比較兩張XML之間的不同之處,展示XML利用XSLT來,校驗XML,求得XPath表達式在XML中的值,遍歷XML中的某一節點利DOM展開,
更多XMLUnit信息

Jameleon

Jameleon一個自動化測試工具。它被用來測試各種各樣的應用程序,所以它被設計成插件模式。為了使整個測試過程變得簡單Jameleon提供了一個GUI,因此Jameleon實現了一個Swing 插件。
更多Jameleon信息

J2MEUnit

J2MEUnit是應用在J2ME應用程序的一個單元測試框架。它基於JUnit.
更多J2MEUnit信息

Jetif

Jetif是一個用純Java實現的回歸測試框架。它為Java程序單元測試以及功能測試提供了一個簡單而且可 伸縮的架構,可以用於個人開發或企業級開發的測試。它容易使用,功能強大,而且擁有一些企業級測試的 重要功能。Jetif來源於JUnit, JTestCase以及TestNG的啟發,有幾個基本的概念直接來自於JUnit, 比如說斷言機制,Test Listener的概念,因此從JUnit轉到Jetif是非常容易的。
更多Jetif信息

GroboUtils

GroboUtils使得擴展Java測試變得可能。它包括用在Java不同方面測試的多個子項目。在GroboUtils中最常被到的工具是:多線程測試(multi-threaded tests),整體單元測試(hierarchial unit tests),代碼覆蓋工具(code coverage tool)。
更多GroboUtils信息

Testare

TESTARE是用來簡化分布式應用程序(比如:在SERVLETS,JMS listeners, CORBA ORBs或RMI環境下)測試開發過程的一個測試框架.
更多Testare信息

MockLib

MockLib是一個很小的包所以可容易地動態創建一個模擬對象.你可以從模擬的系統中拋出異常來確保你的系統能夠正確處理錯誤.它同樣也是一個線程安全的模擬對象庫.
更多MockLib信息

JellyUnit

JellyUnit是一個基於Jelly的JUnit測試機制.它允許用Jelly腳本來完成單元測試.尤其是對於XML,XPath,SQL,HTTP,JMS和SOAP交互的測試特別有用.
更多JellyUnit信息

Pisces

這個項目繼承於JUnit目的是提供一個分布式的測試環境.它給開發者/測試人員一個運行遠程JUnits和復雜測試案例的能力,這個案例由幾個並行運行的遠程JUnit測試組成。
更多Pisces信息

JUnitEE

JUnitEE是對JUnit的一個簡單擴展,可以支持在一個J2EE應用程序伺服器上執行標準的測試案例。它主要由一個把測試結果輸出為html的servlet組成。
更多JUnitEE信息

3. 使用JAVA編寫一個測試系統

你的設計的是一個在線考試系統...
涉及到考生,試題,考生成績什麼的好多東西,得花點時間弄哦...
建議你到網上搜索下 在線考試系統
用JAVA語言寫的,簡單的可以是JSP+SERVLET+JDBC做的

4. 如何寫測試用例 java

測試用例設計和執行是測試工作的核心,也是工作量最大的任務之一。

測試用例(Test Case)目前沒有經典的定義。比較通常的說法是:指對一項特定的軟體產品進行測試任務的描述,體現測試方案、方法、技術和策略。內容包括測試目標、測試環境、輸入數據、測試步驟、預期結果、測試腳本等,並形成文檔。
測試用例編寫准備
1
從配置管理員處申請軟體配置:《需求規格說明書》和《設計說明書》;
2
根據需求規格說明書和設計說明書,詳細理解用戶的真正需求,並且對軟體所實現的功能已經准確理解,然後著手制訂測試用例。

測試用例制定的原則
1測試用例要包括欲測試的功能、應輸入的數據和預期的輸出結果。
2測試數據應該選用少量、高效的測試數據進行盡可能完備的測試。

用例覆蓋
1正確性測試:輸入用戶實際數據以驗證系統是滿足需求規格說明書的要求;測試用 例中的測試點應首先保證要至少覆蓋需求規格說明書中的各項功能,並且正常。
2容錯性(健壯性)測試:程序能夠接收正確數據輸入並且產生正確(預期)的輸出, 輸入非法數據(非法類型、不符合要求的數據、溢出數據等),程序應能給出提示 並進行相應處理。把自己想像成一名對產品操作一點也不懂的客戶,在進行任意操作。
3完整(安全)性測試:對未經授權的人使用軟體系統或數據的企圖,系統能夠控制的程度,程序的數據處理能夠保持外部信息(資料庫或文件)的完整。
4介面間測試:測試各個模塊相互間的協調和通信情況,數據輸入輸出的一致性和正確性。
5壓力測試:輸入10條記錄運行各個功能,輸入30條記錄運行,輸入50條記錄進行測試。
6性能:完成預定的功能,系統的運行時間(主要是針對資料庫而言)。
7可理解(操作)性:理解和使用該系統的難易程度(界面友好性)。
8可移植性:在不同操作系統及硬體配置情況下的運行性。

測試方法
1邊界值分析法:確定邊界情況(剛好等於、稍小於和稍大於和剛剛大於等價類邊界值),針對我們的系統在測試過程中主要輸入一些合法數據/非法數據,主要在邊界值附近選取。
2等價劃分:將所有可能的輸入數據(有效的和無效的)劃分成若干個等價類。
3錯誤推測:主要是根據測試經驗和直覺,參照以往的軟體系統出現錯誤之處。

測試用例的填寫
1一個軟體系統或項目共用一套完整的測試用例,整個系統測試過程測試完畢,將實際測試結果填寫到測試用例中,操作步驟應盡可能的詳細,測試結論是指最終的測試結果(結論為:通過或不通過)。

5. 學了java開發可以做測試的工作嗎

學了java開發可以做測試的工作,初級測試沒有那麼多說法, 一般就是做功能性的測試。學習java開發推薦千鋒教育。千鋒教研業務范圍覆蓋企業與高校領域,為國內數百所高等院校提供一站式解決方案。

Java技術不僅是面向對象的高級編程語言,也是一個平台。Java技術基於Java虛擬機的概念(Javavirtualmachine,JVM)——這是一個轉換器,在語言和基礎軟體和硬體之間。Java語言的所有實現都必須實現JVM,這樣Java程序才能在任何有JVM的系統上運行,這是Java的核心優勢。Java在設計中非常注重移植和跨平台,這也是Java應用范圍廣的一個重要原因。

想要了解更多java開發的相關信息,推薦咨詢千鋒教育。千鋒勵精圖治,不改教育初心。十一年來,千鋒以政策為引導,不斷完善國內特色現代職業教育體系建設,充分發揮教研師資隊伍使命,構建品質教育,加大創新型人才培養力度,為經濟發展提供智力人才和智力支撐,成為新時期職業教育發展的新方向,在同行業中有很高的美譽度。

6. 如何在本地測試Java 建站系統

一、 介紹
本文將討論在.NET應用程序中全局系統鉤子的使用。為此,我開發了一個可重用的類庫並創建一個相應的示常式序(見下圖)。

你可能注意到另外的關於使用系統鉤子的文章。本文與之類似但是有重要的差別。這篇文章將討論在.NET中使用全局系統鉤子,而其它文章僅討論本地系統鉤子。這些思想是類似的,但是實現要求是不同的。
二、 背景
如果你對Windows系統鉤子的概念不熟悉,讓我作一下簡短的描述:
・一個系統鉤子允許你插入一個回調函數-它攔截某些Windows消息(例如,滑鼠相聯系的消息)。
・一個本地系統鉤子是一個系統鉤子-它僅在指定的消息由一個單一線程處理時被調用。
・一個全局系統鉤子是一個系統鉤子-它當指定的消息被任何應用程序在整個系統上所處理時被調用。
已有若干好文章來介紹系統鉤子概念。在此,不是為了重新收集這些介紹性的信息,我只是簡單地請讀者參考下面有關系統鉤子的一些背景資料文章。如果你對系統鉤子概念很熟悉,那麼你能夠從本文中得到你能夠得到的任何東西。
・關於MSDN庫中的鉤子知識。
・Dino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。
・Don Kackman的《在C#中應用鉤子》。
本文中我們要討論的是擴展這個信息來創建一個全局系統鉤子-它能被.NET類所使用。我們將用C#和一個DLL和非託管C++來開發一個類庫-它們一起將完成這個目標。
三、 使用代碼
在我們深入開發這個庫之前,讓我們快速看一下我們的目標。在本文中,我們將開發一個類庫-它安裝全局系統鉤子並且暴露這些由鉤子處理的事件,作為我們的鉤子類的一個.NET事件。為了說明這個系統鉤子類的用法,我們將在一個用C#編寫的Windows表單應用程序中創建一個滑鼠事件鉤子和一個鍵盤事件鉤子。
這些類庫能用於創建任何類型的系統鉤子,其中有兩個預編譯的鉤子-MouseHook和KeyboardHook。我們也已經包含了這些類的特定版本,分別稱為MouseHookExt和KeyboardHookExt。根據這些類所設置的模型,你能容易構建系統鉤子-針對Win32 API中任何15種鉤子事件類型中的任何一種。另外,這個完整的類庫中還有一個編譯的HTML幫助文件-它把這些類歸檔化。請確信你看了這個幫助文件-如果你決定在你的應用程序中使用這個庫的話。
MouseHook類的用法和生命周期相當簡單。首先,我們創建MouseHook類的一個實例。

mouseHook = new MouseHook();//mouseHook是一個成員變數
接下來,我們把MouseEvent事件綁定到一個類層次的方法上。

mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent);
// ...
private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){
string msg =string.Format("滑鼠事件::(,).",mEvent.ToString(),x,y);
AddText(msg);//增加消息到文本框
}
為開始收到滑鼠事件,簡單地安裝下面的鉤子即可。

mouseHook.InstallHook();
為停止接收事件,只需簡單地卸載這個鉤子。

mouseHook.UninstallHook();
你也可以調用Dispose來卸載這個鉤子。
在你的應用程序退出時,卸載這個鉤子是很重要的。讓系統鉤子一直安裝著將減慢系統中的所有的應用程序的消息處理。它甚至能夠使一個或多個進程變得很不穩定。因此,請確保在你使用完鉤子時一定要移去你的系統鉤子。我們確定在我們的示例應用程序會移去該系統鉤子-通過在Form的Dispose方法中添加一個Dispose調用。

protected override void Dispose(bool disposing) {
if (disposing) {
if (mouseHook != null) {
mouseHook.Dispose();
mouseHook = null;
}
// ...
}
}
使用該類庫的情況就是如此。該類庫中有兩個系統鉤子類並且相當容易擴充。
四、 構建庫
這個庫共有兩個主要組件。第一部分是一個C#類庫-你可以直接使用於你的應用程序中。該類庫,反過來,在內部使用一個非託管的C++ DLL來直接管理系統鉤子。我們將首先討論開發該C++部分。接下來,我們將討論怎麼在C#中使用這個庫來構建一個通用的鉤子類。就象我們討論C++/C#交互一樣,我們將特別注意C++方法和數據類型是怎樣映射到.NET方法和數據類型的。
你可能想知道為什麼我們需要兩個庫,特別是一個非託管的C++ DLL。你還可能注意到在本文的背景一節中提到的兩篇參考文章,其中並沒有使用任何非託管的代碼。為此,我的回答是,"對!這正是我寫這篇文章的原因"。當你思考系統鉤子是怎樣實際地實現它們的功能時,我們需要非託管的代碼是十分重要的。為了使一個全局的系統鉤子能夠工作,Windows把你的DLL插入到每個正在運行的進程的進程空間中。既然大多數進程不是.NET進程,所以,它們不能直接執行.NET裝配集。我們需要一種非託管的代碼代理- Windows可以把它插入到所有將要被鉤住的進程中。
首先是提供一種機制來把一個.NET代理傳遞到我們的C++庫。這樣,我們用C++語言定義下列函數(SetUserHookCallback)和函數指針(HookProc)。

int SetUserHookCallback(HookProc userProc, UINT hookID)
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l)
SetUserHookCallback的第二個參數是鉤子類型-這個函數指針將使用它。現在,我們必須用C#來定義相應的方法和代理以使用這段代碼。下面是我們怎樣把它映射到C#。

private static extern SetCallBackResults
SetUserHookCallback(HookProcessedHandler hookCallback, HookTypes hookType)
protected delegate void HookProcessedHandler(int code, UIntPtr wparam, IntPtr lparam)
public enum HookTypes {
JournalRecord = 0,
JournalPlayback = 1,
// ...
KeyboardLL = 13,
MouseLL = 14
};
首先,我們使用DllImport屬性導入SetUserHookCallback函數,作為我們的抽象基鉤子類SystemHook的一個靜態的外部的方法。為此,我們必須映射一些外部數據類型。首先,我們必須創建一個代理作為我們的函數指針。這是通過定義上面的HookProcessHandler 來實現的。我們需要一個函數,它的C++簽名為(int,WPARAM,LPARAM)。在Visual Studio .NET C++編譯器中,int與C#中是一樣的。也就是說,在C++與C#中int就是Int32。事情並不總是這樣。一些編譯器把C++ int作為Int16對待。我們堅持使用Visual Studio .NET C++編譯器來實現這個工程,因此,我們不必擔心編譯器差別所帶來的另外的定義。
接下來,我們需要用C#傳遞WPARAM和LPARAM值。這些確實是指針,它們分別指向C++的UINT和LONG值。用C#來說,它們是指向uint和int的指針。如果你還不確定什麼是WPARAM,你可以通過在C++代碼中單擊右鍵來查詢它,並且選擇"Go to definition"。這將會引導你到在windef.h中的定義。

//從windef.h:
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
因此,我們選擇System.UIntPtr和System.IntPtr作為我們的變數類型-它們分別相應於WPARAM和LPARAM類型,當它們使用在C#中時。
現在,讓我們看一下鉤子基類是怎樣使用這些導入的方法來傳遞一個回叫函數(代理)到C++中-它允許C++庫直接調用你的系統鉤子類的實例。首先,在構造器中,SystemHook類創建一個到私有方法InternalHookCallback的代理-它匹配HookProcessedHandler代理簽名。然後,它把這個代理和它的HookType傳遞到C++庫以使用SetUserHookCallback方法來注冊該回叫函數,如上面所討論的。下面是其代碼實現:

public SystemHook(HookTypes type){
_type = type;
_processHandler = new HookProcessedHandler(InternalHookCallback);
SetUserHookCallback(_processHandler, _type);
}
InternalHookCallback的實現相當簡單。InternalHookCallback在用一個catch-all try/catch塊包裝它的同時僅傳遞到抽象方法HookCallback的調用。這將簡化在派生類中的實現並且保護C++代碼。記住,一旦一切都准備妥當,這個C++鉤子就會直接調用這個方法。

[MethodImpl(MethodImplOptions.NoInlining)]
private void InternalHookCallback(int code, UIntPtr wparam, IntPtr lparam){
try
catch {}
}
我們已增加了一個方法實現屬性-它告訴編譯器不要內聯這個方法。這不是可選的。至少,在我添加try/catch之前是需要的。看起來,由於某些原因,編譯器在試圖內聯這個方法-這將給包裝它的代理帶來各種麻煩。然後,C++層將回叫,而該應用程序將會崩潰。
現在,讓我們看一下一個派生類是怎樣用一個特定的HookType來接收和處理鉤子事件。下面是虛擬的MouseHook類的HookCallback方法實現:

protected override void HookCallback(int code, UIntPtr wparam, IntPtr lparam){
if (MouseEvent == null)
int x = 0, y = 0;
MouseEvents mEvent = (MouseEvents)wparam.ToUInt32();
switch(mEvent) {
case MouseEvents.LeftButtonDown:
GetMousePosition(wparam, lparam, ref x, ref y);
break;
// ...
}
MouseEvent(mEvent, new Point(x, y));
}
首先,注意這個類定義一個事件MouseEvent-該類在收到一個鉤子事件時激發這個事件。這個類在激發它的事件之前,把數據從WPARAM和 LPARAM類型轉換成.NET中有意義的滑鼠事件數據。這樣可以使得類的消費者免於擔心解釋這些數據結構。這個類使用導入的 GetMousePosition函數-我們在C++ DLL中定義的用來轉換這些值。為此,請看下面幾段的討論。
在這個方法中,我們檢查是否有人在聽這一個事件。如果沒有,不必繼續處理這一事件。然後,我們把WPARAM轉換成一個MouseEvents枚舉類型。我們已小心地構造了MouseEvents枚舉來准確匹配它們在C ++中相應的常數。這允許我們簡單地把指針的值轉換成枚舉類型。但是要注意,這種轉換即使在WPARAM的值不匹配一個枚舉值的情況下也會成功。 mEvent的值將僅是未定義的(不是null,只是不在枚舉值范圍之內)。為此,請詳細分析System.Enum.IsDefined方法。
接下來,在確定我們收到的事件類型後,該類激活這個事件,並且通知消費者滑鼠事件的類型及在該事件過程中滑鼠的位置。
最後注意,有關轉換WPARAM和LPARAM值:對於每個類型的事件,這些變數的值和意思是不同的。因此,在每一種鉤子類型中,我們必須區別地解釋這些值。我選擇用C++實現這種轉換,而不是盡量用C#來模仿復雜的C++結構和指針。例如,前面的類就使用了一個叫作GetMousePosition的 C++函數。下面是C++ DLL中的這個方法:

bool GetMousePosition(WPARAM wparam, LPARAM lparam, int amp; x, int amp; y) {
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lparam;
x = pMouseStruct->pt.x;
y = pMouseStruct->pt.y;
return true;
}
不是盡量映射MOUSEHOOKSTRUCT結構指針到C#,我們簡單地暫時把它回傳到C++層以提取我們需要的值。注意,因為我們需要從這個調用中返回一些值,我們把我們的整數作為參考變數傳遞。這直接映射到C#中的int*。但是,我們可以重載這個行為,通過選擇正確的簽名來導入這個方法。

private static extern bool InternalGetMousePosition(UIntPtr wparam,IntPtr lparam, ref int x, ref int y)
通過把integer參數定義為ref int,我們得到通過C++參照傳遞給我們的值。如果我們想要的話,我們還可以使用out int。
五、 限制
一些鉤子類型並不適合實現全局鉤子。我當前正在考慮解決辦法-它將允許使用受限制的鉤子類型。到目前為止,不要把這些類型添加回該庫中,因為它們將導致應用程序的失敗(經常是系統范圍的災難性失敗)。下一節將集中討論這些限制背後的原因和解決辦法。

HookTypes.CallWindowProcere
HookTypes.CallWindowProret
HookTypes.ComputerBasedTraining
HookTypes.Debug
HookTypes.ForegroundIdle
HookTypes.JournalRecord
HookTypes.JournalPlayback
HookTypes.GetMessage
HookTypes.SystemMessageFilter
六、 兩種類型的鉤子
在本節中,我將盡量解釋為什麼一些鉤子類型被限制在一定的范疇內而另外一些則不受限制。如果我使用有點偏差術語的話,請原諒我。我還沒有找到任何有關這部分題目的文檔,因此,我編造了我自己的詞彙。另外,如果你認為我根本就不對,請告訴我好了。
當Windows調用傳遞到SetWindowsHookEx()的回調函數時它們會因不同類型的鉤子而被區別調用。基本上有兩種情況:切換執行上下文的鉤子和不切換執行上下文的鉤子。用另一種方式說,也就是,在放鉤子的應用程序進程空間執行鉤子回調函數的情況和在被鉤住的應用程序進程空間執行鉤子回調函數的情況。
鉤子類型例如滑鼠和鍵盤鉤子都是在被Windows調用之前切換上下文的。整個過程大致如下:
1. 應用程序X擁有焦點並執行。
2. 用戶按下一個鍵。
3. Windows從應用程序X接管上下文並把執行上下文切換到放鉤子的應用程序。
4. Windows用放鉤子的應用程序進程空間中的鍵消息參數調用鉤子回調函數。
5. Windows從放鉤子的應用程序接管上下文並把執行上下文切換回應用程序X。
6. Windows把消息放進應用程序X的消息排隊。
7. 稍微一會兒之後,當應用程序X執行時,它從自己的消息排隊中取出消息並且調用它的內部按鍵(或松開或按下)處理器。
8. 應用程序X繼續執行...
例如CBT鉤子(window創建,等等。)的鉤子類型並不切換上下文。對於這些類型的鉤子,過程大致如下:
1. 應用程序X擁有焦點並執行。
2. 應用程序X創建一個窗口。
3. Windows用在應用程序X進程空間中的CBT事件消息參數調用鉤子回調函數。
4. 應用程序X繼續執行...
這應該說明了為什麼某種類型的鉤子能夠用這個庫結構工作而一些卻不能。記住,這正是該庫要做的。在上面第4步和第3步之後,分別插入下列步驟:
1. Windows調用鉤子回調函數。
2. 目標回調函數在非託管的DLL中執行。
3. 目標回調函數查找它的相應託管的調用代理。
4. 託管代理被以適當的參數執行。
5. 目標回調函數返回並執行相應於指定消息的鉤子處理。
第三步和第四步因非切換鉤子類型而註定失敗。第三步將失敗,因為相應的託管回調函數不會為該應用程序而設置。記住,這個DLL使用全局變數來跟蹤這些託管代理並且該鉤子DLL被載入到每一個進程空間。但是這個值僅在放鉤子的應用程序進程空間中設置。對於另外其它情況,它們全部為null。
Tim Sylvester在他的《Other hook types》一文中指出,使用一個共享內存區段將會解決這個問題。這是真實的,但是也如Tim所指出的,那些託管代理地址對於除了放鉤子的應用程序之外的任何進程是無意義的。這意味著,它們是無意義的並且不能在回調函數的執行過程中調用。那樣會有麻煩的。
因此,為了把這些回調函數使用於不執行上下文切換的鉤子類型,你需要某種進程間的通訊。
我已經試驗過這種思想-使用非託管的DLL鉤子回調函數中的進程外COM對象進行IPC。如果你能使這種方法工作,我將很高興了解到這點。至於我的嘗試,結果並不理想。基本原因是很難針對各種進程和它們的線程(CoInitialize(NULL))而正確地初始化COM單元。這是一個在你可以使用 COM對象之前的基本要求。
我不懷疑,一定有辦法來解決這個問題。但是我還沒有試用過它們,因為我認為它們僅有有限的用處。例如,CBT鉤子可以讓你取消一個窗口創建,如果你希望的話。可以想像,為使這能夠工作將會發生什麼。
1. 鉤子回調函數開始執行。
2. 調用非託管的鉤子DLL中的相應的鉤子回調函數。
3. 執行必須被路由回到主鉤子應用程序。
4. 該應用程序必須決定是否允許這一創建。
5. 調用必須被路由回仍舊在運行中的鉤子回調函數。
6. 在非託管的鉤子DLL中的鉤子回調函數從主鉤子應用程序接收到要採取的行動。
7. 在非託管的鉤子DLL中的鉤子回調函數針對CBT鉤子調用採取適當的行動。
8. 完成鉤子回調函數的執行。
這不是不可能的,但是不算好的。我希望這會消除在該庫中的圍繞被允許的和受限制的鉤子類型所帶來的神秘。
七、 其它
・庫文檔:我們已經包含了有關ManagedHooks類庫的比較完整的代碼文檔。當以"Documentation"構建配置進行編譯時,這被經由Visual Studio.NET轉換成標准幫助XML。最後,我們已使用NDoc來把它轉換成編譯的HTML幫助(CHM)。你可以看這個幫助文件,只需簡單地在該方案的解決方案資源管理器中點擊Hooks.chm文件或通過查找與該文相關的可下載的ZIP文件。
・增強的智能感知:如果你不熟悉Visual Studio.NET怎樣使用編譯的XML文件(pre-NDoc output)來為參考庫的工程增強智能感知,那麼讓我簡單地介紹一下。如果你決定在你的應用程序中使用這個類庫,你可以考慮復制該庫的一個穩定構建版本到你想參考它的位置。同時,還要把XML文檔文件 (SystemHooks\ManagedHooks\bin\Debug\Kennedy.ManagedHooks.xml)復制到相同的位置。當你添加一個參考到該庫時,Visual Studio.NET將自動地讀該文件並使用它來添加智能感知文檔。這是很有用的,特別是對於象這樣的第三方庫。
・單元測試:我相信,所有的庫都應有與之相應的單元測試。既然我是一家公司(主要負責針對.NET環境軟體的單元測試)的合夥人和軟體工程師,任何人不會對此感到驚訝。因而,你將會在名為ManagedHooksTests的解決方案中找到一個單元測試工程。為了運行該單元測試,你需要下載和安裝 HarnessIt-這個下載是我們的商業單元測試軟體的一個自由的試用版本。在該單元測試中,我對這給予了特殊的注意-在此處,方法的無效參數可能導致 C++內存異常的發生。盡管這個庫是相當簡單的,但該單元測試確實能夠幫助我在一些更為微妙的情況下發現一些錯誤。
・非託管的/託管的調試:有關混合解決方案(例如,本文的託管的和非託管的代碼)最為技巧的地方之一是調試問題。如果你想單步調試該C++代碼或在C++代碼中設置斷點,你必須啟動非託管的調試。這是一個Visual Studio.NET中的工程設置。注意,你可以非常順利地單步調試託管的和非託管的層,但是,在調試過程中,非託管的調試確實嚴重地減慢應用程序的裝載時間和執行速度。
八、 最後警告
很明顯,系統鉤子相當有力量;然而,使用這種力量應該是有責任性的。在系統鉤子出了問題時,它們不僅僅垮掉你的應用程序。它們可以垮掉在你的當前系統中運行的每個應用程序。但是到這種程度的可能性一般是很小的。盡管如此,在使用系統鉤子時,你還是需要再三檢查你的代碼。
我發現了一項可以用來開發應用程序的有用的技術-它使用系統鉤子來在微軟的虛擬PC上安裝你的喜愛的開發操作系統的一個拷貝和Visual Studio.NET。然後,你就可以在此虛擬的環境中開發你的應用程序。用這種方式,當你的鉤子應用程序出現錯誤時,它們將僅退出你的操作系統的虛擬實例而不是你的真正的操作系統。我已經不得不重啟動我的真正的OS-在這個虛擬OS由於一個鉤子錯誤崩潰時,但是這並不經常。

7. java測試和java有什麼關系

Java就是編程語言,可以開發系統,開發軟體。
java測試就是對別人已完成的系統、軟體進行功能測試、性能測試、壓力測試等。測試軟體是否可上線運行。

8. Java開發如何編寫出優秀的Java單元測試

找你項目經理,問問他

9. java環境配置與測試如何設置

1,JDK安裝成功後。
2,配置環境變數

JAVA_HOME=(你安裝JDK的目錄,如C:\ProgramFiles
\Java\jdk1.5.0_06)。
Path=(你安裝JDK的bin目錄,如\ProgramFiles
\Java\jdk1.5.0_06\bin)。
3,測試,打開dos,輸入java
或javac
運行如果出現java的幫助信息。
那就成功了。如果出現:
「'java'
不是內部或外部命令,也不是可運行的程序
或批處理文件。」
那就還不行。

10. java系統怎麼做性能測試調優是不是掌握了jvm就差不多了

JVM是最好的軟體工程之一,它為Java提供了堅實的基礎,許多流行語言如Kotlin、Scala、Clojure、Groovy都使用JVM作為運行基礎。一個專業的Java工程師必須要了解並掌握JVM,接下來就給大家分享Java基礎知識中JVM調優相關知識點。

杭州Java基礎知識學習之JVM調優講解

JVM常見的調優參數包括:

-Xmx:指定java程序的最大堆內存, 使用java -Xmx5000M -version判斷當前系統能分配的最大堆內存;

-Xms:指定最小堆內存, 通常設置成跟最大堆內存一樣,減少GC;

-Xmn:設置年輕代大小。整個堆大小=年輕代大小+年老代大小。所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8;

-Xss:指定線程的最大棧空間, 此參數決定了java函數調用的深度, 值越大調用深度越深, 若值太小則容易出棧溢出錯誤(StackOverflowError);

-XX:PermSize:指定方法區(永久區)的初始值,默認是物理內存的1/64,在Java8永久區移除, 代之的是元數據區,由-XX:MetaspaceSize指定;

-XX:MaxPermSize:指定方法區的最大值, 默認是物理內存的1/4,在java8中由-XX:MaxMetaspaceSize指定元數據區的大小;

-XX:NewRatio=n:年老代與年輕代的比值,-XX:NewRatio=2, 表示年老代與年輕代的比值為2:1;

-XX:SurvivorRatio=n:Eden區與Survivor區的大小比值,-XX:SurvivorRatio=8表示Eden區與Survivor區的大小比值是8:1:1,因為Survivor區有兩個(from, to)。

JVM實質上分為三大塊,年輕代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取消)。

年輕代大小選擇

響應時間優先的應用:盡可能設大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時,減少到達年老代的對象。

吞吐量優先的應用:盡可能的設置大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以並行進行,一般適合8CPU以上的應用。

年老代大小選擇

響應時間優先的應用:年老代使用並發收集器,所以其大小需要小心設置,一般要考慮並發會話率和會話持續時間等一些參數。如果堆設置小了,可以會造成內存碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。最優化的方案,一般需要參考以下數據獲得:並發垃圾收集信息、持久代並發收集次數、傳統GC信息、花在年輕代和年老代回收上的時間比例。

減少年輕代和年老代花費的時間,一般會提高應用的效率。

吞吐量優先的應用:一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以盡可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象。

較小堆引起的碎片問題

因為年老代的並發收集器使用標記、清除演算法,所以不會對堆進行壓縮。當收集器回收時,他會把相鄰的空間進行合並,這樣可以分配給較大的對象。但是,當堆空間較小時,運行一段時間以後,就會出現「碎片」,如果並發收集器找不到足夠的空間,那麼並發收集器將會停止,然後使用傳統的標記、清除方式進行回收。如果出現「碎片」,可能需要進行如下配置:

-XX:+UseCMSCompactAtFullCollection:使用並發收集器時,開啟對年老代的壓縮。

-XX:CMSFullGCsBeforeCompaction=0:上面配置開啟的情況下,這里設置多少次Full GC後,對年老代進行壓縮。

閱讀全文

與java系統測試相關的資料

熱點內容
tom快播 瀏覽:661
換硬幣演算法遞歸 瀏覽:122
四級電影推薦 瀏覽:847
女主手臂處有射精管理局臂章的電影 瀏覽:328
從哪找韓國電影 瀏覽:313
pdf轉換成ppt如何轉換 瀏覽:146
國內越南戰爭的電影 瀏覽:246
台灣好看的倫理電影 瀏覽:525
外遇的妻子2李采潭 瀏覽:954
365電影網站免費 瀏覽:785
網頁看電影不卡的網站 瀏覽:528
山西壓縮天然氣集團晉城有限公司 瀏覽:732
穿越到紅軍長征時期開超市 瀏覽:667
免費看電影無廣告網站 瀏覽:579
十降頭師電影 瀏覽:928
閱讀源碼真的有價值嗎 瀏覽:182
linux強制退出命令 瀏覽:322
韓國高分電影愛情推理片 瀏覽:445
同截面梁箍筋加密 瀏覽:220
肉一點的有聲小說 瀏覽:457