⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firstdlg.cpp

📁 分别用贪心算法和启发式算法对测试用例集进行了最小化。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				if(vec_TC_Node[kk].Node==vect1[kkk])break;
				else if(kkk==vect1.size()-1)
					vect1.push_back(vec_TC_Node[kk].Node);
			}
		}
//显示分化后的vec_TC_Node文件
		xmlNode.AddElem("节点");
		xmlNode.IntoElem();
		xmlNode.AddElem("TestedNode",vect1.size());
		float ratio=(100*vect1.size())/50;
		xmlNode.AddElem("TestedRatio",ratio);
		for(int tt=0;tt<vec_TC_Node.size();tt++)
		{
			xmlNode.AddElem("TC");
			xmlNode.AddAttrib("TC_ID",vec_TC_Node[tt].tcid);
			xmlNode.AddAttrib("Node",vec_TC_Node[tt].Node);
			xmlNode.AddAttrib("time",vec_TC_Node[tt].time);
			xmlNode.AddAttrib("reverse",vec_TC_Node[tt].reverse);

		}
		xmlNode.OutOfElem();
		xmlNode.Save("xmlNode.xml");

//显示分化后的vec_TC_Seg文件
		xmlSeg.AddElem("段");
		xmlSeg.IntoElem();
		for(int mm=0;mm<vec_TC_Seg.size();mm++)
		{
			xmlSeg.AddElem("TC");
			xmlSeg.AddAttrib("TC_ID",vec_TC_Seg[mm].tcid);
			xmlSeg.AddAttrib("segment",vec_TC_Seg[mm].segment);
			xmlSeg.AddAttrib("time",vec_TC_Seg[mm].time);
	
		}
		xmlSeg.OutOfElem();
		xmlSeg.Save("xmlSeg.xml");
///////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////

		//使用贪心算法对测试用例集进行优化
		xmlMinGreedy.AddElem("TS");
		xmlMinGreedy.IntoElem();
//		xmlMinGreedy.AddElem("优化后的用例");
		vect2.push_back(vec_TC_Node[0].Node);
		int node_time=0;


		while(vect2.size()*100/50<98)
		{
			int max=0;
			int id=0;
			int id_temp=0;
//			int index=0;//当前第index个TC符合要求
//			int 
//			float ratio_before=0;
//			float ration_back=0;
			for(int j=0;(j<TestSuite.size())&&(TestSuite[j].TC_Node_Count!=0);j++)
			{//对于TestSuite检查
				int ratio_middle=0;
				
				for(int jj=0;jj<TestSuite[j].TC_Node_Count;jj++)//TestSuite中每个用例TC
				{
					for(int jjj=0;jjj<vect2.size();jjj++)
					{//检查是否与vect1中某个值相同
						if(TestSuite[j].NodeList[jj]==vect2[jjj])break;//若此数据已经存在,检查TC中下一个Node
						else if(jjj==(vect2.size()-1))
						{//记录还未存在的Node个数以及这些Node对应的TestSuite中的id
							ratio_middle++;
							id_temp=j;
						}
					}
				}
//找出覆盖率增加最大的用例的id,存放于vect3中
				if(max<ratio_middle)
				{
						max=ratio_middle;
						id=id_temp;
						
				}
				else if(max==ratio_middle)
				{
					if(TestSuite[id].Time>TestSuite[id_temp].Time)
					{
						max=ratio_middle;
						id=id_temp;
						
					}
				}					
			}
			vect3.push_back(TestSuite[id].TC_ID);
			node_time+=TestSuite[id].Time;
				
//将当前覆盖率增加最大的用例中的Node加入到vect2中
				for(int ijj=0;ijj<TestSuite[id].TC_Node_Count;ijj++)//
					for(int ijjj=0;ijjj<vect2.size();ijjj++)
					{//
						if(TestSuite[id].NodeList[ijj]==vect2[ijjj])break;//
						else if(ijjj==vect2.size()-1)
						{//
							vect2.push_back(TestSuite[id].NodeList[ijj]);
							FILE * fp=fopen("aaa.txt","w");
							fprintf(fp,"%d",vect2.size());
							fclose(fp);
							
						}
					}
//			xmlMinGreedy.AddChildElem("TCID",TestSuite[id].TC_ID);
//			TestSuite[id].TC_Node_Count=0;
		}//while(vect2.size()*100/50<85);
		
		xmlMinGreedy.AddElem("总时间",node_time);
		xmlMinGreedy.AddElem("优化后的用例");
		xmlMinGreedy.AddAttrib("总数",vect3.size());
		for(int iijj=0;iijj<vect3.size();iijj++)
		{
			xmlMinGreedy.AddChildElem("Node",vect3[iijj]);		
		}

		xmlMinGreedy.AddElem("所有被覆盖的节点");
		xmlMinGreedy.AddAttrib("总数",vect2.size());
		for(int iij=0;iij<vect2.size();iij++)
		{
			xmlMinGreedy.AddChildElem("Node",vect2[iij]);		
		}
		xmlMinGreedy.OutOfElem();
		xmlMinGreedy.Save("xmlMinGreedy.xml");
		
		
		

