使用Junit测试名称
命名測試
在創建Junit測試時,通常沒有實際使用該方法的名稱。 Junit運行程序使用反射來發現測試方法,并且從版本4開始,您不再被限制以test開始方法的名稱。 測試方法的名稱用于文檔目的。
人們遵循不同的風格。 您可以使用給定的given_Something_when_Something_then_Something樣式命名測試,我也遵循了一段時間。 其他學校開始了與世界的方法的名稱should來描述被測對象“應該”做的。 我真的不明白為什么這比用test開頭方法的名稱要好得多。 如果所有方法都以相同的前綴開頭,那么這僅僅是噪聲。 這些天來,我傾向于將這些方法命名為關于SUT功能的簡單陳述。
如何訪問測試名稱?
從技術上講,只要名稱是唯一的,您就可以自由命名方法。 測試中通常不使用該名稱,并且測試結果不應取決于測試方法的實際名稱。 即使Junit支持一種訪問方法名稱的方法。
如果您有Junit規則
@Rule public TestName name = new TestName();您可以在測試中引用對象name ,獲取實際方法的名稱為
String testName = name.getMethodName();我們可以用它做什么?
有時,被測單元會創建一些巨大的結構,可以序列化為二進制或文本文件。 通常的做法是運行一次測試,檢查結果文件,如果可以,則將其保存以供以后比較。 以后的測試執行將實際結果與開發人員保存并檢查的結果進行比較。
在集成測試的情況下,如果對外部系統進行打樁,并且可以從某些本地測試數據文件中獲取其響應,而不用查詢外部服務,則可以使用類似的方案。
在這種情況下,可以使用測試名稱來創建存儲測試數據的文件名。 測試的名稱是唯一的,可以輕松地將數據與需要它的測試配對。 我在jscglib庫中使用了這種方法。 該庫提供了流利的API來創建Java源代碼。 測試包含一些Java Builder模式導向器代碼,然后將生成的源代碼保存到文件中或與已存儲的結果進行比較。
要保存文件,使用了aux方法getTargetFileName
private String getTargetFileName() {String testName = name.getMethodName();String fileName = "target/resources/" + testName + ".java";return fileName;}要獲取資源名稱,使用了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;}}通常,這是我知道的唯一示例,您可以將測試方法的名稱用于除文檔之外的其他名稱。
您不應該使用的名稱
用我的語言說:“每個人都擅長某事。 至少表明失敗。” 下面的示例演示了這種失敗。
我已經看到了將測試數據編碼為測試方法名稱的代碼。 訪問測試方法名稱的方式也很奇怪。 程序員可能不知道有一種支持方法的方法。 缺乏知識可能阻止了他或她行惡,但這個人是個天才。 測試的測試方法是調用幫助程序類的靜態方法。 該靜態方法引發異常,它也捕獲了該異常,并查看了堆棧跟蹤以識別調用方方法的名稱。
在訪問了該名稱之后,該代碼應用了正則表達式以從方法名稱中提取值。
摘要
我不知道Junit開發人員打算給我們類TestName 。 可能有一些用例需要該功能。 我確信他們沒有提供功能,因為有可能這樣做。 如果您不知道所提供的API有什么用處,則可能不應該僅僅因為可以就提供它。 新手程序員會錯誤地使用它而不是好的。
另一方面,如果您在API中看到可以使用的內容,則并不意味著您應該使用該功能。 您應該更好地了解功能的目的,并相應地使用它。
編寫單元測試比命名它們更重要。 只要沒有單元測試,關于單元測試的命名的辯論就沒有用。
根據需要編寫單元測試,但不能更多。
翻譯自: https://www.javacodegeeks.com/2015/05/using-junit-test-name.html
總結
以上是生活随笔為你收集整理的使用Junit测试名称的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 办事机构备案表怎么填(办事机构备案表)
- 下一篇: 通用名称