Skip to main content

模拟用于单元测试的 stremlit 接口

项目描述

streamlit_mock

模拟 streamlit 以允许单元测试

背景

我们调用 REST API 后端的简单流式应用程序随着时间的推移而增长,变得不那么简单,需要一个测试套件。我们编写了一些 Selenium 测试,但这些测试很难正确运行并且运行速度相对较慢。这个包“模拟”了最流线型的类,以允许使用“pytest”进行测试。

目标:

  • 允许使用 pytest 编写测试

  • 测试应该快速运行,以便可以测试多个边缘情况和变体

  • 测试应该简洁易写

非目标

  • 测试 streamlit 本身(该软件包删除了对真正 streamlitk 的所有依赖项)

  • 测试应用程序是否正确使用 Streamlit(包伪造输入并记录输出)

  • 与端到端 Selenium 测试一样完整(Streamlit/web 服务器不在循环中)

限制

  • “模拟”可能缺少一些 Streamlit 调用。

  • “模拟”代码可能可以使用 Python 魔术来简化以删除一些样板

  • 如果你想模拟输入元素的值,它们都应该有一个“键”值。这可能需要对应用程序进行一些更改,但它并不突兀,并且无论如何可能是一个很好的先例。

用法

“test”目录包含一些非常简单的 Streamlit 应用程序,每个应用程序都有相应的测试。这些测试也可用作编程示例。

$ cd test/simple_calculator

然后,在 streamlit 下运行应用程序:

$ streamlit run main_simple_calculator.py

并在模拟出 Streamlit 的情况下运行测试

$ pytest test_simple_calculator.py

编写测试

请参阅示例,但步骤是-。

  1. import streamlit_mock - 这会将自身添加到 Python“路径”的前面,因此不会使用真正的 Streamlit。

  2. 创建一个由“pytest”执行的“test_xxx”函数

  3. 在 中设置输入st.session_state,请参阅“form_calculator”示例以了解如何处理 form_submit_button。这些没有“钥匙”。

  4. 运行 streamlit 应用程序并获得“结果”。

  5. “结果”是记录交互的列表字典

  6. 断言结果符合预期。我发现在测试开发期间临时打印结果以查看预期/缺少的内容然后添加断言以在将来的运行中确认此行为很有用。也许这应该作为 pytest 选项添加

需要多次“运行”的测试

一些测试要求 streamlit 应用程序运行不止一次才能在session_state.

在这种情况下,您可以遵循以下 sps(假设有两个“运行”)

  1. 创建一个 StreamlitMock 并在变量中获取它的 session_statesession_state_1
  2. 设置输入值session_state_1
  3. 在 StreamlitMock 对象上调用“运行”
  4. 可选地在“结果”中声明一些值
  5. 创建一个新的 StreamlitMock 并在变量中获取其 session_statesession_state_2
  6. session_state_2.update(session_state_1)
  7. session_state_2为第二次运行设置额外的输入值
  8. 在第二个 StreamlitMock 对象上调用“运行”
  9. 断言结果

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

streamlit_mock-0.0.1.tar.gz (10.6 kB 查看哈希

已上传 source

内置分布

streamlit_mock-0.0.1-py3-none-any.whl (10.0 kB 图哈希)

已上传 py3