///////////////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////////////////////////////
/*
			//对vec_TC_Node进行排序

		squen_TC_Node.assign(1000,0);
			for(int n=0;n<vec_TC_Node.size();n++)
			{
				vector<TC_Node_Node>::iterator inter_left = squen_TC_Node.begin();// 准备
				vector<TC_Node_Node>::iterator inter_right = squen_TC_Node.end();
                //int =0;
				int left=0;
				int right=squen_TC_Node.size()-1;

				int middle=0;
				while( right >= left)// 二分法查找插入位置
				{
					middle=(left+right)/2;
					inter_Node = squen_TC_Node.begin()+squen_TC_Node.size()/2;
					 // 指向已排序好的中间位置
					if( vec_TC_Node[n].Node < squen_TC_Node[middle].Node )// 即将插入的元素应当在在左区间
					{
						right = middle-1;
						inter_left=inter_Node-1;
					}
					else                    // 即将插入的元素应当在右区间
					{
						left = middle+1;
						inter_right=inter_Node+1;
					}
				 }
          
				squen_TC_Node.insert(inter_Node,vec_TC_Node[n]);// 插入
			}

			//显示squen_TC_Node中的内容
			xmlNodeSequen.AddElem("TS");
			xmlNodeSequen.IntoElem();
			

			
			for(int ii=0;ii<squen_TC_Node.size();ii++)
			{
				xmlNodeSequen.AddElem("TC");
				xmlNodeSequen.AddAttrib("TC_ID",squen_TC_Node[ii].tcid);
				xmlNodeSequen.AddAttrib("Node",squen_TC_Node[ii].Node);
				xmlNodeSequen.AddAttrib("time",squen_TC_Node[ii].time);
			}
			xmlNodeSequen.OutOfElem();
			xmlNodeSequen.Save("xmlNodeSequen.xml");

			//对vec_TC_Seg进行排序
			for(int m=0;m<vec_TC_Seg.size();m++)
			{
				vector<TC_Seg_Node>::iterator inter_left = squen_TC_Seg.begin();// 准备
				vector<TC_Seg_Node>::iterator inter_right = squen_TC_Seg.end();

				int left=0;
				int right=squen_TC_Seg.size()-1;

				int middle=0;
				while( right >= left)// 二分法查找插入位置
				{
					middle=(left+right)/2;
					inter_segment = squen_TC_Seg.begin()+squen_TC_Seg.size()/2;
					 // 指向已排序好的中间位置
					if( vec_TC_Seg[m].segment < squen_TC_Seg[middle].segment )// 即将插入的元素应当在在左区间
					{
						right = middle-1;
						inter_left=inter_segment-1;
					}
					else                    // 即将插入的元素应当在右区间
					{
						left = middle+1;
						inter_right=inter_segment+1;
					}
				 }
          
				squen_TC_Seg.insert(inter_segment,vec_TC_Seg[m]);// 插入
			}

			//显示squen_TC_Seg中的内容
			xmlSegSequen.AddElem("TS");
			xmlSegSequen.IntoElem();
			for(int jj=0;jj<squen_TC_Seg.size();jj++)
			{
				xmlSegSequen.AddElem("TC");
				xmlSegSequen.AddAttrib("TC_ID",squen_TC_Seg[jj].tcid);
				xmlSegSequen.AddAttrib("segment",squen_TC_Seg[jj].segment);
				xmlSegSequen.AddAttrib("time",squen_TC_Seg[jj].time);
			}
			xmlSegSequen.OutOfElem();
			xmlSegSequen.Save("xmlSegSequen.xml");
*/
///////////////////////////////////////////////////////////////////////////////////////////////////

		

		
		
///////////////////////////////////////////////////////////////////////////////////////////////////
vector<int> inter_TC;
vector<int> inter_Node;
CMarkup xml_inter_TC;
		xml_inter_TC.SetDoc("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n");
		int put=0;
		int putt=0;
		inter_TC.push_back(0);
		inter_Node.push_back(0);
		int total_time=0;
//启发式算法,对Node_TestCase操作,优化测试用例集
		for(int k=1;k<12;k++)
		{
		
		
			for(int kk=0;kk<Node_TestCase.size();kk++)
			{
				for(int jk=0;jk<inter_Node.size();jk++)
				{
					if(inter_Node[jk]==Node_TestCase[kk].Node_id)break;
					else if((jk==inter_Node.size()-1)&&Node_TestCase[kk].TC_count!=0)
					inter_Node.push_back(Node_TestCase[kk].Node_id);
				}
				
				if(Node_TestCase[kk].TC_count==k)
					for(int kkk=0;kkk<k;kkk++)
					{
						for(int kkkk=0;kkkk!=inter_TC.size();kkkk++)
						{
							if(inter_TC[kkkk]==Node_TestCase[kk].TC[kkk])break;
							else if(kkkk==inter_TC.size()-1)
							{
								inter_TC.push_back(Node_TestCase[kk].TC[kkk]);
								
/*								for(int ik=0;ik<TestSuite.size();ik++)
								{
									if(TestSuite[ik].TC_ID==Node_TestCase[kk].TC[kkk])
										total_time+=TestSuite[ik].Time;
								}*/
//								inter_TC[put++]=Node_TestCase[kk].TC[kkk];//[put++]=;
							}
						}
					}
			}
			
		}
