当前位置: 首页 > article >正文

测试data_management函数

测试data_management函数

这是我最近正在开发的AI工具信息平台的部门功能模块测试,基于streamlit架构。整理出来与大家分享,也为我以后自己回溯找到资源。

为了测试 data_management 函数并结合 Excel 文件中的 “Tools” 表单内容,我们需要进行以下步骤:

  1. 确保 Excel 文件准备好:你的 Excel 文件(例如 test_tools.xlsx)应包含相关的工具数据。
  2. 实现 save_all_data 函数:确保有一个函数用于保存数据回 Excel 文件。
  3. 编写完整的测试代码:将 data_management 函数整合到一个 Streamlit 应用中,以便从 Excel 读取数据、执行管理操作并实时展示结果。

步骤 1:准备 Excel 文件

确保你的 Excel 文件 test_tools.xlsx 内容如下:

NameCategoryCountryCompanyDescriptionURLOpen SourcePopularityLastUpdated
通义千问大语言模型中国阿里巴巴阿里云企业级大模型平台https://tongyi.aliyun.com4002024/2/11
智谱清言App大语言模型中国智谱AI新一代认知智能大模型,提供对话、问答等功能https://chatglm.cn/50002025/1/22
Tool A大语言模型USACompany AA great toolhttp://example.com1002023/1/1
Tool B大语言模型CanadaCompany BAnother great toolhttp://example2.com2002023/1/2
Tool C大语言模型UKCompany CAmazing toolhttp://example3.com1502023/1/3

步骤 2:实现 save_all_data 函数

确保你能将数据保存回 Excel 文件。以下是一个简单的示例实现:

def save_all_data(excel_file, tools_data, tutorials_data):
    """保存所有数据到 Excel 文件"""
    with pd.ExcelWriter(excel_file) as writer:
        # 将工具数据写入工作表
        for category, items in tools_data.items():
            df = pd.DataFrame(items)
            df.to_excel(writer, sheet_name=category, index=False)
        
        # 如果有教程数据,也可以保存到对应的工作表
        if tutorials_data:  # 示例,如果有必要可以添加处理
            tutorials_df = pd.DataFrame(tutorials_data)
            tutorials_df.to_excel(writer, sheet_name='Tutorials', index=False)

    return True

步骤 3:编写完整的 Streamlit 应用代码

data_management 函数整合到一个完整的 Streamlit 应用中,读取 Excel 文件并实现数据的管理功能:

import pandas as pd
import streamlit as st
import datetime

# 国家标志示例
COUNTRY_FLAGS = {
    '中国': '🇨🇳',
    'USA': '🇺🇸',
    'Canada': '🇨🇦',
    'UK': '🇬🇧'
}

def save_all_data(excel_file, tools_data, tutorials_data):
    """保存所有数据到Excel"""
    try:
        tools_rows = []
        for category, items in tools_data.items():
            for item in items:
                tools_rows.append({
                    'Name': item['name'],
                    'Category': category,
                    'Country': item['country'],
                    'Company': item.get('company', ''),
                    'Description': item['description'],
                    'URL': item['url'],
                    'Open Source': item['open_source']
                })
        tools_df = pd.DataFrame(tools_rows)

        tutorials_rows = []
        for tool_name, tutorials in tutorials_data.items():
            for tut in tutorials:
                tutorials_rows.append({
                    'TutorialID': tut['id'],
                    'RelatedTool': tool_name,
                    'Title': tut['title'],
                    'URL': tut['url'],
                    'Type': tut['type'],
                    'DifficultyLevel': tut['difficulty'],
                    'Duration': tut.get('duration', ''),
                    'Rating': tut.get('rating', None),
                    'Language': tut.get('language', '中文'),
                    'Tags': ', '.join(tut.get('tags', [])),
                    'VersionCompatible': tut.get('version', ''),
                    'Author': tut.get('author', '')
                })
        tutorials_df = pd.DataFrame(tutorials_rows)

        with pd.ExcelWriter(excel_file, engine='openpyxl') as writer:
            tools_df.to_excel(writer, sheet_name='Tools', index=False)
            tutorials_df.to_excel(writer, sheet_name='Tutorials', index=False)
        return True
    except Exception as e:
        st.error(f"保存失败:{str(e)}")
        return False

