Merge pull request #27 from prairir/scaffoldingForTesting

Initial scaffolding for testing
This commit is contained in:
Ryan Prairie 2023-03-10 11:54:20 -05:00 committed by GitHub
commit 025c7df115
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 144 additions and 0 deletions

View File

@ -1,3 +1,32 @@
# Welcome to Microblog!
This is an example application featured in my [Flask Mega-Tutorial](https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world). See the tutorial for instructions on how to work with it.
# How to run behave tutorial
*NOTE* behave steps in the .feature file MUST unicode match those in the 'steps' file
e.g. in the *.feature file there is a Gherkin line like
'the task 'Buy groceries' with estimate '2' should be added to the todo list'
then in the accompanying *step.py file it must follow the exact unicode in the behave decorator
Like this -> '@then("the task '{title}' with estimate '{estimate}' should be added to the todo list")'
Also step files must follow the regex *step.py
1. Running all behave features
run " behave tests/features/add-task.feature "
# How to run unit tests
unit tests must follow the "test*.py" regex to be picked up
1. Individual tests
run " python ./ests/unit/test_example.py "
2. Run all unit tests
run " python -m unittest discover -s ./tests/unit "

0
__init__.py Normal file
View File

View File

@ -38,6 +38,8 @@ requests==2.25.1
requests-toolbelt==0.9.1
rq==1.9.0
selenium
behave
webdriver_manager
six==1.16.0
SQLAlchemy==1.4.20
urllib3==1.26.6

View File

@ -0,0 +1,17 @@
Feature: Add tasks to todo list
As a user
I want to be able to add tasks to my todo list
So thats I can keep track of my work
Scenario: User visits the todo list page
Given the user is on the todo list page
Then the page should have a text field to enter the title of the task
And the page should have a text field to enter the estimate of hours needed to complete the task
And the page should have a button to add the task
Scenario: Add a new task to the todo list
Given I am on the todo list page
When I enter 'Buy groceries' in the title field
And I enter '2' in the estimate field
And I click the 'Add' button
Then the task 'Buy groceries' with estimate '2' should be added to the todo list

View File

@ -0,0 +1,54 @@
from behave import given, when, then
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
#THESE ARE EXAMPLES FILES.
#Todo delete these once we set a standard with our own tests
@given("I am on the todo list page")
def open_browser(context):
# Implementation of headless from https://stackoverflow.com/questions/46920243/how-to-configure-chromedriver-to-initiate-chrome-browser-in-headless-mode-throug
# Stackoverflow post desribes what is goin on with options to enable headless chrome
options = Options()
options.add_argument("--headless") # Runs Chrome in headless mode.
options.add_argument('--no-sandbox') # Bypass OS security model
options.add_argument('start-maximized') #to maximize viewport this should still be headless
options.add_argument('disable-infobars')
options.add_argument("--disable-extensions")
context.driver = webdriver.Chrome(options=options, service=ChromeService(ChromeDriverManager().install()))
context.driver.implicitly_wait(5)
context.driver.get("http://127.0.0.1:5000/")
@when("I enter '{title}' in the title field")
def step_impl(context, title):
title_field = context.driver.find_element(By.NAME, "title")
title_field.send_keys(title)
@when("I enter '{estimate}' in the estimate field")
def step_impl(context, estimate):
estimate_field = context.driver.find_element(By.NAME, "estimate")
estimate_field.send_keys(estimate)
@when("I click the 'Add' button")
def step_impl(context):
add_button = context.driver.find_element(By.XPATH, "//button[contains(text(),'Add')]")
add_button.click()
context.driver.implicitly_wait(5)
@then("the task '{title}' with estimate '{estimate}' should be added to the todo list")
def step_impl(context, title, estimate):
dump_text = context.driver.page_source
print(dump_text)
assert ("Buy groceries | 2" in dump_text) is True

View File

@ -0,0 +1,39 @@
from behave import given, when, then
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
#THESE ARE EXAMPLES FILES.
#Todo delete these once we set a standard with our own tests
@given("the user is on the todo list page")
def open_browser(context):
options = Options()
options.add_argument("--headless") # Runs Chrome in headless mode.
options.add_argument('--no-sandbox') # Bypass OS security model
options.add_argument('start-maximized') #to maximize viewport this should still be headless
options.add_argument('disable-infobars')
options.add_argument("--disable-extensions")
context.driver = webdriver.Chrome(options=options, service=ChromeService(ChromeDriverManager().install()))
context.driver.implicitly_wait(5)
context.driver.get("http://127.0.0.1:5000/")
@then("the page should have a text field to enter the title of the task")
def check_task_title_textbox(context):
status = context.driver.find_element(By.NAME, "title").is_displayed()
assert status is True
@then("the page should have a text field to enter the estimate of hours needed to complete the task")
def check_task_estimate_textbox(context):
status = context.driver.find_element(By.NAME, "estimate").is_displayed()
assert status is True
@then("the page should have a button to add the task")
def check_task_add_button(context):
status = context.driver.find_element(By.XPATH, "//button[contains(text(),'Add')]").is_displayed()
assert status is True

0
tests/unit/__init__.py Normal file
View File

3
tests.py → tests/unit/test_example.py Executable file → Normal file
View File

@ -1,4 +1,7 @@
#!/usr/bin/env python
import sys
sys.path.append('./')
from datetime import datetime, timedelta
import unittest
from app import create_app, db