2016-07-15 110 views
0

我在matlab中繼承了一個代碼庫,我喜歡在unittest下使用matlab.unittest框架。在自己的matlab工具箱中使用unittest

爲了使代碼庫更加強大,可以防止用戶的任意添加路徑,我已經將大部分代碼放入+文件夾中,比如工具箱。所以總體佈局是:

+folder1/file1.m 
+folder1/runtestsuite.m 
+folder1/unittest_data/file1_testdata.mat 
+folder1/+folder2/file2.m 
+folder1/+folder2/unittest_data/file2_testdata.mat 
... 

並用正確的導入語句更新了所有內部引用。

現在,我想爲file1.m添加一個unittest。但是,如果我把一個文件放在+ folder1/file1_test.m file1.m似乎不可見。

這裏是file1_test.m

classdef file1_test < matlab.unittest.TestCase 
    properties 
     path 
    end 

    methods(TestMethodSetup)   
     function setunittestdatapath(testCase) 
      p = mfilename('fullpath'); 
      [directory,~,~]=fileparts(p);    
      testCase.path = fullfile(directory,'unittest_data'); 
     end 
    end 


    methods (Test) 
     function file1_input(testCase) 
      %import folder1.file1 
      testdata = load(fullfile(testCase.path),'file1_testdata.mat'); 
      result = file1(testdata.input); 
      testCase.verifyEqual(result, testdata.output); 
     end 

    end 
end 

我的示例代碼。如果我去掉import語句的單元測試工作正常。所以目前我必須將所有導入語句添加到每個單獨的測試中,這是我想避免的。有沒有更優雅的方式來做這樣的事情?

我試着在文件的開頭導入它,雖然matlab抱怨:「CLASSDEF處的解析錯誤:使用可能是無效的MATLAB語法。」這也適用。那麼做這種事情的正確和最務實的方式是什麼?

回答

0

import語句僅適用於使用它們的地方範圍,因此如果您希望某個函數不能使用全限定名稱,則必須分別將import語句添加到每個函數中。

導入列表範圍定義如下:

  • 腳本從MATLAB®命令提示調用 - 範圍是基本MATLAB工作區。

  • 函數,包括嵌套函數和本地函數 - 範圍是函數,函數不共享父函數的導入列表。如果MATLAB函數或腳本和任何本地函數中都需要導入列表,則必須調用每個函數的導入函數。

單元測試,雖然,我認爲它可能是最好使用完全合格的函數名稱每次(而不是依賴於import),因此它很清楚的用戶,你在做什麼測試。

result = folder1.file1(testdata.input) 
+0

我接受這個答案,雖然另一個也是很有趣的方法。在乾淨的代碼方面,這個解決方案很可能不是我所希望的。 – Bort

0

當前MATLAB中的import語句具有Suever在答案中提到的函數範圍。

不過,我經常用本地函數作爲一種解決方法模仿文件級導入:

classdef file1_test < matlab.unittest.TestCase 
    properties 
     path 
    end 

    methods(TestMethodSetup)   
     function setunittestdatapath(testCase) 
      p = mfilename('fullpath'); 
      [directory,~,~]=fileparts(p);    
      testCase.path = fullfile(directory,'unittest_data'); 
     end 
    end 


    methods (Test) 
     function file1_input(testCase) 
      %import folder1.file1 
      testdata = load(fullfile(testCase.path),'file1_testdata.mat'); 
      result = file1(testdata.input); 
      testCase.verifyThat(result, IsEqualTo(testdata.output)); 
     end 

    end 
end 

% Include file level "import" functions below 
function f = file1(varargin) 
f = folder1.file1(varargin{:}); 
end 

function c = IsEqualTo(varargin) 
c = matlab.unittest.constraints.IsEqualTo(varargin{:}); 
end 

注意,在這個例子中,我「進口」兩源代碼以及一些測試框架的源代碼以便使用verifyThat使用liteElement形式的verifyEqual。請注意,這是相同的功能行爲,但總的來說,constraints的功能比qualification methods多,所以這可能對您有所幫助。