您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
JUnit擴(kuò)展:引入新注解Annotation
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2015/4/17 10:48:13 ] 推薦標(biāo)簽:Junit 單元測試 Annotation

  然后再實(shí)現(xiàn)各個(gè)注解自定義Filter類,實(shí)現(xiàn)Filter的shouldRun方法定義, 以Sprint為例:
/**
* Filter rules for the annotation {@link Sprint}
*
* @author Carl Ji
*
*/
public class FilterSprint extends Filter
{
private String tgValue = null;
private Boolean _isOnly = false;
public FilterSprint(String targetValue)
{
setTgValue(targetValue);
}
public FilterSprint(String targetValue, Boolean isOnly)
{
setTgValue(targetValue);
_isOnly = isOnly;
}
public FilterSprint()
{
// TODO Auto-generated constructor stub
}
public Boolean getIsOnly()
{
return _isOnly;
}
public void setIsOnly(Boolean isOnly)
{
this._isOnly = isOnly;
}
public String getTgValue()
{
return tgValue;
}
public void setTgValue(String tgValue)
{
this.tgValue = tgValue;
}
@Override
public boolean shouldRun(FrameworkMethod method)
{
Sprint aSprint = method.getAnnotation(Sprint.class);
return filterRule(aSprint);
}
@Override
public boolean shouldRun(Description description)
{
if(description.isTest())
{
Sprint aSprint = description.getAnnotation(Sprint.class);
return filterRule(aSprint);
}
else
{
return true;
}
}
@Override
public String describe()
{
// TODO Auto-generated method stub
return null;
}
// Implement of filter rule for Sprint Annotation
private boolean filterRule(Sprint aSprint)
{
if(_isOnly)
{
if(aSprint != null && aSprint.value().equalsIgnoreCase(tgValue))
{
return true;
}
else
{
return false;
}
}
else
{
if(aSprint == null)
{
return true;
}
else
{
if(0 >= new StringComparator().compare(aSprint.value(), tgValue))
{
return true;
}
}
}
return false;
}
  我這里多了個(gè)isOnly屬性,是為了解決歷史遺留的問題。很多以前的Case并沒有我們加上新自定義的注解,那么可以通過這個(gè)屬性來定義這些Case要不要執(zhí)行。
  當(dāng)然核心的Filter的方法,還是要看大家各自的需求,自行設(shè)定。
  優(yōu)化,第二個(gè)解決辦法
  上面的實(shí)現(xiàn)方法做了很多工作,比如你要擴(kuò)展JunitCore類,擴(kuò)展Request 類,擴(kuò)展RunnerBuilder類,還要擴(kuò)展BlockJunit4ClassRunner類,那么研究過JUnit源碼的童鞋可能知道,JUnit是提供入口讓我們?nèi)プ⑷隖ilter對象。具體是在ParentRunner類里的下面方法:
//
// Implementation of Filterable and Sortable
//
public void filter(Filter filter) throws NoTestsRemainException {
for (Iterator<T> iter = getFilteredChildren().iterator(); iter.hasNext(); ) {
T each = iter.next();
if (shouldRun(filter, each)) {
try {
filter.apply(each);
} catch (NoTestsRemainException e) {
iter.remove();
}
} else {
iter.remove();
}
}
if (getFilteredChildren().isEmpty()) {
throw new NoTestsRemainException();
}
}
  那其實(shí)我們只要把我們自定義的Filter對象傳進(jìn)來,我們的需求也實(shí)現(xiàn)了。
public class FilterCollections extends Filter
{
List<Filter> filters = null;
public FilterCollections(String intent)
{
try
{
filters = FilterFactory.createFilters(intent);
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
}
@Override
public boolean shouldRun(Description description)
{
List<Boolean> result = new ArrayList<Boolean>();
for(Filter filter : filters)
{
if(filter != null && filter.shouldRun(description))
{
result.add(true);
}
else
{
result.add(false);
}
}
if(result.contains(false))
{
return false;
}
else
{
return true;
}
}
上一頁123下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd