怎么向ini配置文件加入新的Section?

mfcdeclare 2006-10-19 11:36:56
假如,原配置文件中没有[VERB]这个段,
我想通过程序来加上这个段,能有对应的API吗?

比如,原来的配置文件格式如下:
[AAA]
NAME=li
AGE=18
[BBB]
SCORE=80


在原基础上,用程序能否实现如下格式的配置文件?
[AAA]
NAME=li
AGE=18
[BBB]
SCORE=80
[VERB]
Count=5


好象没有这样的API?

谢谢
...全文
338 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
onestation 2006-10-20
  • 打赏
  • 举报
回复

/*******************************************************************************
函数名称: CConfFile::Load
描 述 : 读取输入的INI文件内容
调用函数:
调用者 :
输入参数: const char * filename 文件名称
输出参数:
返回值 : void
备注 :
*******************************************************************************/
bool Load(const char * filename)
{
m_strFileName = filename;

char szBuf[1024];

fstream file;
file.open(m_strFileName.c_str(), std::ios_base::in);
if ( file.fail() )
{
return false;
}

while( file.getline(szBuf, 1024) )
{
string strTemp = szBuf;
LoadLineData(strTemp);
}

file.close();

return true;

}


bool Save(char * filename=0)
{
char * outfilename = filename;
if ( filename == 0 )
outfilename = (char*)m_strFileName.c_str();

//保存
fstream file;
file.open(outfilename, std::ios_base::out);
if ( file.fail() )
return false;

file.clear();

//获取数据字符串
string strData;

vector<ClassData>::iterator VI;
for(VI=m_Data.begin(); VI!=m_Data.end(); VI++)
{
strData += "[";
strData += (*VI).m_sClass;
strData += "]\n";

map<string, string> * pKeyMap = &((*VI).m_Pair);
map<string, string>::iterator MI;
for (MI=pKeyMap->begin(); MI!=pKeyMap->end(); MI++)
{
strData += (*MI).first;
strData += "=";
strData += (*MI).second;
strData += "\n";
}
}

//写到文件
file.write(strData.c_str(), (int)strData.size());

file.close();

return true;
}

/*******************************************************************************
函数名称: CConfFile::Find
描 述 : 查询某类中的某个键所对应的值
调用函数:
调用者 :
输入参数: const string sClass 类名, 不区分大小写
const string sKey 键名, 不区分大小写
string& sValue 健值, 传入缺省值, 传出新值
输出参数:
返回值 : void
备注 :
*******************************************************************************/
void * Find(const char * sClass,
const char * sKey)
{
string strSection = sClass;
string strKey = sKey;

LowerCase(strSection);
LowerCase(strKey);

vector<ClassData>::iterator VI;
for(VI=m_Data.begin(); VI!=m_Data.end(); VI++)
{
if ( (*VI).m_sClass == strSection)
{
return (void*)(((*VI).m_Pair)[strKey].c_str());
break;
}
}

return 0;

}

/*******************************************************************************
函数名称: CConfFile::GetString
描 述 : 查询某类中的某个键所对应的字符串值
调用函数:
调用者 :
输入参数: const char * sClass 类名, 不区分大小写
const char * sKey 键名, 不区分大小写
输出参数:
返回值 : char * 字符串表示的Key值
备注 :
*******************************************************************************/
char * GetString(const char * sClass, const char * sKey)
{
void * pValue = Find(sClass, sKey);
return (char*)pValue;
}

long GetInteger(const char * sClass, const char * sKey)
{
void * pValue = Find(sClass, sKey);
if ( pValue == 0) return 0;
return atol((char*)pValue);
}

double GetFloat(const char * sClass, const char * sKey)
{
void * pValue = Find(sClass, sKey);
if ( pValue == 0) return 0;
return atof((char*)pValue);
}


//如果没有Section则添加
//如果没有Key则添加
//修改Key值
void SetString(const char * sClass, const char * sKey,
const char * sValue)
{
//无效地址
if ( sClass == 0 || sKey == 0 || sValue == 0) return;

string strSection = sClass;
string strKey = sKey;
string strValue = sValue;

//Section和Key名不能为空
if ( strSection.empty() || strKey.empty() ) return;

vector<ClassData>::iterator VI;
for(VI=m_Data.begin(); VI!=m_Data.end(); VI++)
{
if ( strSection == (*VI).m_sClass )
{
(*VI).m_Pair[strKey] = sValue;
return;
}
}

//添加section
ClassData data;
data.m_sClass = strSection;
data.m_Pair[strKey] = sValue;
m_Data.push_back(data);
}

void SetInteger(const char * sClass, const char * sKey, long lValue)
{
char szBuf[256];
memset(szBuf, 0, 256);
sprintf(szBuf, "%d", lValue);
SetString(sClass, sKey, szBuf);
}

void SetFloat(const char * sClass, const char * sKey, double dValue)
{
char szBuf[256];
memset(szBuf, 0, 256);
sprintf(szBuf, "%f", dValue);
SetString(sClass, sKey, szBuf);
}

}; //class

#endif //__CConfFile_H__

onestation 2006-10-20
  • 打赏
  • 举报
回复
//windows和linux通用的ini文件读写类
/*******************************************************************************
*Copyright (c) All rights reserved
*文件名称:ConfFile.h
*模 块 名:通用
*功能描述:配置文件(INI文件)读操作
*当前版本:1.0
*作 者:
*完成日期:
*取代版本:
*原作者 :
*完成日期:
*修改记录:
* 日期 版本 作者 修改描述
********************************************************************************
*******************************************************************************/
#ifndef __CConfFile_H__
#define __CConfFile_H__

#include <string>
#include <map>
#include <vector>
using std::string;
using std::map;
using std::vector;

#include <stdio.h>
#include <fstream>
using std::fstream;

#pragma warning( disable : 4996)
/**
* 本类处理配置文件。
* 配置文件的格式和windows的INI文件一样:
* [class]
* key1 = value1
* key2 = value2
* [class2]
* key1 = value1
* key2 = value2
*/

class CConfFile
{
public:
// CConfFile(void);
// virtual ~CConfFile(void);
// //从配置文件读入数据
// bool Load(const char * filename);
// bool Save(char * filename=0);
// //查询某类中的某个键所对应的值
// void * Find(const char * sClass,
// const char * sKey);
//
// char * GetString(const char * sClass, const char * sKey);
// long GetInteger(const char * sClass, const char * sKey);
// double GetFloat(const char * sClass, const char * sKey);
//
// void SetString(const char * sClass, const char * sKey, const char * sValue);
// void SetInteger(const char * sClass, const char * sKey, long lValue);
// void SetFloat(const char * sClass, const char * sKey, double dValue);
//protected:
// //添加一行数据
// void LoadLineData(string &str);
// string & Trim(string &str);
// string & LowerCase(string &str);

protected:
//数据结构:保存Section和它所包括的所有Key值
struct ClassData
{
string m_sClass; //类名
map<string, string> m_Pair;//键-值表

bool operator == (const ClassData& r)const
{
if( &r==this ) return true;
return (m_sClass == r.m_sClass) &&
(m_Pair == r.m_Pair);
};

bool operator != (const ClassData& r)const
{
return !(*this == r);
}

};

//数据对象
vector< ClassData > m_Data;

//文件名称
string m_strFileName;
//};


public:

CConfFile(void){};
virtual ~CConfFile(void){};

protected:
/*******************************************************************************
函数名称: CConfFile::Trim
描 述 : 清除字符串前后的空格
调用函数:
调用者 :
输入参数: string &str 需要清除的字符串
输出参数:
返回值 : string &清除后的字符串
备注 :
*******************************************************************************/
string & Trim(string &str)
{
string::size_type pos;

pos = str.find_first_not_of(' ');
if (string::npos!=pos)
{
str.erase(0, pos);
}

pos = str.find_last_not_of(' ');
if (string::npos!=pos)
{
str.erase(pos+1, str.length());
}

return str;
}

/*******************************************************************************
函数名称: CConfFile::LowerCase
描 述 : 将字符串所有大写字符转化为小写
调用函数:
调用者 :
输入参数: string &str 需要修改的字符串
输出参数:
返回值 : string &转换后的字符串
备注 :
*******************************************************************************/
string & LowerCase(string &str)
{
char * pTemp = (char*)str.c_str();
char count = 'a' - 'A';
while ( *pTemp != 0 )
{
if( *pTemp>='A' && *pTemp<='Z' )
{
*pTemp += count;
}
pTemp++;
}

return str;
}

/*******************************************************************************
函数名称: CConfFile::LoadLineData
描 述 : 分析一行INI文件数据,注释丢弃,保存Section和Key值
调用函数:
调用者 :
输入参数: string &str 输入的行数据
输出参数:
返回值 : void
备注 :
*******************************************************************************/
void LoadLineData(string &strLine)
{
string::size_type pos1;
string::size_type pos2;

Trim(strLine);
//是否是注释
pos1 = strLine.find(';');
if ((string::npos != pos1) && (pos1 == 0) )
{
return;
}

//是否是Key
pos1 = strLine.find('=');
if ((string::npos != pos1) && //是否有=号存在
(pos1 != 0) && //等号的位置不等于0
(m_Data.size() > 0)) //已经有Section存在
{
string strKey = strLine.substr(0, pos1);
string strValue = strLine.substr(pos1+1, strLine.length()-pos1-1);

Trim(strKey);
Trim(strValue);
LowerCase(strKey);

m_Data[m_Data.size()-1].m_Pair[strKey] = strValue;

return;
}

//是否是Section
pos1 = strLine.find('[');
pos2 = strLine.find(']');
if ((string::npos != pos1) && (string::npos != pos2))
{
string strSection = strLine.substr(pos1+1, pos2-pos1-1);
LowerCase(strSection);
//添加一个ClassData
ClassData data;
data.m_sClass = strSection;
m_Data.push_back(data);
return;
}

//其他类型的行
}

public:
mfcdeclare 2006-10-20
  • 打赏
  • 举报
回复
楼上这样的方法不行吧。

你这样写,是在[VERB]这个段,存在的时候,是可以的。

但如果不存在,这样写,无效
zhoujie20153 2006-10-20
  • 打赏
  • 举报
回复
在WINCE下也没有呀,实现类似WritePrivateProfileString的功能还是比较容易吧
veryfat 2006-10-20
  • 打赏
  • 举报
回复
真正难的问题是:如果不使用这个api函数实现读写ini文件的功能?

在做linux下的程序,也想使用ini文件来放配置信息,但linux没有类似WritePrivateProfileString的函数,要自己写。

veryfat 2006-10-20
  • 打赏
  • 举报
回复
WritePrivateProfileString会自动生成段的。 我一直这样用。
mfcdeclare 2006-10-20
  • 打赏
  • 举报
回复
to imzhjy(无罪)

个人觉得,你的话太多了。

你怎么知道我没试过?!

正是因为我试过,没有结果,才在这里提问的(只是因为我没有看到这一新的SECTION,事实已经写进去了)。

对你这种,随便猜疑别人、妄下评论的人,我表示非常的不满和鄙视!!!

你算个什嘛东西。。

一会结贴。
先感谢一下kevin_darkelf() 、
wmquan() 、qinzhen228() 、gezhi_dove(gezhi)

虽然分不多,但表达我对你们提醒帮助的謝意! 一会结貼。
qinzhen228 2006-10-20
  • 打赏
  • 举报
回复
完全可以的啊
imzhjy 2006-10-20
  • 打赏
  • 举报
回复
楼主,对别人提供的解决方法,你要试试才说行不行,是对别人劳动成果的尊重.
呵呵,没有恶意,提醒一下.路过
烨炜带火 2006-10-20
  • 打赏
  • 举报
回复
CString temp;
temp.Format("%d",5);
::WritePrivateProfileString("VERB","COUNT",temp,"config.ini");
这种方法正确
wmquan 2006-10-20
  • 打赏
  • 举报
回复
怎么可能,那你原来的配置都是手写的?
要是没有字段的话会自动添加,有的话会覆盖
kevin_darkelf 2006-10-19
  • 打赏
  • 举报
回复
CString temp;
temp.Format("%d",5);
::WritePrivateProfileString("VERB","COUNT",temp,"config.ini");
如果用PHP不能再满足你的需求,最好的办法就是开发PHP扩展。这有一些好处: 1、增加自己的特殊功能。 2、保护自己的专利代码。 这是几年前的一篇英文文章,现在已被翻译成中文版的。 作者应该是hshq_cn。 链接是:http://bbs3.chinaunix.net/thread-1028798-1-1.html。 现我将此转变为PDF文件,仅有兴趣者参阅。同时非常感谢 原作者及hshq_cn,给我们带来的这么好的资料。里面还有一个幻灯片的,也是很有帮助的文档。另外,再提供一篇相关的文章(http://www.programbbs.com/doc/4083.htm): 编写php的extension实例的方法 所属类别:JSP 推荐指数:★★☆ 文档人气:161 本周人气:1 发布日期:2008-7-3 一、说明 前端时间因为客户的原因折腾了一下asp的扩展,在ATL的帮助下写一个asp的模块还是很容易的。不巧的时刚刚折腾完asp的COM就碰到另一个客户的问题。客户想给系统集成ICBC的接口,但是用ICBC的接口需要用他们的提供的库函数去 1. sign对发送的数据进行签名 2. getcertid获取用户证书的版本 3. verifySign对签名后的数据进行验证 问题是ICBC只给了现成的COM组件,意味在只能在Win的主机上使用。俺们公司只有linux的主机,在*nix上就要自己想办法调用ICBC给的静态库了。对此我们有两个想法 1.用ICBC的静态库做一个独立的执行文件,用PHP的系统调用函数来执行这个独立的执行文件 2.将ICBC的静态库做出一个PHP的扩展 方法一应该比较简单,但是远不如方法二的灵活。搞成PHP的扩展,只要服务器编译一次,服务器上的所有客户都可以用的。 有ASP的前科,俺觉得搞个PHP的也不是什么难事。操起google搜了一通,结果发现Zend已经写了一个如何编写php extension的教程: http://devzone.zend.com/article/1021-Extension-Writing-Part-I-Introduction-to-PHP-and-Zend 浏览完牛人的大作,更是信心十足,php的扩展其实很简单,分七步走: 1. 制作编译配置文件:config.m4 2. 执行phpize生成扩展的框架 3. 在生成的php_xxx.h中声明自己写的函数 4. 在xxx.c中实现自己的函数 5. 编译自己的扩展 6. 将生成的xxx.so拷贝到php.ini中指定的extensions_dir 7. 在php.ini中打开xxx.so的调用 此问题问题唯一搞的地方就是在config.m4中折腾出正确的Makefile,因为Zend的教程中没有提到,俺自己也折腾了好久,才搞出来。 二、实际操作 1.建立工作环境 将php源码包解开,我的版本的php-4.4.4,转到源码包中的ext目录建立一个的目录叫icbc,然后在icbc目录下touch三个文件config.m4、php_icbc.h、icbc.c 2.建立config.m4 内容如下: PHP_ARG_ENABLE(icbc, whether to enable ICBC support, [ --enable-icbc Enable ICBC support]) if test \"$PHP_ICBC\" = \"yes\"; then AC_DEFINE(HAVE_ICBC, 1, [Whether you have ICBC]) if test -f ./libicbcapi.a; then PHP_ADD_LIBRARY_WITH_PATH(icbcapi, ./, ICBCAPI_SHARED_LIBADD) PHP_SUBST(ICBCAPI_SHARED_LIBADD) AC_MSG_RESULT(checking for libicbcapi.a is OK) else AC_MSG_RESULT(libicbcapi.a not found) AC_MSG_ERROR(Please make sure the libicbcapi.a is in current directory) [Page] fi PHP_NEW_EXTENSION(icbc, icbc.c, $ext_shared) fi 第三行判断是否要启用icbc扩展, 第五行判断ICBC的静态库是否在当前目录(phpdir/ext/icbc)下 第六、七行将ICBC的静态库加入到编译环境中 3.在php_icbc.h中声明我们要导出的函数icbc_sign、icbc_vsign、icbc_getCertID #ifndef PHP_ICBC_H #define PHP_ICBC_H extern zend_module_entry icbc_module_entry; #define phpext_icbc_ptr &icbc_module_entry #ifdef PHP_WIN32 #define PHP_ICBC_API __declspec(dllexport) #else #define PHP_ICBC_API #endif #ifdef ZTS #include \"TSRM.h\" #endif PHP_MINIT_FUNCTION(icbc); PHP_MSHUTDOWN_FUNCTION(icbc); PHP_RINIT_FUNCTION(icbc); PHP_RSHUTDOWN_FUNCTION(icbc); PHP_MINFO_FUNCTION(icbc); /*Modify youself here*/ PHP_FUNCTION(icbc_sign); PHP_FUNCTION(icbc_vsign); PHP_FUNCTION(icbc_getCertID); /****End of Self control section***/ #ifdef ZTS #define ICBC_G(v) TSRMG(icbc_globals_id, zend_icbc_globals *, v) #else #define ICBC_G(v) (icbc_globals.v) #endif #endif /* PHP_ICBC_H */ 涉及到我们也就 PHP_FUNCTION(icbc_sign); PHP_FUNCTION(icbc_vsign); PHP_FUNCTION(icbc_getCertID); 其他的都是PHP各个状态的入口函数声明 4.编写这三个函数的实现: #ifdef HAVE_CONFIG_H #include \"config.h\" #endif #include \"php.h\" #include \"php_ini.h\" #include \"ext/standard/info.h\" #include \"php_icbc.h\" #include \"icbcapi.h\" static int le_icbc; zend_function_entry icbc_functions[] = { PHP_FE(icbc_sign,NULL) PHP_FE(icbc_vsign,NULL) PHP_FE(icbc_getCertID,NULL) {NULL, NULL, NULL} /* Must be the last line in icbc_functions[] */ }; zend_module_entry icbc_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif \"icbc\", icbc_functions, PHP_MINIT(icbc), PHP_MSHUTDOWN(icbc), PHP_RINIT(icbc), /* Replace with NULL if there’s nothing to do at request start */ PHP_RSHUTDOWN(icbc), /* Replace with NULL if there’s nothing to do at request end */ [Page] PHP_MINFO(icbc), #if ZEND_MODULE_API_NO >= 20010901 \"0.1\", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_ICBC ZEND_GET_MODULE(icbc) #endif PHP_MINIT_FUNCTION(icbc) { return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(icbc) { return SUCCESS; } PHP_RINIT_FUNCTION(icbc) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(icbc) { return SUCCESS; } PHP_MINFO_FUNCTION(icbc) { php_info_print_table_start(); php_info_print_table_header(2, \"icbc support\", \"enabled\"); php_info_print_table_end(); } PHP_FUNCTION(icbc_sign) { char* src; int srclen; char* pkey; int keylen; char* keypass; int keypasslen; char* signedbuf; int signedbuflen; FILE* fp; char key[2000]; int rcc; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"sss\",&src,&srclen,&pkey,&keylen,&keypass,&keypasslen) == FAILURE){ return; } fp = fopen(pkey,\"rb\"); if(fp == NULL) { return; } fseek(fp,2,SEEK_SET); fread((void*)key,609,1,fp); fclose(fp); if(rcc = sign(src,srclen,key,607,keypass,&signedbuf,&signedbuflen) >= 0){ base64enc(signedbuf,signedbuflen,&signedbuf,&signedbuflen); src = estrndup(signedbuf,signedbuflen); if(signedbuf != NULL) infosec_free(signedbuf); RETURN_STRING(src,1); [Page] }else{ RETURN_LONG(rcc); } }PHP_FUNCTION(icbc_vsign) { char* src; int srclen; char* cert; int certlen; char* vsignedbuf; int vsignedbuflen; FILE* fp; char vcert[2000]; int rcc; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"sss\",&src,&srclen,&cert,&certlen,&vsignedbuf,&vsignedbuflen) == FAILURE){ return; } fp = fopen(cert,\"rb\"); if(fp == NULL) { return; } fread((void*)vcert,1525,1,fp); fclose(fp); base64dec(vsignedbuf,vsignedbuflen,&vsignedbuf,&vsignedbuflen); if(rcc = verifySign(src,srclen,vcert,1525,vsignedbuf,vsignedbuflen) >= 0){ if(vsignedbuf != NULL) infosec_free(vsignedbuf); RETURN_TRUE; }else{ if(vsignedbuf != NULL) infosec_free(vsignedbuf); RETURN_LONG(rcc); } } PHP_FUNCTION(icbc_getCertID) { char* arg; char* certid; int arg_len,certidlen; FILE* fp; char cert[2000]; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"s\", &arg,&arg_len) == FAILURE){ return; } fp = fopen(arg,\"rb\"); if(fp == NULL) { return; } fread((void*)cert,1525,1,fp); fclose(fp); [Page] if(!getCertID(cert,1525,&certid,&certidlen)) { arg = estrndup(certid,certidlen); if(certid != NULL) infosec_free(certid); RETURN_STRING(arg,1); }else{ return; } } 先在zend_function_entry icbc_functions[]数组中放入我们的要实现的函数名,然后是一堆php各个状态入口函数,详情请看Zend的教程。最后是在PHP_FUNCTION宏定义中放我们声明函数的具体实现。具体实现时难点也就是参数的传入和结果传出,还好PHP已经为我们做了很好的抽象。在Zend的教程中也有详尽的说明,俺就不啰嗦了。关键代码照搬icbc的test.c就行了。 5.编译安装我们的库 先将ICBC的头文件考到当前目录,重命名为icbcapi.php,将静态库也cp过来,重命名为*nix的标准形式libicbcapi.a,然后运行 phpize 生成configure,运行 ./configure --enable-icbc 生成Makefile,这里有一个很搞的地方,在生成的Makefile中最后一句中指定ICBC静态库的地方错了,正确的应该是(红色标记地方): $(LIBTOOL) --mode=link $(CC) $(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) -o $@ -export-dynamic -avoid-version -prefer-pic -module -rpath $(phplibdir) $(EXTRA_LDFLAGS) $(shared_objects_icbc) $(ICBCAPI_SHARED_LIBADD) 改好Makefile后就可以执行 make 如果一切顺利的话会在modules中得到我们的icbc.so,将我们的icbc.so拷贝到/usr/local/lib/php/extensions目录下,然后在php.ini中确认extensions_dir的值是/usr/local/lib/php/extensions,然后加入这句话 extension=icbc.so 重启apache后,就可以在php中直接调用这三个函数了 6.测试程序,要将测试的证书和key文件放到php测试文件的当前目录 ion is \"; echo icbc_getCertID($cert); echo \"
\"; $b64sdata = icbc_sign($src,$key,$passwd); echo \"The string \".$src.\" encrypt by icbc api is \".$b64sdata.\"(base64 encoded)
\"; echo \"Now we check it weather is correct....
\"; if(icbc_vsign(\"zzz\",$cert,$b64sdata)){ echo \"The signtrue to \".$src.\" is right!!
\"; [Page] }else{ echo \"The signtrue to \".$src.\" is wrong!!
\"; exit(); } ?>
适合人群:【学习前提】 1. 具备python3语言基础 【学习人群】 1. 手工测试人员学习UI自动化测试技能 2. 开发人员转岗测试开发岗位 3. 如具有丰富的自动化测经验,本课程可能并不满足你学习计划:1.下载课程中配套的软件资料 2.结合课件中Demo可完成学习任务课程目标:掌握UI自动化测试框架的设计与实现课程简介:UI自动化框架的设计需储备基础知识,方能完成自动化测试框架的实现,如数据驱动、日志、配置文件等AutoUiTestFrame自动化框架的目录结构初步进行规划,目录结构如下:Config 配置文件的目录v  config.ini 配置文件;v  globalconfig.py 获得日志路径、测试用例路径、测试报告路径、测试数据路径;v  Data 测试数据;v  TestData.xlsx 测试数据。Public 公共文件库v  Common 封装的公共的方法n  Commonconfig.py 公共的参数配置:调试过程中的测试数据等;n  DoExcel.py 操作excel(数据驱动);n  Send_mail.py 发送邮件(html);n  ReadConfigIni.py 读取ini格式的配置文件;n  TestCaseInfo.py  测试用例信息;n  Log.py 日志类。设置日志类,其他模块或文件需要日志类时,调用该文件。v  Pages 使用po模式设计的测试页面n  BasePage.py  基类,对一些测试页面公共方法、属性的封装及webdrive一些方法的二次封装;n  Bing.py 测试页面。Report 测试报告v  Log 日志目录n  *****log日志。v  TestReport 测试报告目录n  ***html测试报告。TestCase 测试用例v  TC_bing.py。Run.py  控制测试用例的运行。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