--- title: App testing cheat sheet slug: /develop/concepts/app-testing/cheat-sheet --- # App testing cheat sheet ## Text elements ```python from streamlit.testing.v1 import AppTest at = AppTest.from_file("cheatsheet_app.py") # Headers assert "My app" in at.title[0].value assert "New topic" in at.header[0].value assert "Interesting sub-topic" in at.subheader[0].value assert len(at.divider) == 2 # Body / code assert "Hello, world!" in at.markdown[0].value assert "import streamlit as st" in at.code[0].value assert "A cool diagram" in at.caption[0].value assert "Hello again, world!" in at.text[0].value assert "\int a x^2 \,dx" in at.latex[0].value ``` ## Input widgets ```python from streamlit.testing.v1 import AppTest at = AppTest.from_file("cheatsheet_app.py") # button assert at.button[0].value == False at.button[0].click().run() assert at.button[0].value == True # checkbox assert at.checkbox[0].value == False at.checkbox[0].check().run() # uncheck() is also supported assert at.checkbox[0].value == True # color_picker assert at.color_picker[0].value == "#FFFFFF" at.color_picker[0].pick("#000000").run() # date_input assert at.date_input[0].value == datetime.date(2019, 7, 6) at.date_input[0].set_value(datetime.date(2022, 12, 21)).run() # form_submit_button - shows up just like a button assert at.button[0].value == False at.button[0].click().run() assert at.button[0].value == True # multiselect assert at.multiselect[0].value == ["foo", "bar"] at.multiselect[0].select("baz").unselect("foo").run() # number_input assert at.number_input[0].value == 5 at.number_input[0].increment().run() # radio assert at.radio[0].value == "Bar" assert at.radio[0].index == 3 at.radio[0].set_value("Foo").run() # selectbox assert at.selectbox[0].value == "Bar" assert at.selectbox[0].index == 3 at.selectbox[0].set_value("Foo").run() # select_slider assert at.select_slider[0].value == "Feb" at.select_slider[0].set_value("Mar").run() at.select_slider[0].set_range("Apr", "Jun").run() # slider assert at.slider[0].value == 2 at.slider[0].set_value(3).run() at.slider[0].set_range(4, 6).run() # text_area assert at.text_area[0].value == "Hello, world!" at.text_area[0].set_value("Hello, yourself!").run() # text_input assert at.text_input[0].value == "Hello, world!") at.text_input[0].set_value("Hello, yourself!").run() # time_input assert at.time_input[0].value == datetime.time(8, 45) at.time_input[0].set_value(datetime.time(12, 30)) # toggle assert at.toggle[0].value == False assert at.toggle[0].label == "Debug mode" at.toggle[0].set_value(True).run() assert at.toggle[0].value == True ``` ## Data elements ```python from streamlit.testing.v1 import AppTest at = AppTest.from_file("cheatsheet_app.py") # dataframe expected_df = pd.DataFrame([1, 2, 3]) assert at.dataframe[0].value.equals(expected_df) # metric assert at.metric[0].value == "9500" assert at.metric[0].delta == "1000" # json assert at.json[0].value == '["hi", {"foo": "bar"}]' # table table_df = pd.DataFrame([1, 2, 3]) assert at.table[0].value.equals(table_df) ``` ## Layouts and containers ```python from streamlit.testing.v1 import AppTest at = AppTest.from_file("cheatsheet_app.py") # sidebar at.sidebar.text_input[0].set_value("Jane Doe") # columns at.columns[1].markdown[0].value == "Hello, world!" # tabs at.tabs[2].markdown[0].value == "Hello, yourself!" ``` ## Chat elements ```python from streamlit.testing.v1 import AppTest at = AppTest.from_file("cheatsheet_app.py") # chat_input at.chat_input[0].set_value("Do you know any jokes?").run() # Note: chat_input value clears after every re-run (like in a real app) # chat_message assert at.chat_message[0].markdown[0].value == "Do you know any jokes?" assert at.chat_message[0].avatar == "user" ``` ## Status elements ```python from streamlit.testing.v1 import AppTest at = AppTest.from_file("cheatsheet_app.py") # exception assert len(at.exception) == 1 assert "TypeError" in at.exception[0].value # Other in-line alerts: success, info, warning, error assert at.success[0].value == "Great job!" assert at.info[0].value == "Please enter an API key to continue" assert at.warning[0].value == "Sorry, the passwords didn't match" assert at.error[0].value == "Something went wrong :(" # toast assert at.toast[0].value == "That was lit!" and at.toast[0].icon == "🔥" ``` ## Limitations As of Streamlit 1.28, the following Streamlit features are not natively supported by `AppTest`. However, workarounds are possible for many of them by inspecting the underlying proto directly using `AppTest.get()`. We plan to regularly add support for missing elements until all features are supported. - Chart elements (`st.bar_chart`, `st.line_chart`, etc) - Media elements (`st.image`, `st.video`, `st.audio`) - `st.file_uploader` - `st.data_editor` - `st.expander` - `st.status` - `st.camera_input` - `st.download_button` - `st.link_button`