




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1 預備知識1.1 可變長參數(shù)1.2 Assert1.3 Annoion2 1.簡介JUnit 是 Java 語言事實上的標準單元測試庫。JUnit 的易用性無疑是它受歡迎的主要原因。也許你會這樣想:它做的事情不多,僅僅是做一些測試然后結果,JUnit 應該是很簡單的。XP-敏捷編程-JUnit 4.x 是最初由Erich Gamma 和Kent Beck 編寫的,能夠自動化測試Java 代碼的框架,JUnit的一大主要特點是,它在執(zhí)行的時候,各個方法之間是相互獨立的,一個方法不會導致別的方法失敗,方法之間也不存在相互依賴的關系,彼此是獨立的。JUnit 4 是該庫以來最具里程碑意義的一次發(fā)布
2、。它的新特性主要是通過采用 Java 5 中的標記(Anno ion)而不是利用子類、反射或命名機制來識別測試,從而簡化測試。然而,JUnit 僅僅是一個工具而已。真正的優(yōu)勢來自于 JUnit 所采用的和技術,而不是框架本身。單元測試、測試先行的編程和測試驅動的開發(fā)并非都要在 JUnit 中實現(xiàn)。JUnit 本身的最后一次更新差不多是三年以前了。盡管它被證明比大多數(shù)框架更健壯、更持久,但是也發(fā)現(xiàn)了 bug;而更重要的是,Java 不斷在發(fā)展。Java 語言現(xiàn)在支持泛型(Raw Type)、枚舉(Enum)、可變長度參數(shù)列表和注釋,這些特性為可重用的框架設計帶來了新的可能。新版本的 JUnit,
3、它利用 Java 5 的新特性(尤其是注釋)的優(yōu)勢,使得單元測試比起用最初的JUnit 來說更加簡單。用 Beck 的話來說,“JUnit 4 的是通過進一步簡化 JUnit,鼓勵 JUnit 3.8 測試套件的向后兼容,但是的改進。編寫的測試?!盝Unit 4 盡管保持了與現(xiàn)有的開發(fā)它仍然承諾是自 JUnit 1.0 以來 Java 單元測試方面最2.1 一個最簡單的測試2.1.1 3.8 系列以前所有版本的 JUnit 都使用命名約定和反射來定位測試。例如,下面的代碼測試 1+1 等于2:import junit framework.TestCase;public class Additi
4、onTest extends TestCase privatex = 1;privatey = 1;public void testAddition() z = x + y;assertEquals(2, z);2.1.2 4.X 系列在 JUnit 4 中,測試是由 Test 注釋來識別的,如下所示:import.junit.Test;import junit framework.TestCase;public class AdditionTest extends TestCase privatex = 1;privatey = 1;Test public void testAddition
5、() z = x + y;assertEquals(2, z);使用注釋的優(yōu)點是不再需要將所有的方法命名為 testFoo()、testBar(),等等。而在 3.8 中如果你的方法不是以 test 開頭的,將不被解釋為測試方法。這允許您遵循最適合您的應用程序名約定。通過繼承TestCase 類的方式,仍然可以工作,但是您不再需要擴展它了。只要您用 Test 來注釋測試方法,就可以將測試方法放到任何類中。但是您需要導入 junit.Assert方法,如下所示:類以各種 assertimport.junit.Assert;public class AdditionTest privatex =
6、1;privatey = 1;Test public void addition() z = x + y;Assert.assertEquals(2, z);還可以使用 JDK 5 中新特性(sic import),使得與以前版本一樣簡單:import s ic.junit.Assert.assertEquals;public class AdditionTest privatex = 1;privatey = 1;Test public void addition() z = x + y;assertEquals(2, z);這種方法使得測試受保護的方法非常容易,因為測試案例類現(xiàn)在可以擴展包
7、含受保護方法的類了。2.2單元測試單元測試是由程序員編寫的,測試被測試代碼的某一個很小的、特定的功能區(qū)域的代碼。它可以用來確保在代碼或者程序運行的環(huán)境中發(fā)生變化后,已經(jīng)存在的功能還是能夠執(zhí)行的。2.3 在 Eclipse 中使用 JUnit準備創(chuàng)建一個新的工程,并增加JUnit 到庫到項目的BuildPath 中。創(chuàng)建一個普通類創(chuàng)建名字為MyClass的Java 文件牋牋牋牋牋牋public class MyClass 牋爌ublicmultiply(x,y) 牋牋牋 return x / y;牋爙創(chuàng)建測試類創(chuàng)建測試套件如果你有很多個測試,想要合并到一起來執(zhí)行,你可以創(chuàng)建一個 TestSuit
8、e.在一個 TestSuite 中的所有的測試將會被執(zhí)行。3 SetUp 和TearDown 及斷言方法3.1 3.8 系列JUnit 3 測試運行程序(test runner)會在運行每個測試之前自動調(diào)用 setUp() 方法。該方法一般會初始化字段,打開日志,重置環(huán)境變量, 等等。例如,下面是摘自 XOM 的XSLTransformTest 中的 setUp() 方法:protected void setUp() System.setErr(new PrStream(new ByteArrayOutputStream();inputDir = new File(data);inputDir
9、 = new File(inputDir, xslt);inputDir = new File(inputDir, input);在 JUnit 3 中,您使用 tearDown() 方法,該方法類似于我在 XOM 中為消耗大量內(nèi)存的測試所使用的方法:protected void tearDown() doc = null;System.gc();3.2 4.X 系列在 JUnit 4 中,您仍然可以在每個測試方法運行之前初始化字段和配置環(huán)境。然而,完成這些操作的方法不再需要叫做 setUp(),只要用 Before 注釋來指示即可,如下所示:Before protected void ini
10、tialize() System.setErr(new PrStream(new ByteArrayOutputStream();inputDir = new File(data);inputDir = new File(inputDir, xslt);inputDir = new File(inputDir, input);甚至可以用 Before 來注釋多個方法,這些方法都在每個測試之前運行:Before protected void findTestDataDirectory() inputDir = new File(data);inputDir = new File(inputDir
11、, xslt);inputDir = new File(inputDir, input);Before protected void redirectStderr() System.setErr(new PrStream(new ByteArrayOutputStream();對于 JUnit 4,我可以給它取一個更自然的名稱,并用 After 注釋它:Aftrotected void dise() doc = null;System.gc();與 Before 一樣,也可以用 After 來注釋多個清除方法,這些方法都在每個測試之后運行。最后,您不再需要在超類中顯式調(diào)用初始化和清除方法,只要
12、它們不被覆蓋即可,測試運行程序將根據(jù)需要自動為您調(diào)用這些方法。超類中的 Before 方法在子類中的 Before 方法之前被調(diào)用(這反映了構造函數(shù)調(diào)用的順序)。After 方法以反方向運行:子類中的方法在超類中的方法之前被調(diào)用。否則,多個 Before或 After 方法的相對順序就得不到保證。3.3 斷言方法3.8 系列,每一個類都繼承了一個叫做TestCase 的類,而TestCase 的父類是Assert 類4.x 系列,每一個可以不繼承任何的類,但是仍然可以直接使用importsic.junit.Assert.*;在 3.8 當中,所有的測試類必須都是 TestCase 的子類4.X
13、 中,測試類可以是一個普通類,也可以去繼承一個類或者實現(xiàn)一個接口要實現(xiàn)測試,只需要在要測試的方法之前加Test 注釋same 相同equal相等4 注釋(Annoions)表格 1 Annoions5 新的斷言JUnit 4 為比較數(shù)組添加了兩個 assert() 方法:Annoion含義Test public void method()定義一個要測試的方法Before public void method()在每一個測試之前都會被執(zhí)行的方法,這個方法常常用來進行一些測試環(huán)境的準備,比喻說讀入輸入數(shù)據(jù),初始化類Aftublic void method()與Before 進行對應,做一個工作Be
14、foreClass public void method()在所有的測試開始之前執(zhí)行,這個方法在類運行的時候運行,而且只會運行一次,所以常常用來做一些所有的方法都要依賴到工作,比喻說,數(shù)據(jù)庫的。AfterClass public void method()與BeforeClass 進行對應,做一些類級別的工作Ignore表明方法是被忽略的,這個方法非常實用,比喻你的方法已經(jīng) 修改,但是對應的測試方法還沒有得到一致的修改的時候,可以忽略掉這個測試方法先。Test(expected=IllegalArgumentException.c lass)檢查測試方法是不是拋出了對應的異常Test(time
15、out=100)如果方法的執(zhí)行操作所耗費的毫秒數(shù)100MS,那么方法失敗。public s ic void assertEquals(Object expected, Object actual)public s ic void assertEquals(String message, Object expected,Object actual)這兩個方法以最直接的方式比較數(shù)組:如果數(shù)組長度相同,且每個對應的元素相同,則兩個數(shù)組相等,否則不相等。數(shù)組為空的情況也作了考慮。6 套件范圍的初始化JUnit 4 也引入了一個 JUnit 3 中沒有的新特性:類范圍的 setUp() 和 tearDo
16、wn() 方法。任何用BeforeClass 注釋的方法都將在該類中的測試方法運行之前剛好運行一次, 而任何用AfterClass 注釋的方法都將在該類中的所有測試都運行之后剛好運行一次。例如,假設類中的每個測試都使用一個數(shù)據(jù)庫連接、一個網(wǎng)絡連接、一個非常大的數(shù)據(jù)結構,或者還有一些對于初始化和事情安排來說比較昂貴的其他資源。不要在每個測試之前都重新創(chuàng)建它,您可以創(chuàng)建它一次,并還原它一次。該方法將使得有些測試案例運行起來快得多。例如,當庫的代碼中的錯誤處理時,我通常喜歡在測試開始之前重定向 System.err,以我測試調(diào)用第便輸出不被預期的錯誤消息打亂。然后我在測試結束后還原它,如下所示:/
17、This class tests a lot of error conditions, which/ Xalan annoyingly logs to System.err. This hides System.err/ before each test and restores it after each test.private PrStream systemErr;BeforeClass protected void redirectStderr() systemErr = System.err; / Holto the original valueSystem.setErr(new P
18、rStream(new ByteArrayOutputStream();AfterClass protected void tearDown() / restore the original valueSystem.setErr(systemErr);沒有必要在每個測試之前和之后都這樣做。但是一定要對待這個特性。它有可能會測試。如果一個測試在某種程度上改變了 BeforeClass 所初始化的的獨立性,并引入非預期的一個對象,那么它有可能會影響其他測試的結果。它有可能在測試套件中引入順序依賴,并隱藏bug。與任何優(yōu)化一樣,只在剖析和基準測試證明您具有實際之后才實現(xiàn)這一點。這就是說,我看到了不止
19、一個測試套件運行時間如此之長,以至不能像它所需要的那樣經(jīng)常運行,尤其是那些需要建立很多網(wǎng)絡和數(shù)據(jù)庫連接的測試。(例如,LimeWire 測試套件運行時間超過兩小時。)要加快這些測試套件,以便程序員可以更加經(jīng)常地運行它們,您可以做的就是減少 bug。7 測試異常異常測試是 JUnit 4 中的最大改進。舊式的異常測試是在拋出異常的代碼中放入 try 塊,然后在try 塊的末尾加入一個 fail() 語句。例如,該方法測試被零除拋出一個 ArithmeticException:public void testDiviByZero() try n = 2 / 0;fail(Divided by ze
20、ro!);catch (ArithmeticException sucs) assertNotNull(sucs.getMessage();該方法不僅難看,而且試圖代碼覆蓋工具,因為不管測試是通過還是失敗,總有一些代碼不被執(zhí)行。在 JUnit 4 中,您現(xiàn)在可以編寫拋出異常的代碼,并使用注釋來該異常是預期的:Test(expected=ArithmeticException.class)public void divideByZero() n = 2 / 0;如果該異常沒有拋出(或者拋出了一個不同的異常),那么測試就將失敗。但是如果您想要測試異常的詳細消息或其他屬性,則仍然需要使用舊式的 tr
21、y-catch 樣式。8 可以忽略到測試也許您有一個測試運行的時間非常地長。不是說這個測試應該運行得更快,而是說它所做的工作從根本上比較復雜或緩慢。需要網(wǎng)絡服務器的測試通常都屬于這一類。如果您不在做可能會中斷該類測試的事情,那么您可能想要跳過運行時間長的測試方法,以縮短編譯-測試-調(diào)試周期?;蛘咭苍S是一個因為超出您的控制范圍的原因而失敗的測試。例如,W3C XInclude 測試套件測試 Java 還不支持的一些 Unicode 編碼的自動識別。不必老是被迫盯住那些紅色波浪線,這類測試可以被注釋為 Ignore,如下所示:/ Java doesnt yet support/ the UTF-3
22、2BE and UTF32LE encodingsIgnore public void testUTF32BE()throws ParsingException, IOException, XIncludeException File input = new File(data/xinclude/input/UTF32BE.xml);doc = builder.build(input);result = XIncluder.resolve(doc);expectedResult = builder.build(new File(outputDir, UTF32BE.xml);assertEqu
23、als(expectedResult, result);測試運行程序將不運行這些測試,但是它會這些測試被跳過了。但是一定要。最初編寫這些測試可能有一定的原因。如果忽略這些測試,那么它們期望測試的代碼可能會中斷,并且這樣的中斷可能不能被檢測到。忽略測試只是一個權宜之計,不是任何問題的真正解決方案。9 時間測試10 Failure 和 ErrorFailure 指的是由于預期的結果與實際運行的測試的結果不同而導致的實際運行單元的結果不同所導致,例如當使用 assertEquals()或其它 assert()方法斷言失敗時,就會報出 Failure,如果發(fā)現(xiàn)Faulure,你就要去檢查你的測試方法或
24、者是被測試方法中編寫的邏輯是否有誤。Error 指的是編寫程序時沒有考慮到。在執(zhí)試的斷言之前,程序就因為某種類型的意外 而 停 止 , 比 喻 說在 操 作 數(shù) 組 的 時 候 , 因 為 存 取 超 出 索 引 會ArrayIndexOutOfBoundsException,這個時候程序就會報出 Error,程序將無法運行下去,提前結束,這個時候你要檢查被測試方法中是不是有欠缺考慮到地方??匆粋€具體的例子:import junit.framework.TestCase;publicclass ObjectArrayTestextendsTestCase牋 publicvoid testAdd
25、() ObjectArray objArr牋牋牋=newObjectArray();牋牋牋 Object testObj = new Object();牋牋牋 Object obj = objArr.setObject(0, testObj);牋牋牋 assertEquals(testObj, obj);牋如果執(zhí)行這個測試的話,Eclipse 會提示你創(chuàng)建一個名字為 ObjectArray 的類,在其中要求你創(chuàng)建一個名字為 setObject 的方法。假設你創(chuàng)建的類的樣子如下:public class ObjectArray 牋 public Object setObject(testObj)
26、 i, Object牋爎 eturn null;牋如果現(xiàn)在你來運試的話,會出現(xiàn)以下類似的界面:大家注意看,里面報出了 Failures:1為什么呢?ObjecttestObj);obj=objArr.setObject(0,牋 assertEquals(testObj, obj);看這里的斷言,Object obj 這一行很明顯是可以運行的,只是返回的是一個 null 值,接下來,assertEquals(.)也是可以運行的,只不過期望值為 testObjc,而實際值為一個會有一個 failure 產(chǎn)生。這是很正常的一種現(xiàn)象。null,所以如果把被測試類改變一下:public class Ob
27、jectArray 牋 Object objs;牋 public Object setObject( testObj) i, Object牋爎 eturn objsi;牋將會產(chǎn)生如下的結果:那么為什么會產(chǎn)生這樣的?因為對源代碼做了修改以后,在執(zhí)行到ObjecttestObj);obj=objArr.setObject(0,牋 assertEquals(testObj, obj);時候,首先執(zhí)行 Object obj這句,在這一句的時候,被測試代碼中出現(xiàn)了 java.lang.NullPoerException異常,這個可以通過public sic void main(String args)牋
28、爅unit.textui.TestRunner.run(ObjectArrayTest.class);牋查看到:11Easy MockEasyMock 總覽接下來,讓我告訴大家如何使用 JUnit 和 EasyMock 框架來進行單元測試。的第一個例子非常簡單,但是在現(xiàn)實情況下,你通常是在一些類里使用另外的一些類。在進行真正的測試之前,你可能需要做很多的工作,比喻說安置大量的環(huán)境代碼,啟動一種大型的、復雜的系統(tǒng),可能是數(shù)據(jù)庫、功過劉或者是某一種類型的 IDE 環(huán)境,你的預設環(huán)境代碼需要是系統(tǒng)進入某種特定的狀態(tài),以便按照測試所需要的方法進行響應。但是這種工作不大可能很快就能完成。為了對一部分類進
29、行單元測試,你需要建立和控制另外一些類。最好的辦法就是為需要測試的類創(chuàng)建一個模擬對象。你可以自己手工的編寫類,也可以使用 EasyMock 來產(chǎn)生這些對象。模擬對象提供了一種經(jīng)過證明是成功的解決方案。當很難或不可能為某種難以處理的資源創(chuàng)建需要的狀態(tài)或者存取某種資源受限時,你就可以使用模擬對象。模擬對象取代真實對象的位置,用于測試一些與真實對象進行交互或依賴于真實對象的功能。模擬對象背后的基本就是創(chuàng)建輕量級的、可控制的對象來代替為了編寫測試為需要使用的對象。模擬對象還能夠讓你指定和測試你的代碼與模擬對象本身之間的交互。說的再直白一點,一個模擬對象就是一個簡單的接口或者是類,在里面你可以定義一個特
30、定的方法調(diào)用之后的簡單的輸出。使用 Junit 和 Easy Mock從 EasyMock 到主頁上EasyMock, 把得到的 easymock.jar 增加到你的 classpath 中。創(chuàng)建一個 Java 工程 JavaMockTest,創(chuàng)建下面的這些類。eCalculator 是要被測試的類,這個類用來根據(jù)一個人的職位來計算一個人的工資的方法。packagee;public enumition S, PROGRAMMER, SURFERpackagee.exceptions;public classitionException extends RuntimeException priv
31、ate sic final long serialVerUID = 1L;publicitionException(String message) super(message);packagee.exceptions;public class CalcMethodException extends RuntimeException private sic final long serialVerUID = 1L;public CalcMethodException(String message) super(message);packagee.method;importe.ition;publ
32、icerface ICalcMethod publicabstract double calc(itionition);packagee;importe.exceptions.CalcMethodException;importe.exceptions.itionException;importe.method.ICalcMethod;publicclasseCalculatorprivate ICalcMethod calcMethod;privateitionition;public void setCalcMethod(ICalcMethod calcMethod)this.calcMe
33、thod=calcMethod;publicvoid setition(itionition)this.ition =ition;publicdouble calc ()if (calcMethod=null)thrownew CalcMethodException(CalcMethod not yet maained);if (ition=null)thrownewitionException(ition not yet maained);return calcMethod.calc(ition);使用 Eclipse 的 JUnit 功能為eCalulator 創(chuàng)建一個測試。在例子中,我同
34、時創(chuàng)建一個新的源文件夾,名字為test,我把我創(chuàng)建的測試類全部放到里面。下面就是一個使用EasyMock 創(chuàng)建的測試。packagee;importsic.junit.Assert.assertEquals;importsic.junit.Assert.fail;importe.exceptions.CalcMethodException;importe.exceptions.itionException;importe.method.ICalcMethod;import.easymock.EasyMock;import.junit.Before;import.junit.Test;publi
35、cclasseCalculatorTest private ICalcMethod calcMethod;privateeCalculator calc;Beforepublic void setUp() throws Exception calcMethod = EasyMock.createMock(ICalcMethod.class);calc = neweCalculator();Testpublic void testCalc1() / Setting up the expected value of the method call calcEasyMock.expect(calcM
36、ethod.calc(ition.S).andReturn(70000.0).times(2);EasyMock.expect(calcMethod.calc(ition.PROGRAMMER).andReturn(50000.0);/ Setup is finished need to activate themockEasyMock.replay(calcMethod);calc.setCalcMethod(calcMethod);try calc.calc();fail(Exception did not occur); catch (itionException e) calc.set
37、ition(ition.S);assertEquals(70000.0, calc.calc();assertEquals(70000.0, calc.calc();calc.setition(ition.PROGRAMMER);assertEquals(50000.0, calc.calc();calc.setition(ition.SURFER);EasyMock.verify(calcMethod);Test(expected = CalcMethodException.class)public void testNoCalc() calc.setition(ition.SURFER);
38、calc.calc();Test(expected =itionException.class)public void testNoition() EasyMock.expect(calcMethod.calc(ition.S).andReturn(70000.0);EasyMock.replay(calcMethod);calc.setCalcMethod(calcMethod);calc.calc();Test(expected =itionException.class)public void testCalc2() / Setting up the expected value of
39、the method call calcEasyMock.expect(calcMethod.calc(ition.SURFER).andThrow(newitionException(t know this guy).times(1);/ Setup is finished need to activate the mockEasyMock.replay(calcMethod);calc.setition(ition.SURFER);calc.setCalcMethod(calcMethod);calc.calc();expect 方法告知 EasyMock 希望得到一個特定的方法,使用一些
40、特定的參數(shù),addReturn 為某一個方法定義返回值。times 方法定義了模擬對象將被調(diào)用幾次。 reply 方法需要在讓模擬對象可用之前被調(diào)用。執(zhí)行完測試之后,你可以調(diào)用 verify 方法來檢查模擬對象是不是跟預期的一樣被調(diào)用了。12 使用 HttpUnit 測試 Html測試 1:測試網(wǎng)頁是否存在要測試一個網(wǎng)頁是否存在,只要簡單的通過 WebConversation 的 getResponse()方法即可,例如:WebConversation webConversation = new WebConversation();webConversation.getResponse(牋牋牋
41、牋牋牋 );如果找不到網(wǎng)頁,則會產(chǎn)生一個 Error。HttpNotFoundException,由于不是斷言錯誤,所以這會在 JUnit 中測試 2:Get、t您可以分別使用GetMethodWebRequest 或tMethodWebRequest 來發(fā)出Get 或t 請求,例如:WebConversation webConversation = new WebConversation();WebRequest request =new GetMethodWebRequest();WebResponse response =webConversation.getResponse(request);要在請求中加上參數(shù),可以使用 setParamter()方法,例如:request.setParameter(username,ge);測試 3:取得表格信息您可以從 WebResponse 中取得相關的 HTML 信息,假設網(wǎng)頁中有如下這樣的一個表格:下面的程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國CDMA無線MODEM數(shù)據(jù)監(jiān)測研究報告
- 2025年中國3,4-二甲基苯胺數(shù)據(jù)監(jiān)測報告
- 2025至2030年中國鞋業(yè)連鎖店市場分析及競爭策略研究報告
- 2025至2030年中國鋁鏈市場分析及競爭策略研究報告
- 2025至2030年中國迷你卡車輪胎市場分析及競爭策略研究報告
- 2025至2030年中國藥品臺市場分析及競爭策略研究報告
- 2025至2030年中國網(wǎng)狀閥片市場分析及競爭策略研究報告
- 2025至2030年中國碳鋼焊接管件市場分析及競爭策略研究報告
- 2025至2030年中國電動速控拋光拉絲機市場分析及競爭策略研究報告
- 2025至2030年中國靈巧型光功率計市場分析及競爭策略研究報告
- 鉛鋅礦資源的地質(zhì)儲量評價與經(jīng)濟前景分析
- 超市開店策劃方案
- 成都市四級服務標準
- TB-T 3355-2023 軌道檢測 軌道幾何狀態(tài)動態(tài)檢測
- 自來水廠操作規(guī)程手冊
- 天翼云從業(yè)者認證考試題庫
- 中國風中醫(yī)藥文化PPT模板
- 2022-2023學年廣西北海市七年級(下)期末地理試卷(含解析)
- 醫(yī)院戰(zhàn)略管理如何制定醫(yī)院戰(zhàn)略規(guī)劃講座
- 部編版語文二年級下冊第4單元童心童趣大單元整體作業(yè)設計
- 娛樂場所文明服務責任書
評論
0/150
提交評論