Rspec 是Ruby社区的主流测试框架,今天简单玩了一下,觉得有几个特性是十分值得借鉴的

### 树状的用例组织结构

我们知道很多测试用例工具,例如:testlink ,其测试用例组织是树状的,但是,我之前接触到的测试框架,例如:TestNg ,它是无法支持这种用例组织结构的

Rspec却可以!

简单的讲,Rspec可以仅由 describeit 两种语句块构成

– 首先声明,Rspec是基于BDD 测试思想的,并没有传统意义上的测试用例(testcase) 的概念
– describe可以层层嵌套describe及it,从而构成树状结构
– it语句块是这棵树的叶子节点,功能上接近于测试用例这个概念,用例断言(Assertion)一般就在这里面
– 还是看示例吧

先看代码,描述的是一盏飞利浦台灯在出厂之路上所经历的种种测试

# encoding: utf-8

describe 'PHILIPS台灯 - 出厂质检' do
  # Rspec是一门测试DSL 但其中可以夹杂原生Ruby代码 比如这个echo()函数
  def echo(input)
    puts input
  end

  # Rspec与TestNG/JUnit一样 也有类似before/after的hook
  # 其作用范围为其所在的describe
  # before在it语句块之前执行
  before(:each) do
    echo '--- 开始本次测试 ---'
  end

  # after在it语句块之后执行
  after(:each) do
    echo "--- 结束本次测试 ---\n\n"
  end

  it "冒烟测试(插电源 - 开开关 - 灯亮了)" do
    echo '插电源 - 开开关 - 灯亮了'
  end

  # describe可以与it语句块并列 例如 "冒烟测试" 与 "正向测试"
  # describe可以层层嵌套 从测试用例组织的角度讲 就是构成了一个树状结构
  describe '正向测试' do

    describe '发光性' do
      # it语句块接近于传统意义上的testcase
      it '亮度可以调节' do
        echo 'min-1-2-3-4-5-max'
      end
      it '最大亮度不得超过10000' do
        echo 'no more than 1w'
      end
      it "只能发射白色光" do
        echo 'white light'
      end
    end

    describe '节能性' do
      it "符合国家节能标准" do
        echo '符合国标'
      end
      it "每小时耗电不多于0.000001度" do
        echo '0.000001kwh'
      end
    end

  end

  describe '异常测试' do

    # 这里的before hook就只能作用在'异常测试'describe之内了
    before(:each) do
      echo '--- 准备一盏全新台灯 ---'
    end

    describe '破坏性测试' do
      it '榔头砸不坏' do
        echo '榔头砸不坏'
      end
      it '泡水里不短路' do
        echo '泡水里不短路'
      end
    end

    describe '耐久性测试' do
      it '连续使用七天七夜不灭' do
        echo '连续使用七天七夜不灭'
      end
      it '风吹雨打也不能阻止我发光' do
        # 对于未完成的用例 可以先把描述写下来 具体的用例里面使用pending关键字占位
        pending '这个用例待完成'
      end
    end

  end

end

再看一下运行结果报表,两相对照,用例的树状结构一目了然 🙂

RSpec results 2013-12-08 23-32-35

### 用例命名简单化,且有实际含义

之前写用例,用例命名是一个十分关键但也很头疼的工作,大家懂得 🙁

而Rspec本质上是一门DSL (Domain Specific Language),实际上,从上面的示例代码和运行结果截屏中大家已经可以看到,在Rspec中是无须给测试用例命名的,或者说,用例的命名可以非常书面化,一般就是用例意图的简单描述(即:describe及it关键字后面跟着的描述性语句

### 支持未完成的用例先占位

不解释,还是看图

对于未完成的用例,可以先把描述写下来,具体的用例步骤里面使用pending关键字占位

      it '风吹雨打也不能阻止我发光' do
        # 对于未完成的用例 可以先把描述写下来 具体的用例里面使用pending关键字占位
        pending '这个用例待完成'
      end

 

反映在用例报表中,这个用例就被标志为黄色
树状的用例组织结构/用例命名简单化/支持未完成的用例先占位,这三个特性使得使用Rspec编写测试用例时,思路可以非常自由,开阔,很像是在写markdown ,来不及的地方,也可以先使用pending 占位

写完以后,跑一遍用例,生成的html报表可读性很强,可以直接用于策划,开发,测试之间的沟通(必杀技,有木有!)

### 其它不错的特性

Rspec是一门DSL,但它仍旧支持在用例中参杂原生Ruby代码,如下所示

Rspec与TestNG/JUnit一样,也有类似before/after的hook(如下所示),其作用范围是当前的describe

由于describe允许层层嵌套,因此,Rspec中的before/after的作用域也是层层嵌套的,比之TestNG的Before/After,灵活性大大超过

describe 'PHILIPS台灯 - 出厂质检' do
  # Rspec是一门测试DSL 但其中可以夹杂原生Ruby代码 比如这个echo()函数
  def echo(input)
    puts input
  end

  # Rspec与TestNG/JUnit一样 也有类似before/after的hook
  # 其作用范围为其所在的describe
  # before在it语句块之前执行
  before(:each) do
    echo '--- 开始本次测试 ---'
  end

  # after在it语句块之后执行
  after(:each) do
    echo "--- 结束本次测试 ---\n\n"
  end

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注