使用Junit测试名称
命名測(cè)試
在創(chuàng)建Junit測(cè)試時(shí),通常沒(méi)有實(shí)際使用該方法的名稱(chēng)。 Junit運(yùn)行程序使用反射來(lái)發(fā)現(xiàn)測(cè)試方法,并且從版本4開(kāi)始,您不再被限制以test開(kāi)始方法的名稱(chēng)。 測(cè)試方法的名稱(chēng)用于文檔目的。
人們遵循不同的風(fēng)格。 您可以使用給定的given_Something_when_Something_then_Something樣式命名測(cè)試,我也遵循了一段時(shí)間。 其他學(xué)校開(kāi)始了與世界的方法的名稱(chēng)should來(lái)描述被測(cè)對(duì)象“應(yīng)該”做的。 我真的不明白為什么這比用test開(kāi)頭方法的名稱(chēng)要好得多。 如果所有方法都以相同的前綴開(kāi)頭,那么這僅僅是噪聲。 這些天來(lái),我傾向于將這些方法命名為關(guān)于SUT功能的簡(jiǎn)單陳述。
如何訪問(wèn)測(cè)試名稱(chēng)?
從技術(shù)上講,只要名稱(chēng)是唯一的,您就可以自由命名方法。 測(cè)試中通常不使用該名稱(chēng),并且測(cè)試結(jié)果不應(yīng)取決于測(cè)試方法的實(shí)際名稱(chēng)。 即使Junit支持一種訪問(wèn)方法名稱(chēng)的方法。
如果您有Junit規(guī)則
@Rule public TestName name = new TestName();您可以在測(cè)試中引用對(duì)象name ,獲取實(shí)際方法的名稱(chēng)為
String testName = name.getMethodName();我們可以用它做什么?
有時(shí),被測(cè)單元會(huì)創(chuàng)建一些巨大的結(jié)構(gòu),可以序列化為二進(jìn)制或文本文件。 通常的做法是運(yùn)行一次測(cè)試,檢查結(jié)果文件,如果可以,則將其保存以供以后比較。 以后的測(cè)試執(zhí)行將實(shí)際結(jié)果與開(kāi)發(fā)人員保存并檢查的結(jié)果進(jìn)行比較。
在集成測(cè)試的情況下,如果對(duì)外部系統(tǒng)進(jìn)行打樁,并且可以從某些本地測(cè)試數(shù)據(jù)文件中獲取其響應(yīng),而不用查詢(xún)外部服務(wù),則可以使用類(lèi)似的方案。
在這種情況下,可以使用測(cè)試名稱(chēng)來(lái)創(chuàng)建存儲(chǔ)測(cè)試數(shù)據(jù)的文件名。 測(cè)試的名稱(chēng)是唯一的,可以輕松地將數(shù)據(jù)與需要它的測(cè)試配對(duì)。 我在jscglib庫(kù)中使用了這種方法。 該庫(kù)提供了流利的API來(lái)創(chuàng)建Java源代碼。 測(cè)試包含一些Java Builder模式導(dǎo)向器代碼,然后將生成的源代碼保存到文件中或與已存儲(chǔ)的結(jié)果進(jìn)行比較。
要保存文件,使用了aux方法getTargetFileName
private String getTargetFileName() {String testName = name.getMethodName();String fileName = "target/resources/" + testName + ".java";return fileName;}要獲取資源名稱(chēng),使用了getResourceName方法:
private String getResourceName() {String testName = name.getMethodName();return testName + ".java";}之后,加載和保存生成的Java代碼變得輕而易舉:
private void saveGeneratedProgram(String actual) throws IOException {File file = new File(getTargetFileName());file.getParentFile().mkdirs();FileOutputStream fos = new FileOutputStream(file);byte[] buf = actual.getBytes("utf-8");fos.write(buf, 0, buf.length);fos.close();}private String loadJavaSource() {try {String fileName = getResourceName();InputStream is = this.getClass().getResourceAsStream(fileName);byte[] buf = new byte[3000];int len = is.read(buf);is.close();return new String(buf, 0, len, "utf-8");} catch (Exception ie) {return null;}}通常,這是我知道的唯一示例,您可以將測(cè)試方法的名稱(chēng)用于除文檔之外的其他名稱(chēng)。
您不應(yīng)該使用的名稱(chēng)
用我的語(yǔ)言說(shuō):“每個(gè)人都擅長(zhǎng)某事。 至少表明失敗。” 下面的示例演示了這種失敗。
我已經(jīng)看到了將測(cè)試數(shù)據(jù)編碼為測(cè)試方法名稱(chēng)的代碼。 訪問(wèn)測(cè)試方法名稱(chēng)的方式也很奇怪。 程序員可能不知道有一種支持方法的方法。 缺乏知識(shí)可能阻止了他或她行惡,但這個(gè)人是個(gè)天才。 測(cè)試的測(cè)試方法是調(diào)用幫助程序類(lèi)的靜態(tài)方法。 該靜態(tài)方法引發(fā)異常,它也捕獲了該異常,并查看了堆棧跟蹤以識(shí)別調(diào)用方方法的名稱(chēng)。
在訪問(wèn)了該名稱(chēng)之后,該代碼應(yīng)用了正則表達(dá)式以從方法名稱(chēng)中提取值。
摘要
我不知道Junit開(kāi)發(fā)人員打算給我們類(lèi)TestName 。 可能有一些用例需要該功能。 我確信他們沒(méi)有提供功能,因?yàn)橛锌赡苓@樣做。 如果您不知道所提供的API有什么用處,則可能不應(yīng)該僅僅因?yàn)榭梢跃吞峁┧?新手程序員會(huì)錯(cuò)誤地使用它而不是好的。
另一方面,如果您在API中看到可以使用的內(nèi)容,則并不意味著您應(yīng)該使用該功能。 您應(yīng)該更好地了解功能的目的,并相應(yīng)地使用它。
編寫(xiě)單元測(cè)試比命名它們更重要。 只要沒(méi)有單元測(cè)試,關(guān)于單元測(cè)試的命名的辯論就沒(méi)有用。
根據(jù)需要編寫(xiě)單元測(cè)試,但不能更多。
翻譯自: https://www.javacodegeeks.com/2015/05/using-junit-test-name.html
總結(jié)
以上是生活随笔為你收集整理的使用Junit测试名称的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 办事机构备案表怎么填(办事机构备案表)
- 下一篇: 通用名称