仕様のための Glimmer DSL - 仕様第一のエンジニアリング


Ruby の非常に表現力豊かな性質にもかかわらず、Ruby で記述されたほとんどのテスト ツールキットは必須であり (例: assert または expect を使用)、したがって表現力が失われ、ソフトウェア エンジニアが間違ったことに集中するか、Ruby 以外のコード (例: キュウリとガーキン) が Ruby と混合されます.したがって、Ruby の単純さを逃しています.

Glimmer DSL for Specification は、シンプルで最小限の名詞ベースの宣言構文を提供することを目的としています.もう動詞はありません!命令ではなく宣言的に考える時が来ました!

そのため、ソフトウェア エンジニアは Requirements Specification レベルの Use Case に注目し、各ユース ケースは複数のシナリオで構成されています.シナリオのステップを指定する必要はありません.コードはステップです!!!

また、検証ステートメントで比較を行うための追加の DSL 構造は必要ありません.単純な古い Ruby を使用するだけで、残りはライブラリーに理解させてください!

例えば:

scenario 'Same-content strings are equal' do
  'string' == 'string'
end


それは、 assert または expect を必要とせずに全体の話をしています.比較を実行するための単純な Ruby コードが含まれているだけです.

もう一つの例:

scenario 'person name consists of first name and last name' do
  person = Person.new(first_name: 'Bob', last_name: 'Winfrey')

  fact { person.first_name == 'Bob' }
  fact { person.last_name == 'Winfrey' }
  person.name == 'Bob Winfrey'
end


これは、最終的な検証を示すシナリオの最後のステートメントに加えて、いくつかの追加の事実を示しています.ソフトウェア検証コードでさえ基本的なRubyで書かれているので、ソフトウェアエンジニアはもう嫌いな厄介な検証コードを書く必要はありません(例えば、アサートや期待).

String の等値/不等値の比較でファクトが失敗すると、ライブラリは比較された 2 つの String オブジェクトの値を自動的に出力します.

Glimmer DSL for Specification は、Specification-First Engineering の考え方を強調しています.ライブラリは、それ自体を利用する仕様優先で作成されました.実際、それを証明するために glimmer-dsl-specification の初期仕様がここにあります.

# From: https://github.com/AndyObtiva/glimmer-dsl-specification

require 'glimmer-dsl-specification'

class Person
  attr_reader :first_name, :last_name

  def initialize(first_name: , last_name: )
    @first_name = first_name
    @last_name = last_name
  end

  def name
    "#{first_name} #{last_name}"
  end
end

module Glimmer::Specification
  specification('Glimmer DSL for Specification') {
    use_case('Compare Two Objects for Equality') {
      scenario 'Same-content strings are equal' do
        'string' == 'string'
      end

      scenario 'Different-content strings are not equal' do
        'string1' != 'string2'
      end

      scenario 'Same-number integers are equal' do
        1 == 1
      end

      scenario 'Different-number integers are not equal' do
        1 != 2
      end
    }

    use_case('Verify Multiple Facts') {
      scenario 'person name consists of first name and last name' do
        person = Person.new(first_name: 'Bob', last_name: 'Winfrey')

        fact { person.first_name == 'Bob' }
        fact { person.last_name == 'Winfrey' }
        person.name == 'Bob Winfrey'
      end
    }
  }
end


ライブラリは非常に新しく実験的なものであるため、コースが大幅に変更される可能性があることに注意してください.また、大胆な野心的な声明にもかかわらず、ライブラリを改善するためにあなたのフィードバックが光を当てるのに役立つ明らかな盲点があるかもしれません.そのため、アイデアや提案は大歓迎です.