2013-03-02 57 views
4

正如我在做測試驅動開發我考慮是否一個假想的程序能夠完全生成的代碼基於測試開發。即是否有能力擁有專門創建代碼以通過測試的代碼生成器。編程語言的未來只是寫測試嗎?計劃寫在基於單元生成的代碼測試

+0

我不認爲這個問題是足夠具體的足以讓任何人提供一個合理的答案,不幸的是,除非現有的系統已經允許一個人做到這一點。 – Simon 2013-03-02 19:00:06

+0

你基本上描述了機器學習。 – 2018-01-02 19:53:15

回答

2

我認爲這將是一個艱難的一個作爲,至少對於這種技術的最初一代,開發人員會非常懷疑生成代碼的正確性。因此人類審查也必須涉及。

由於我是什麼意思一個簡單的例子,假設您編寫了10次測試的功能,具有樣本輸入和預期產出涵蓋你能想到的每一個場景。一個程序可以簡單地生成通過所有這些測試的代碼,只不過是一個基本的switch語句(您的十個輸入與它們的預期輸出相匹配)。此代碼顯然不是正確,但它需要一個人來看。

這只是一個簡單的例子。不難想象,更復雜的程序可能不會產生轉換語句,但仍會產生實際上不正確的解決方案,並且可能會以更微妙的方式出錯。因此,我的建議是,任何沿着這些方向發展的技術都會遇到一種深刻的懷疑,至少起初是如此。

0

雖然很可能在未來某個時候,簡單的測試可以用來生成代碼:

assertEquals(someclass.get_value(), true) 

,但得到從黑盒集成測試輸出正確的是什麼,我猜是一個NP完全問題:

assertEquals(someclass.do_something(1), file_content(/some/file)) 

assertEquals(someclass.do_something(2), file_content(/some/file)) 
assertEquals(someclass.do_something(2), file_content(/some/file2)) 

assertEquals(someclass.do_something(3), file_content(/some/file2)) 

這是否意味着生成的代碼將始終寫入/ some/file?這是否意味着生成的代碼應該總是寫入/ some/file2?要麼是真的。如果它只需要做最小的測試就可以通過測試呢?如果不瞭解上下文並寫出非常精確的邊界測試,那麼代碼就無法弄清楚(此時此刻)測試作者的意圖。

0

如果代碼可以完全生成,那麼生成器的基礎必須是精確描述代碼的規範。這個生成器就像編譯器一樣,將一種語言編譯成另一種語言。

測試不是這樣的語言。他們只聲稱代碼功能的一個特定方面是有效的和不變的。通過這樣做,他們腳手架的代碼,以便它不會中斷,即使它被重構。

但是,我會如何比較這兩種發展方式?

1)如果發生器工作正常,那麼規範總是被轉換成正確的代碼。我假設這個代碼是通過設計測試的,不需要額外的測試。比生成的代碼更好的TDD發生器。

2)你是否有一個規範,導致產生的代碼或規格表示爲測試,以確保代碼的作品在我眼中相當相當。

3)您可以結合兩種發展方式。用規範中的測試生成器生成程序框架,然後使用TDD豐富生成的代碼。注意:然後在一個項目中運行兩個不同的開發週期。這意味着,您必須確保在規格更改時始終可以重新生成生成的代碼,並確保您的其他代碼仍然正確地適合生成的代碼。

只是一個小例子:想象一下,可以從UML類圖生成代碼的工具。這可以通過TDD開發方法來完成,但類的結構在UML中定義,並且不需要再次測試。