class EnhancedConfig:
    SERPER_API_KEY = 'your api_key'  # 替换为实际的 API 密钥


def render_url(url):
    """根据URL生成超链接"""
    if url and url != '无':
        return f'<a href="{url}" class="link-btn" target="_blank">{url}</a>'
    else:
        return "<span>无可用链接</span>"


def classify_tool(name, description):
    """模拟分类工具的功能"""
    return '大语言模型'  # 示例返回


def data_management(excel_file, tools_data):
    # 新增分类验证功能
    if st.sidebar.button("🔍 分类质量检查"):
        error_count = 0
        for category, items in tools_data.items():
            for item in items:
                predicted = classify_tool(item['name'], item['description'])
                if predicted != category:
                    st.warning(f"分类不一致:{item['name']} 当前分类:{category},预测分类:{predicted}")
                    error_count += 1
        st.info(f"完成检查,发现{error_count}个潜在分类问题")

    # 数据管理界面
    st.sidebar.subheader("数据管理")
    operation = st.sidebar.radio("操作类型", ["添加条目", "编辑条目", "删除分类", "增加分类"])

    if operation == "添加条目":
        category = st.selectbox("选择分类", list(tools_data.keys()) + ["新增分类"])
        if category == "新增分类":
            category = st.text_input("请输入新分类名称")

        with st.form("添加表单"):
            name = st.text_input("工具名称")
            url = st.text_input("官网URL")
            country = st.selectbox("所属国家", list(COUNTRY_FLAGS.keys()))
            company = st.text_input("公司名称")
            description = st.text_area("工具描述")
            open_source = st.selectbox("是否开源", ["是", "否"])
            popularity = st.slider("初始流行度", 500, 2000, 1000)

            if st.form_submit_button("提交"):
                if all([category, name, url]):
                    new_item = {
                        'name': name,
                        'url': url,
                        'description': description,
                        'country': country,
                        'open_source': open_source,
                        'company': company,
                        'popularity': popularity,
                        'last_updated': datetime.datetime.now()
                    }
                    if category not in tools_data:
                        tools_data[category] = []
                    tools_data[category].append(new_item)

                    if save_all_data(excel_file, tools_data, {}):  # 假设没有教程数据
                        st.success("添加成功!")
                else:
                    st.error("请填写必填字段(分类、名称、URL)")

    elif operation == "编辑条目":
        category = st.selectbox("选择分类", list(tools_data.keys()))
        items = tools_data.get(category, [])

        if items:
            index = st.selectbox("选择条目", range(len(items)), format_func=lambda x: items[x]['name'])

            with st.form("编辑表单"):
                new_category = st.text_input("新分类名称", value=category)
                name = st.text_input("工具名称", value=items[index]['name'])
                url = st.text_input("官网URL", value=items[index]['url'])

                # 确保安全地获取国家
                try:
                    selected_country_index = list(COUNTRY_FLAGS.keys()).index(items[index]['country'])
                except ValueError:
                    selected_country_index = 0  # 默认到第一个国家

                country = st.selectbox("所属国家", list(COUNTRY_FLAGS.keys()), index=selected_country_index)
                company = st.text_input("公司名称", value=items[index]['company'])
                description = st.text_area("工具描述", value=items[index]['description'])
                open_source = st.selectbox("是否开源", ["是", "否"],
                                           index=["是", "否"].index(items[index]['open_source']))

                if st.form_submit_button("保存修改"):
                    del tools_data[category][index]
                    if new_category not in tools_data:
                        tools_data[new_category] = []
                    tools_data[new_category].append({
                        'name': name,
                        'url': url,
                        'description': description,
                        'country': country,
                        'open_source': open_source,
                        'company': company
                    })
                    if not tools_data[category]:
                        del tools_data[category]

                    if save_all_data(excel_file, tools_data, {}):  # 假设没有教程数据
                        st.success("修改已保存!")

        else:
            st.warning("该分类下没有条目可供编辑或删除!")

    elif operation == "增加分类":
        new_category = st.text_input("请输入新分类名称")
        if st.button("提交"):
            if new_category:
                if new_category not in tools_data:
                    tools_data[new_category] = []
                    save_all_data(excel_file, tools_data, {})
                    st.success(f"分类 '{new_category}' 已成功添加!")
                else:
                    st.error("该分类已存在,请选择其他名称。")
            else:
                st.error("分类名称不能为空。")

    elif operation == "删除分类":
        category = st.selectbox("选择分类", list(tools_data.keys()))
        if st.button("确认删除"):
            del tools_data[category]

            if save_all_data(excel_file, tools_data, {}):  # 假设没有教程数据
                st.success(f"分类 {category} 已删除!")


def main():
    # 从 Excel 文件读取工具数据
    excel_file = 'test.xlsx'
    tools_data = {}

    # 读取 Excel 文件内容
    df = pd.read_excel(excel_file, sheet_name='Tools')

    # 构建工具数据字典
    for _, row in df.iterrows():
        category = row['Category']
        if category not in tools_data:
            tools_data[category] = []
        tools_data[category].append({
            'name': row['Name'],
            'url': row['URL'],
            'description': row['Description'],
            'country': row['Country'],
            'open_source': row['Open Source'],
            'company': row['Company'],
            'popularity': row['Popularity'],
            'last_updated': row['LastUpdated']
        })

    data_management(excel_file, tools_data)


if __name__ == "__main__":
    main()

步骤 4:运行测试

将上述代码保存为 Python 文件,例如 data_management_app.py,然后在命令行中运行以下命令:

streamlit run data_management_app.py

验证输出

当应用启动后,你应该能够通过侧边栏操作来:

  • 进行分类质量检查
  • 添加、编辑和删除条目
  • 增加或删除分类

确保在每次操作后正确更新 Excel 文件,并在页面上显示相应的结果和消息。

注意事项

  1. Excel 文件路径:确保 Excel 文件路径正确或与脚本在同一目录下。
  2. 异常处理:在操作中添加异常处理以捕获错误。
  3. 数据有效性检查:确保用户输入的数据格式正确。

通过这些步骤,你应该能够测试 data_management 函数。如果有任何问题或进一步的要求,请随时告诉我!


http://www.kler.cn/a/556865.html

相关文章:

  • 网络安全:DeepSeek已经在自动的挖掘漏洞
  • 如何在 React 中测试高阶组件?
  • Windows 下如何对 node/vue 进行多版本管理?
  • Java常用设计模式及其应用场景
  • [Windows] Umi-OCR 开源批量文字识别 支持图片,文档,二维码,截图等
  • 从0-1搭建mac环境最新版
  • 常用加解密原理及实际使用
  • Vue2 和 Vue3 的区别
  • halcon激光三角测量(二十一)calibrate_sheet_of_light_calplate
  • Ubuntu24安装MongoDB(解压版)
  • 什么是向量化?ElasticSearch如何存储向量化?
  • 如何在 Vue 应用中实现权限管理?
  • 关于css中bfc的理解
  • SOME/IP--协议英文原文讲解12(完结)
  • 计算机专业知识【数据库读操作:不可重复读、脏读及其他现象解析】
  • 【接口封装】——13、登录窗口的标题栏内容设置
  • 跳跃游戏(力扣55)
  • Selenium实战案例1:论文pdf自动下载
  • 城电科技|可展开光伏花 绽放绿色 点亮未来
  • JavaScript 中,数据类型 有哪些?(复习/面试)