The AppTest class
一个模拟的Streamlit应用程序,用于检查显示元素和输出的正确性。
AppTest 的一个实例模拟了一个正在运行的 Streamlit 应用程序。该类提供了通过 API 而不是浏览器界面来设置、操作和检查应用程序内容的方法。它可以用于在各种场景下编写应用程序的自动化测试。然后可以使用像 pytest 这样的工具来运行这些测试。
AppTest 可以通过以下三种类方法之一进行初始化:
- st.testing.v1.AppTest.from_file (推荐)
- st.testing.v1.AppTest.from_string
- st.testing.v1.AppTest.from_function
一旦初始化,会话状态和小部件的值可以被更新,脚本也可以运行。与实际的实时运行的Streamlit应用程序不同,您需要在更改小部件值后显式调用AppTest.run()来重新运行应用程序。切换页面也需要显式的后续调用AppTest.run()。
AppTest 使开发者能够以熟悉的python测试格式,在应用程序的当前状态下构建测试,而无需进行重大重构或将逻辑抽象出来与UI分开测试。测试可以以非常低的开销快速运行。一个典型的模式是为应用程序构建一套测试,以确保应用程序在演进过程中功能的一致性,并在本地和/或在像Github Actions这样的CI环境中运行这些测试。
注意
AppTest 仅支持每个实例测试应用程序的单个页面。对于多页面应用程序,每个页面需要单独进行测试。AppTest 目前还不兼容使用 st.navigation 和 st.Page 的多页面应用程序。
类描述[来源] | |
---|---|
st.testing.v1.AppTest(script_path, *, default_timeout, args=None, kwargs=None) | |
方法 | |
get(element_type) | 获取指定类型的元素或部件。 |
run(*, timeout=None) | 从当前状态运行脚本。 |
switch_page(page_path) | 切换到应用程序的另一页。 |
属性 | |
secrets (dict[str, Any]) | 用于模拟应用程序的秘密字典。使用类似字典的语法为模拟应用程序设置秘密值。 |
session_state (SafeSessionState) | 模拟应用程序的会话状态。SafeSessionState 对象支持像通常的 Streamlit 应用程序一样的读写操作。 |
query_params (dict[str, Any]) | 用于模拟应用程序的查询参数字典。使用类似字典的语法为模拟应用程序设置query_params值。 |
所有 st.button 和 st.form_submit_button 小部件的序列。 | |
所有st.feedback小部件的序列。 | |
所有 st.caption 元素的序列。 | |
所有 st.chat_input 小部件的序列。 | |
所有st.chat_message元素的序列。 | |
所有st.checkbox小部件的序列。 | |
所有st.code元素的序列。 | |
所有 st.color_picker 小部件的序列。 | |
在st.columns元素内的所有列的序列。 | |
所有st.dataframe元素的序列。 | |
所有st.date_input小部件的序列。 | |
所有 st.divider 元素的序列。 | |
所有 st.error 元素的序列。 | |
所有 st.exception 元素的序列。 | |
所有 st.expander 元素的序列。 | |
所有 st.header 元素的序列。 | |
所有 st.info 元素的序列。 | |
所有st.json元素的序列。 | |
所有 st.latex 元素的序列。 | |
应用程序主体内的元素序列。 | |
所有 st.markdown 元素的序列。 | |
所有 st.metric 元素的序列。 | |
所有 st.multiselect 小部件的序列。 | |
所有 st.number_input 小部件的序列。 | |
所有 st.radio 小部件的序列。 | |
所有 st.select_slider 小部件的序列。 | |
所有 st.selectbox 小部件的序列。 | |
所有在st.sidebar内的元素序列。 | |
所有 st.slider 小部件的序列。 | |
所有 st.status 元素的序列。 | |
所有 st.subheader 元素的序列。 | |
所有st.success元素的序列。 | |
所有st.table元素的序列。 | |
所有在st.tabs元素内的标签序列。 | |
所有 st.text 元素的序列。 | |
所有st.text_area小部件的序列。 | |
所有 st.text_input 小部件的序列。 | |
所有st.time_input小部件的序列。 | |
所有st.title元素的序列。 | |
所有st.toast元素的序列。 | |
所有 st.toggle 小部件的序列。 | |
所有st.warning元素的序列。 |
Initialize a simulated app using AppTest
函数签名[source] | |
---|---|
AppTest.from_file(cls, script_path, *, default_timeout=3) | |
参数 | |
script_path (str | Path) | 脚本文件的路径。路径应为绝对路径或相对于调用.from_file的文件。 |
default_timeout (float) | 脚本运行超时的默认时间(以秒为单位)。可以为单个.run()调用覆盖此设置。 |
返回 | |
(AppTest) | 一个用于测试的模拟Streamlit应用程序。模拟应用程序可以通过.run()执行。 |
创建一个AppTest实例来模拟在字符串中定义的应用程序页面。
这对于测试适合作为测试本身内联字符串的短脚本非常有用,而不必为其创建单独的文件。脚本必须能够独立执行,因此必须包含所有必要的导入。
函数签名[source] | |
---|---|
AppTest.from_string(cls, script, *, default_timeout=3) | |
参数 | |
script (str) | 要运行的脚本的字符串内容。 |
default_timeout (float) | 脚本运行超时的默认时间(以秒为单位)。可以为单个.run()调用覆盖此设置。 |
返回 | |
(AppTest) | 一个用于测试的模拟Streamlit应用程序。模拟应用程序可以通过.run()执行。 |
创建一个AppTest实例来模拟在函数内定义的应用程序页面。
这与AppTest.from_string()类似,但在IDE辅助下编写更为方便。脚本必须能够独立执行,因此必须包含所有必要的导入。
函数签名[source] | |
---|---|
AppTest.from_function(cls, 脚本, *, 默认超时=3, 参数=None, 关键字参数=None) | |
参数 | |
script (Callable) | 一个函数,其主体将用作脚本。必须能够独立运行,因此必须包含任何必要的导入。 |
default_timeout (float) | 脚本运行超时的默认时间(以秒为单位)。可以为单个.run()调用覆盖此设置。 |
args (tuple) | 传递给脚本函数的可选参数元组。 |
kwargs (dict) | 一个可选的字典,用于传递给脚本函数。 |
返回 | |
(AppTest) | 一个用于测试的模拟Streamlit应用程序。模拟应用程序可以通过.run()执行。 |
Run an AppTest script
从当前状态运行脚本。
这相当于手动重新运行应用程序或用户交互时发生的重新运行。在更新小部件值或切换页面后,必须手动调用AppTest.run(),因为脚本不会像实时运行的Streamlit应用程序那样自动重新运行。
函数签名[source] | |
---|---|
AppTest.run(*, timeout=None) | |
参数 | |
timeout (float or None) | 运行脚本的最大秒数。如果timeout是None(默认值),Streamlit将使用为AppTest实例设置的默认超时时间。 |
返回 | |
(AppTest) | self |
函数签名[source] | |
---|---|
AppTest.switch_page(page_path) | |
参数 | |
page_path (str) | 要切换到的页面的路径。路径必须相对于主脚本的位置(例如 "pages/my_page.py")。 |
返回 | |
(AppTest) | self |
Get AppTest script elements
AppTest
的主要价值在于提供了一个 API,以编程方式检查和与运行中的 Streamlit 应用程序生成的元素和小部件进行交互。使用 AppTest.
属性或 AppTest.get()
方法返回运行应用程序时将显示的所有指定类型的元素或小部件的集合。
请注意,您也可以以相同的方式检索特定容器内的元素 - 首先检索容器,然后仅在该容器中检索元素。
函数签名[source] | |
---|---|
AppTest.get(element_type) | |
参数 | |
element_type (str) | AppTest 的一个元素属性。例如,"button"、"caption" 或 "chat_input"。 |
返回 | |
(元素序列) | 给定类型的元素序列。可以通过索引(页面上的顺序)从序列中访问单个元素。当获取的element_type是一个小部件时,可以通过键访问单个小部件。例如,at.get("text")[0]用于第一个st.text元素,或at.get("slider")(key="my_key")用于具有给定键的st.slider小部件。 |
函数签名[source] | |
---|---|
AppTest.button | |
返回 | |
(WidgetList of Button) | 所有 st.button 和 st.form_submit_button 小部件的序列。可以通过索引(页面上的顺序)或键从 WidgetList 中访问单个小部件。例如,at.button[0] 用于 第一个小部件或 at.button(key="my_key") 用于具有 给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.标题 | |
返回 | |
(ElementList of Caption) | 所有st.caption元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.caption[0]用于第一个元素。Caption是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.chat_input | |
返回 | |
(WidgetList of ChatInput) | 所有st.chat_input小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.chat_input[0]用于第一个小部件,或 at.chat_input(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.chat_message | |
返回 | |
(Sequence of ChatMessage) | 所有st.chat_message元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.chat_message[0]表示第一个元素。ChatMessage是Block类的扩展。 |
函数签名[source] | |
---|---|
AppTest.checkbox | |
返回 | |
(WidgetList of Checkbox) | 所有st.checkbox小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.checkbox[0]用于第一个小部件,或 at.checkbox(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.code | |
返回 | |
(ElementList of Code) | 所有st.code元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.code[0]表示第一个元素。Code是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.color_picker | |
返回 | |
(WidgetList of ColorPicker) | 所有st.color_picker小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.color_picker[0]用于第一个小部件,或 at.color_picker(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.columns | |
返回 | |
(列的顺序) | 所有列在st.columns元素中的顺序。可以通过索引(页面上的顺序)从ElementList中访问单个列。例如,at.columns[0]表示第一列。列是Block类的扩展。 |
函数签名[来源] | |
---|---|
AppTest.dataframe | |
返回 | |
(ElementList of Dataframe) | 所有st.dataframe元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.dataframe[0]用于第一个元素。Dataframe是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.date_input | |
返回 | |
(WidgetList of DateInput) | 所有st.date_input小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.date_input[0]用于第一个小部件,或 at.date_input(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.divider | |
返回 | |
(Divider的元素列表) | 所有st.divider元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.divider[0]表示第一个元素。Divider是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.error | |
返回 | |
(ElementList of Error) | 所有st.error元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.error[0]表示第一个元素。Error是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.exception | |
返回 | |
(ElementList of Exception) | 所有st.exception元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.exception[0]表示第一个元素。Exception是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.expander | |
返回 | |
(可扩展序列) | 所有st.expander元素的序列。可以通过索引(页面上的顺序)从序列中访问单个元素。例如,at.expander[0]表示第一个元素。Expandable是Block类的扩展。 |
函数签名[source] | |
---|---|
AppTest.header | |
返回 | |
(ElementList of Header) | 所有st.header元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.header[0]用于第一个元素。Header是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.info | |
返回 | |
(ElementList of Info) | 所有st.info元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.info[0]表示第一个元素。Info是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.json | |
返回 | |
(ElementList of Json) | 所有st.json元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.json[0]表示第一个元素。Json是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.latex | |
返回 | |
(ElementList of Latex) | 所有 st.latex 元素的序列。可以通过索引(页面上的顺序)从 ElementList 中访问单个元素。例如,at.latex[0] 表示第一个元素。Latex 是 Element 类的扩展。 |
函数签名[source] | |
---|---|
AppTest.main | |
返回 | |
(Block) | 元素的容器。可以像AppTest一样查询块中的元素。例如,Block.checkbox将返回关联容器内的所有st.checkbox。 |
函数签名[source] | |
---|---|
AppTest.markdown | |
返回 | |
(Markdown的元素列表) | 所有st.markdown元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.markdown[0]用于第一个元素。Markdown是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.metric | |
返回 | |
(ElementList of Metric) | 所有st.metric元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.metric[0]表示第一个元素。Metric是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.multiselect | |
返回 | |
(WidgetList of Multiselect) | 所有st.multiselect小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.multiselect[0]用于第一个小部件,或 at.multiselect(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.number_input | |
返回 | |
(WidgetList of NumberInput) | 所有st.number_input小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.number_input[0]用于第一个小部件,或 at.number_input(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.radio | |
返回 | |
(WidgetList of Radio) | 所有st.radio小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.radio[0]用于第一个小部件,或 at.radio(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.select_slider | |
返回 | |
(WidgetList of SelectSlider) | 所有st.select_slider小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.select_slider[0]用于第一个小部件,或 at.select_slider(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.selectbox | |
返回 | |
(WidgetList of Selectbox) | 所有st.selectbox小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.selectbox[0]用于第一个小部件,或 at.selectbox(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.sidebar | |
返回 | |
(Block) | 元素的容器。可以像AppTest一样查询块中的元素。例如,Block.checkbox将返回关联容器内的所有st.checkbox。 |
函数签名[source] | |
---|---|
AppTest.slider | |
返回 | |
(WidgetList of Slider) | 所有st.slider小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.slider[0]用于第一个小部件,或 at.slider(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.subheader | |
返回 | |
(ElementList of Subheader) | 所有st.subheader元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.subheader[0]用于第一个元素。Subheader是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.success | |
返回 | |
(ElementList of Success) | 所有st.success元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.success[0]用于第一个元素。Success是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.status | |
返回 | |
(状态序列) | 所有st.status元素的序列。可以通过索引(页面上的顺序)从序列中访问单个元素。例如,at.status[0]表示第一个元素。状态是Block类的扩展。 |
函数签名[source] | |
---|---|
AppTest.table | |
返回 | |
(ElementList of Table) | 所有st.table元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.table[0]表示第一个元素。Table是Element类的扩展。 |
st.tabs 元素内所有标签的序列。
在单个st.tabs中的每个选项卡将作为序列中的一个单独选项卡返回。此外,选项卡标签将作为属性传递给每个选项卡元素。例如,st.tabs("A","B")将生成两个选项卡对象,Tab.label分别返回"A"和"B"。
函数签名[source] | |
---|---|
AppTest.tabs | |
返回 | |
(标签序列) | 所有在st.tabs元素内的标签序列。可以通过索引(页面上的顺序)从ElementList中访问单个标签。例如,at.tabs[0]表示第一个标签。标签是Block类的扩展。 |
函数签名[source] | |
---|---|
AppTest.text | |
返回 | |
(ElementList of Text) | 所有st.text元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.text[0]用于第一个元素。Text是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.text_area | |
返回 | |
(WidgetList of TextArea) | 所有st.text_area小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.text_area[0]用于第一个小部件,或 at.text_area(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.text_input | |
返回 | |
(WidgetList of TextInput) | 所有st.text_input小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.text_input[0]用于第一个小部件,或 at.text_input(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.time_input | |
返回 | |
(WidgetList of TimeInput) | 所有st.time_input小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.time_input[0]用于第一个小部件,或 at.time_input(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.标题 | |
返回 | |
(ElementList of Title) | 所有st.title元素的序列。可以通过索引(页面上的顺序)从ElementList中访问单个元素。例如,at.title[0]用于第一个元素。Title是Element类的扩展。 |
函数签名[source] | |
---|---|
AppTest.toast | |
返回 | |
(ElementList of Toast) | 所有 st.toast 元素的序列。可以通过索引(页面上的顺序)从 ElementList 中访问单个元素。例如,at.toast[0] 表示第一个元素。Toast 是 Element 类的扩展。 |
函数签名[source] | |
---|---|
AppTest.toggle | |
返回 | |
(WidgetList of Toggle) | 所有st.toggle小部件的序列。可以通过索引(页面上的顺序)或键从WidgetList中访问单个小部件。 例如,at.toggle[0]用于第一个小部件,或 at.toggle(key="my_key")用于具有给定键的小部件。 |
函数签名[source] | |
---|---|
AppTest.warning | |
返回 | |
(ElementList of Warning) | 所有 st.warning 元素的序列。可以通过索引(页面上的顺序)从 ElementList 中访问单个元素。例如,at.warning[0] 用于第一个元素。Warning 是 Element 类的扩展。 |
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。