当前位置: 代码迷 >> Web前端 >> Fitnesse应用
  详细解决方案

Fitnesse应用

热度:474   发布时间:2012-06-27 14:20:09.0
Fitnesse使用

Fitnesse 的使用
一,介绍
Fitnesse是一种可以有效提供给软件开发前期各种角色合作的框架。
前端采用wiki界面便于编写case,后端将具体执行可以比较方便的添加各种feature。
前端case和后端feature共同作用起来就可以实现自动化测试。

二,原理
如何使wiki形式的case,驱动后端的class执行具体的代码,是Fitnesse的主要实现,现在存在两种方式

Fit: Framework for Integrated Testing
Fit是采用来控制Fitnesse test table执行的引擎。后台新添加的case需要引用该引擎。
Test table的格式也是来源于Fit。

Slim:Simple List Invocation Method
??????????? instruction list?
+-------------+??? o--->???? +--------------------+????? +----------+?????? +-----------------------------------------+
| FitNesse |---[socket]-->| SlimServer |----->| Fixtures |------>| SUT(System Under test) |?
+-------------+??? <---o???? +--------------------+????? +----------+?????? +-----------------------------------------+?
????????????? response list

1)FitNesse通过命令行的方式触发slim Server
2)Fitnesse随后会发一个命令的list以及期待的结果到SlimServer。
3)然后slimServer会去调用相应的Fixture。

对各语言的支持情况:

?


三,内部包含的Fixture

Slim: simple list Invocation method

http://fitnesse.org/FitNesse.UserGuide.SliM.SlimProtocol

Fit:http :// fitnesse.org / FitNesse.UserGuide.FitFramework


四,添加Feature
1)Java API
采用Fit模式:
自己新建的fixture需要继承Fit中的一种Fixture

例如:

Package eg;
import?fit.ColumnFixture; ??
?
public?class?Division?extends?ColumnFixture ??
{ ??
?? public?double?numerator;???
???public?double?denominator; ??
???public?double?quotient()?{ ??
???????return?numerator/denominator; ??
????} ??
}
?
在wiki界面上就可以调用

?

如果采用slim模式:

我们需要添加的fixture:

package fitnesse.slim.test;

import java.util.List;
public class ShouldIBuyMilk {
private int dollars;
private int pints;
private boolean creditCard;

public void setCaseInWallet(int dollars){
this.dollars=dollars;
}
public void setPintsOfMilkRemaining(int pints){
this.pints=pints;
}
public void setCreditCard(String valid){
if(valid == "yes")
creditCard = true;
else
creditCard = false;
}
public String goToStore(){
if (pints==0&&(dollars>2||creditCard))
return "yes";
else
return "no";
}
?public void execute() {? }
?public void reset() {? }?
?public void table(List<List<String>> table) {}


}

添加wiki并执行就是这样的结果:

?

2)C++的支持:

为了实现对C++测试的支持,Fitnesse存在Fit的C++版本,便于新的C++ feature的加入

?我们需要下载CppTestTool,然后在同级目录下建立结构:

比如: addTest-----|-------bin

??????????????????????????????????? |-------CppTestTools

????????????????????????????????????|-------include

??????????????????????????????????? |-------lib

??????????????????????????????????? |-------src

在src中添加我们需要的new feature

一旦触发wiki上的开始按钮,fitnesse就会给FitServer法请求,Fit就会去调用我们新加的这部分feature。

首先是main函数,int main(int argc, char* argv[])
{
?FixtureMaker* maker = new HomeGuardFixtureMaker();
?int status = FitnesseServer::Main(argc, argv, maker);
?return status;
}

在main函数中就会把用大的feature都注册过来

#include <Fit/Platform.h>
#include <Fit/Fit.h>
#include <Fit/Summary.h>
#include <Fit/ResolutionException.h>

#include "MgmtFixtureMaker.h"

#include "addsampletest.h"


#include <iostream>
#include <string>

using namespace std;

HomeGuardFixtureMaker::HomeGuardFixtureMaker()
{
}

HomeGuardFixtureMaker::~HomeGuardFixtureMaker()
{
}

Fixture* HomeGuardFixtureMaker::make(const string& fullName)
{

?string name = fullName;
?? string libraryName = splitName(fullName).first;
??? if (libraryName != fullName)
??????? name = splitName(fullName).second;

??? PUBLISH_FIXTURE(Fixture);
??? PUBLISH_FIXTURE(ColumnFixture);
??? PUBLISH_FIXTURE(ActionFixture);
??? PUBLISH_FIXTURE(PrimitiveFixture);
??? PUBLISH_FIXTURE(Summary);

?// mgmt test
?PUBLISH_FIXTURE(addsampleTest)

??? throw ResolutionException(name);

??? return 0;
}

?

?


我们的新feature主体,需要用到的方法名,同样需要声明

#include <string>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <map>

#include <Fit/ActionFixture.h>
class addsampleTest : public Fixture
{
public:
??? addsampleTest()
?{ PUBLISH_ENTER(addsampleTest, std::string, addstring1);
?? PUBLISH_ENTER(addsampleTest, std::string, addstring2);
?? PUBLISH_ENTER(addsampleTest, std::string, addpath);
?? PUBLISH_CHECK(addsampleTest, std::string, runTest);
?}

void addstring1(std::string input){
?? string1 = input;???
}
?void addstring2(std::string input){
?? string2 = input;
}
void addpath(std::string input){
?? path=input;
}
?std::string runTest(){
?? string command="";
?? command=path+" "+string1+" "+string2+">ll.log";
??
?? int tmp = system(command.c_str());
?? return "success";
}
private:
?? std::string string1;
??? std::string string2;
??? std::string path;
};

这样wiki界面上就可以直接调用了:

?

?

  相关解决方案