模拟用于单元测试的 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
编写测试
请参阅示例,但步骤是-。
-
import streamlit_mock - 这会将自身添加到 Python“路径”的前面,因此不会使用真正的 Streamlit。
-
创建一个由“pytest”执行的“test_xxx”函数
-
在 中设置输入
st.session_state,请参阅“form_calculator”示例以了解如何处理 form_submit_button。这些没有“钥匙”。 -
运行 streamlit 应用程序并获得“结果”。
-
“结果”是记录交互的列表字典
-
断言结果符合预期。我发现在测试开发期间临时打印结果以查看预期/缺少的内容然后添加断言以在将来的运行中确认此行为很有用。也许这应该作为 pytest 选项添加
需要多次“运行”的测试
一些测试要求 streamlit 应用程序运行不止一次才能在session_state.
在这种情况下,您可以遵循以下 sps(假设有两个“运行”)
- 创建一个 StreamlitMock 并在变量中获取它的 session_state
session_state_1 - 设置输入值
session_state_1 - 在 StreamlitMock 对象上调用“运行”
- 可选地在“结果”中声明一些值
- 创建一个新的 StreamlitMock 并在变量中获取其 session_state
session_state_2 session_state_2.update(session_state_1)session_state_2为第二次运行设置额外的输入值- 在第二个 StreamlitMock 对象上调用“运行”
- 断言结果
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。