//输出最优化后的用例集合
		
		for(int ik=0;ik<inter_TC.size();ik++)
			for(int ikk=0;ikk<TestSuite.size();ikk++)
			{
				if(TestSuite[ikk].TC_ID==inter_TC[ik])
					total_time+=TestSuite[ikk].Time;
			}

		xml_inter_TC.AddElem("TS");
		xml_inter_TC.IntoElem();
		xml_inter_TC.AddElem("All_TC");
		xml_inter_TC.AddAttrib("TC_Count",inter_TC.size()-1);
		xml_inter_TC.AddAttrib("total_time",total_time);
		xml_inter_TC.IntoElem();
		for(int c=1;c<inter_TC.size();c++)
		{
//			xml_inter_TC.AddChildElem("TC",inter_TC[c]);
			xml_inter_TC.AddElem("TC",inter_TC[c]);//.AddChildAttrib();
		}
		xml_inter_TC.OutOfElem();

		xml_inter_TC.AddElem("All_Node");
		xml_inter_TC.AddAttrib("Node_count",inter_Node.size()-1);
		for(int cc=1;cc<inter_Node.size();cc++)
		{
			xml_inter_TC.AddElem("Node",inter_Node[cc]);
		}

		xml_inter_TC.OutOfElem();
		xml_inter_TC.Save("xml_inter_TC.xml");

///////////////////////////////////////////////////////////////////////////////////////////////////
		//对Node进行最小化操作,使用启发式算法Heuristic
/*
//		int mmm= vec_TC_Node.size();
//		 int nnn = vec_TC_Node[0].reverse;
		xmlMinHeur.AddElem("TS");
		xmlMinHeur.IntoElem();

//		int k=0;

//		bool hhh=(k<vec_TC_Node.size())&(vec_TC_Node[k].reverse);)&&(vec_TC_Node[k].reverse==2)

		for(int k=0;k<vec_TC_Node.size();k++)
		{
			if(vec_TC_Node[k].reverse==2)
			{
//			int flag=vec_TC_Node[k].reverse;
			for(int kk=k+1;kk<vec_TC_Node.size();kk++)
			{
				int vec=vec_TC_Node[k].Node;
				int veck=vec_TC_Node[kk].Node;
//				bool v=(bool)(vec>veck);

				if(vec==veck)
				{
					if(vec_TC_Node[k].time>vec_TC_Node[kk].time)
					{
					vec_TC_Node[k].reverse=0;
					vec_TC_Node[kk].reverse=1;
					}
					 
					else if(vec_TC_Node[k].time==vec_TC_Node[kk].time)
					{
					vec_TC_Node[k].reverse=1;
					vec_TC_Node[kk].reverse=1;
					}

					else
					{
						vec_TC_Node[k].reverse=1;
						vec_TC_Node[kk].reverse=0;
					
					}
					
				}

				
			
			}
			}
		}

//		vec_TC_Node.iterator iter=vec_TC_Node.begin();
		//显示优化一次后的vec_TC_Node文件
		xmlMinHeur.AddElem("TS");
		xmlMinHeur.IntoElem();
		for(int kkk=0;(kkk<vec_TC_Node.size());kkk++)
		{
			if(vec_TC_Node[kkk].reverse==1)
			{
//			bool v=(kkk<vec_TC_Node.size())&&(vec_TC_Node[kkk].reverse);

			//vec_TC_Node.erase(vec_TC_Node.begin());
			xmlMinHeur.AddElem("TC");
			xmlMinHeur.AddAttrib("TC_ID",vec_TC_Node[kkk].tcid);
			xmlMinHeur.AddAttrib("Node",vec_TC_Node[kkk].Node);
			xmlMinHeur.AddAttrib("time",vec_TC_Node[kkk].time);
			xmlMinHeur.AddAttrib("reverse",vec_TC_Node[kkk].reverse);
			}
		
		}
		xmlMinHeur.OutOfElem();
		xmlMinHeur.Save("xmlMinHeur.xml");

///////////////////////////////////////////////////////////////////////////////////////////////////


//评估输出测试覆盖情况,以及所用时间
		//代码覆盖率
//		if()
*/
	
}



///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
/*
void CFirstDlg::BinInsert(vector<TC_Node_Node> TS1,TC_Node_Node TC)
{
 int left,right;
      int middle;
      for(int i=0;i<TS1.size();i++)
      {
          left = 0;// 准备
          right = TS1.size()-1;
               
          while( right >= left)// 二分法查找插入位置
          {
              middle = ( left + right ) / 2; // 指向已排序好的中间位置
              if( TC.Node < TS1[middle].Node )// 即将插入的元素应当在在左区间
      right = middle-1;
     else                    // 即将插入的元素应当在右区间
      left = middle+1;    
          }
          
          TS1.insert(middle,TC);// 插入
      }

}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -