api config_test.properties

本文详细介绍了单点登录(SSO)在Web应用中的配置方法,包括必要的过滤器设置及参数配置,如单点登出功能、用户认证、Ticket验证等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web目录是编写代码目录

编译目录是执行代码之后实际生成 使用的目录

config_test.properties 

file.basedir编译目录为输出使用目录

adminUser 为指定用户

网络超时

连接wifi

url编写错误

 

web.xml

<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://elearning.latech.cc:7666/sso</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://elearning.latech.cc:7666/sso/login</param-value>
<!--这里的server是服务端的IP -->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/login</url-pattern>
</filter-mapping>

<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://elearning.latech.cc:7666/sso</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>acceptAnyProxy</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>allowedProxyChains</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/login</url-pattern>
</filter-mapping>

<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- ======================== 单点登录结束 ======================== -->
<!-- 静态资源 default为tomcat配置,FileServlet为weblogic配置-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<!--<servlet-name>FileServlet</servlet-name>-->
<url-pattern>*.png</url-pattern>
<url-pattern>*.gif</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.jpeg</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.bmp</url-pattern>
<url-pattern>*.ttf</url-pattern>
<url-pattern>*.woff</url-pattern>
<url-pattern>*.eot</url-pattern>
<url-pattern>*.rar</url-pattern>
<url-pattern>*.zip</url-pattern>
<url-pattern>*.txt</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

app.properties


application.page_hidden=hidden
application.power=true
application.reportServerPort=8000
application.reportPath=report/oracle/

db_driver=oracle.jdbc.driver.OracleDriver
#db_driver=com.XDriver
db_url=jdbc:oracle:thin:@localhost:1521:tst
db_user=hbcmatc
db_pwd=123456
db_testsql=select 1 from dual
jdbc_dialect=oracle
#db_jndi=jdbc/hbcmatc
db_jndi=java:comp/env/jdbc/hbcmatc
#db_reportjndi=jdbc/hbcmatc
db_reportjndi=java:comp/env/jdbc/hbcmatc
application.leaveSeconds=60
application.delimiter=&nbsp;/&nbsp;
fileUploadBaseDir=${WEB_FILEPATH}/web/resource/
fileDownBaseDir=${WEB_FILEPATH}/web/resource/

testmode=false

masterIp=127.0.0.1
masterPort=80





cas.properties
cas=http://elearning.latech.cc:7666/sso
cas_login={cas}/login
#学习系统应用地址
cas_service=http://localhost:8080/edu
cas_logout={cas}/logout
cas01={cas}
cas02=
cas03=
cas04=
cas05=
cas06=
cas07=
cas08=

#修改登录模式,除了改此处外,还需要修改 applicationContext-security.xml 中的 <beans:import resource="/login-security-lms.xml"/>
#secmode=lms : login by lms
#secmode=cas : login by cas
secmode=cas
#登录退出后跳转到的页面:网站首页
first_page=http://localhost:8080/edu




config.properties
#lms系统的默认参数文件
#书写要求:目录末尾一律不带 / ,目录开头一律都带 / ,拼装文件路径时路径名和文件名之间加 /
#书写要求:引用直接使用大括号 { } 前面不要加 ${ }

###仅仅注释以“----”开头的参数才需要在项目实际情况进行调整###

################## 客户信息 #########################
#客户名称、版权信息都写在了这个位置:
#/web/common/navigator/navtree/allinclude.jsp

################## 全局参数配置开始 ##################
#----项目应用程序部署目录(实际物理路径),应该写到应用程序的发布目录
project_maindir=D:/svn-wrokspace/edu2/target/edu
bizflowdir={project_maindir}/WEB-INF/bizflow
#协同编辑文件夹路径
collaborativeDirPath={project_maindir}/web/resource/collaborativeDirs
teachplan_bizflow=teachplan_flow
trainnotice_bizflow=trainnotice_flow
finalbudget_bizflow=finalbudget_flow
trainbudget_bizflow=trainbudget_flow

#系统静态文件根目录(相对路径)
webstatic_basedir=/web/resource

################## 全局参数配置结束 ##################


################## 文件上传、下载配置开始 ##################

#上传相关的临时目录说明
# 表示上传后的临时目录(相对目录)
upload_tempdir=/web/temp
# 表示课件图片上传的相对目录
upload_lepic={webstatic_basedir}/course_pic

download_tempdir=/web/download_temp
################## 文件上传、下载配置结束 ##################


lms.properties
project_maindir=D:/svn-wrokspace/edu/out/artifacts/weather_lms_war_exploded

转载于:https://www.cnblogs.com/lhang55/p/8032381.html

<think>好的,我现在需要帮助用户解决在test_api.py中出现的KeyError错误,具体是当使用'api_request'和'api_requests'作为键名时的问题。用户提到在test_test/test_api.py的TestApi类的test_saveorupdate方法中的test_saveoperation用例里遇到了这个错误。同时,用户提供了三个引用内容,我需要参考这些引用以及之前的对话内容来给出解决方案。 首先,我要回顾用户之前的问题和我的回答。用户之前询问在pytest框架中api_request2是否可以作为字典键名,我详细分析了键名的合法性、KeyError的原因以及解决方法,并提供了设计建议和案例分析。现在用户遇到了类似的问题,但键名是'api_request'和'api_requests',需要具体分析为什么这两个键会导致KeyError。 接下来,我需要分析用户提供的引用内容。引用[1]提到API调用频率限制的错误,解决方法涉及更换API Key;引用[2]是关于AttributeError,通过升级库解决;引用[3]是Elasticsearch索引被锁定的问题。这些引用可能和当前问题关联不大,但用户可能希望我从中寻找灵感,比如处理错误的方法论,比如检查配置、升级依赖或调整设置。 现在,用户的具体问题是KeyError,这说明在访问字典时键不存在。可能的原因包括拼写错误、数据源中键缺失、动态参数传递错误或接口响应结构变化。结合用户提到的'test_saveorupdate'和'caseinfo',可能需要检查测试数据中的键名是否正确,是否在YAML或Excel文件中正确定义,或者在动态生成数据时是否正确传递了键名。 我需要考虑以下几个步骤: 1. **检查键名拼写**:确认在代码中访问的键名是否与数据源中的完全一致,比如'api_request'和'api_requests'是否有单复数的差异,或者大小写问题。 2. **验证数据源**:查看测试用例的数据文件(如YAML、JSON或Excel),确认这两个键是否存在于对应的测试用例中。例如,在test_saveoperation用例里是否定义了'api_request'或'api_requests'。 3. **动态参数传递**:检查fixture或参数化过程中是否正确地传递了包含这些键的数据。可能在某些情况下,数据没有正确加载或传递,导致键缺失。 4. **接口响应结构**:如果这些键用于提取接口响应中的数据,需要确认实际返回的JSON结构中是否存在这些键。可能接口返回的结构发生了变化,导致键不存在。 5. **使用安全访问方法**:建议用户使用dict.get()方法或预先检查键是否存在,避免直接通过索引访问,从而防止KeyError。 6. **日志和调试**:添加日志记录,打印出caseinfo的内容,确认其中是否包含预期的键。这可以帮助用户快速定位数据缺失的位置。 7. **Schema校验**:引入JSON Schema验证,确保测试数据中的必填字段存在,避免因数据格式问题导致键缺失。 结合之前的回答,用户可能已经了解这些方法,但需要针对当前的具体情况给出更具体的建议。例如,在test_saveorupdate方法中,caseinfo可能来自某个fixture或数据加载函数,需要检查该数据加载过程是否正确。 另外,用户提到的错误可能出现在不同的测试步骤中,比如在准备请求数据、发送请求或提取响应结果时。需要明确错误发生的位置,是在读取测试数据时,还是在处理接口响应时。 可能还需要检查是否有变量名混淆,比如在代码中错误地使用了不同的变量名,或者在循环或条件语句中覆盖了变量值,导致键名被错误地修改或删除。 最后,根据引用内容中的解决方案,虽然主要涉及其他错误类型,但可以借鉴其中的思路,比如检查配置(如API Key是否正确)、升级依赖库(确保没有兼容性问题导致的数据处理错误)或调整索引设置(如果是数据库相关的问题)。不过当前问题更可能与数据结构和键名正确性有关,因此重点应放在数据验证和访问方法上。</think>### 针对 `KeyError 'api_request'` 和 `KeyError 'api_requests'` 的深度分析 --- ### **一、问题定位** #### 1. **错误现象复现** - 在 `test_api.py` 的 `TestApi` 类中,执行 `test_saveorupdate` 方法的 `test_saveoperation` 用例时,访问 `caseinfo` 中的 `api_request` 或 `api_requests` 键时触发 `KeyError`。 #### 2. **核心问题** - **键名不一致**:代码中访问的键名与数据源中的实际键名存在拼写差异(如单复数、大小写)。 - **数据源缺失**:测试用例的 YAML/Excel 数据文件中未正确定义所需键名。 - **动态数据未同步**:参数化过程中未正确传递键值对(参考引用[1]的变量替换逻辑)。 --- ### **二、排查步骤** #### 1. **键名一致性验证** - **检查代码中的键名**: ```python # test_api.py 中访问键名的代码段示例 endpoint = caseinfo["api_request"] # 可能应为 api_requests ``` - **对比数据源定义**(参考引用[3]的索引结构检查方法): ```yaml # YAML 测试数据文件 test_saveoperation: api_requests: "/save_or_update" # 注意复数形式 expected_code: 200 ``` - **常见差异**: - `api_request`(单数) vs `api_requests`(复数) - `apiRequest`(驼峰式) vs `api_request`(蛇形命名) #### 2. **数据源完整性检查** - **确认数据文件路径**: ```python # 检查数据加载逻辑(参考引用[1]的YAML读取方法) caseinfo = YamlUtil.read_testcase("test_saveorupdate") # 确认文件路径正确 ``` - **验证键存在性**: ```python # 调试时添加临时检查 print("caseinfo keys:", caseinfo.keys()) # 输出所有键名 assert "api_requests" in caseinfo, "Missing key: api_requests" ``` #### 3. **动态参数传递验证** - **检查参数化标记**(参考引用[4]的标签机制): ```python @pytest.mark.parametrize("caseinfo", [ {"api_requests": "/save", ...}, # 参数化数据是否包含正确键名 {"api_requests": "/update", ...} ]) ``` - **验证 fixture 输出**(参考引用[1]的conftest.py用法): ```python @pytest.fixture def caseinfo(): return { "api_requests": "/saveorupdate", # 确认键名正确 "params": {...} } ``` --- ### **三、解决方案** #### 1. **统一命名规范** - **强制使用蛇形命名**: ```python # config/constants.py class APIKeys: SAVE_OPERATION = "api_request" # 或 "api_requests",统一标准 ``` - **代码中引用常量**: ```python endpoint = caseinfo[APIKeys.SAVE_OPERATION] ``` #### 2. **增强数据校验** - **Schema 验证**(参考引用[3]的索引设置检查): ```python from jsonschema import validate schema = { "type": "object", "required": ["api_requests"], # 强制要求键存在 "properties": { "api_requests": {"type": "string"} } } validate(instance=caseinfo, schema=schema) ``` #### 3. **安全访问优化** - **使用 `get()` 方法**: ```python endpoint = caseinfo.get("api_requests", "/default_endpoint") ``` - **自定义缺失键处理**(参考引用[1]的错误处理逻辑): ```python class KeyMissingError(Exception): pass def safe_get(data, key): if key not in data: raise KeyMissingError(f"Required key '{key}' missing in caseinfo") return data[key] # 使用示例 endpoint = safe_get(caseinfo, "api_requests") ``` --- ### **四、关联引用内容的应用** 1. **动态变量注入**(参考引用[2]的依赖库升级方法): - 若 `api_requests` 的值依赖外部配置(如 `${ENDPOINT_URL}`),需确保变量替换逻辑正确: ```yaml test_saveoperation: api_requests: "${SAVE_ENDPOINT}" # 确保变量已定义 ``` 2. **错误定位增强**(参考引用[4]的Allure报告集成): - 在 Allure 报告中标记关键操作步骤: ```python import allure @allure.step("验证接口路径") def validate_endpoint(caseinfo): allure.attach(str(caseinfo), name="原始测试数据") return caseinfo["api_requests"] ``` --- ### **五、典型案例修复** #### **场景:单复数键名冲突** ```yaml # 错误数据定义 test_saveoperation: api_request: "/save" # 单数形式 params: {...} ``` ```python # 错误代码 def test_saveoperation(caseinfo): response = requests.post(caseinfo["api_requests"]) # KeyError ``` **修复方案**: 1. 统一使用 `api_requests` 作为键名: ```yaml test_saveoperation: api_requests: "/save" # 修正为复数 ``` 2. 更新代码中的键名引用: ```python response = requests.post(caseinfo["api_requests"]) ``` --- ### **六、预防措施** 1. **自动化键名检查**: ```python # conftest.py 中添加全局钩子 def pytest_collection_modifyitems(items): for item in items: if "test_saveoperation" in item.nodeid: caseinfo = item.funcargs.get("caseinfo") assert "api_requests" in caseinfo, f"Missing key in {item.name}" ``` 2. **IDE 静态检查**: - 使用 PyCharm 的 `Inspection` 功能或 VSCode 的 Python 插件,检测未定义的字典键名。 --- ### **相关问题** 1. 如何批量检测测试数据中的键名一致性? 2. pytest 中如何实现跨模块的字典键名规范检查? 3. 接口测试中如何处理动态变化的键名需求?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值