Getting tests to work with TravisCI and Coveralls
This commit is contained in:
parent
0d58e0d5a5
commit
92d554aab3
35
.travis.yml
Normal file
35
.travis.yml
Normal file
@ -0,0 +1,35 @@
|
||||
language: python
|
||||
python:
|
||||
- "3.6"
|
||||
|
||||
env:
|
||||
global:
|
||||
- MOZ_HEADLESS=1
|
||||
|
||||
addons:
|
||||
firefox: latest-nightly
|
||||
chrome: stable
|
||||
|
||||
|
||||
before_install:
|
||||
- wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/2.40/chromedriver_linux64.zip
|
||||
- mkdir $HOME/chromedriver && unzip /tmp/chromedriver.zip -d $HOME/chromedriver
|
||||
- export PATH=$HOME/chromedriver:$PATH
|
||||
- wget -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-linux64.tar.gz
|
||||
- mkdir $HOME/geckodriver && tar xvf /tmp/geckodriver.tar.gz -C $HOME/geckodriver
|
||||
- export PATH=$HOME/geckodriver:$PATH
|
||||
- firefox --version
|
||||
- geckodriver --version
|
||||
|
||||
|
||||
install:
|
||||
- pip install -r requirements.txt
|
||||
- pip install -r devel-requirements.txt
|
||||
|
||||
script:
|
||||
- coverage3 run --omit="./main/migrations/*" --include="./main/*","./tallybill/*" ./manage.py test
|
||||
|
||||
|
||||
after_success:
|
||||
- pip install coveralls
|
||||
- coveralls
|
@ -1,3 +1,7 @@
|
||||
[](https://travis-ci.com/har0ke/tallybill)
|
||||
[](https://coveralls.io/github/har0ke/tallybill?branch=master)
|
||||
|
||||
|
||||
# Tallybill
|
||||
|
||||
An django based tally of shared resource for your community:
|
||||
@ -10,7 +14,7 @@ An django based tally of shared resource for your community:
|
||||
|
||||
Create a new python3 environment and install all dependencies:
|
||||
|
||||
`pip install -r requirements.txt`t
|
||||
`pip install -r requirements.txt`
|
||||
|
||||
## Run Development Server
|
||||
To run the development sever run:
|
||||
|
2
devel-requirements.txt
Normal file
2
devel-requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
coverage==4.5.1
|
||||
selenium==3.141.0
|
@ -86,6 +86,9 @@ DATABASES = {
|
||||
'timeout': 20, # in seconds
|
||||
# see also
|
||||
# https://docs.python.org/3.7/library/sqlite3.html#sqlite3.connect
|
||||
},
|
||||
'TEST': {
|
||||
'NAME': 'testdb.sqlite3',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,22 +1,22 @@
|
||||
import datetime
|
||||
import inspect
|
||||
from time import sleep
|
||||
from urllib import parse
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
|
||||
from django.core.servers.basehttp import WSGIServer
|
||||
from django.test.testcases import LiveServerThread, QuietWSGIRequestHandler
|
||||
from selenium.webdriver.chrome.webdriver import WebDriver
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from selenium.webdriver.support import expected_conditions
|
||||
from selenium.webdriver.support.wait import WebDriverWait
|
||||
|
||||
from main.billing import BillingPeriod, RecalculateThread
|
||||
from main.models import Product, ProductType, IncomingInvoice, Order, Consumption, Inventory, ProductInventory, \
|
||||
OutgoingInvoice, OutgoingInvoiceProductUserPosition, OutgoingInvoiceProductPosition, UserExtension
|
||||
|
||||
HEADLESS = True
|
||||
|
||||
FIREFOX = "firefox"
|
||||
CHROME = "chrome"
|
||||
driver = FIREFOX
|
||||
|
||||
|
||||
class TestCaseData1(object):
|
||||
|
||||
@ -71,12 +71,6 @@ class TestCaseData1(object):
|
||||
invoice.inventory.save()
|
||||
|
||||
|
||||
class LiveServerSingleThread(LiveServerThread):
|
||||
"""Runs a single threaded server rather than multi threaded. Reverts https://github.com/django/django/pull/7832"""
|
||||
|
||||
def _create_server(self):
|
||||
return WSGIServer((self.host, self.port), QuietWSGIRequestHandler, allow_reuse_address=False)
|
||||
|
||||
def replace_input_value(web_element, value):
|
||||
web_element.send_keys(Keys.CONTROL + "a")
|
||||
web_element.send_keys(value)
|
||||
@ -84,12 +78,24 @@ def replace_input_value(web_element, value):
|
||||
|
||||
class CoverageTest(StaticLiveServerTestCase):
|
||||
|
||||
# server_thread_class = LiveServerSingleThread
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.selenium = WebDriver()
|
||||
|
||||
if driver == CHROME:
|
||||
options = webdriver.ChromeOptions()
|
||||
if HEADLESS:
|
||||
options.add_argument("--headless")
|
||||
options.add_argument("--disable-gpu")
|
||||
cls.selenium = webdriver.Chrome(chrome_options=options)
|
||||
elif driver == FIREFOX:
|
||||
options = webdriver.FirefoxOptions()
|
||||
profile = webdriver.FirefoxProfile()
|
||||
if HEADLESS:
|
||||
options.add_argument('-headless')
|
||||
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv")
|
||||
cls.selenium = webdriver.Firefox(firefox_options=options, firefox_profile=profile)
|
||||
|
||||
cls.selenium.implicitly_wait(2)
|
||||
|
||||
@classmethod
|
||||
@ -98,8 +104,6 @@ class CoverageTest(StaticLiveServerTestCase):
|
||||
super().tearDownClass()
|
||||
|
||||
def setUp(self):
|
||||
self.recalculate_thread = RecalculateThread()
|
||||
self.recalculate_thread.start()
|
||||
|
||||
self.scenario_data = TestCaseData1()
|
||||
|
||||
@ -109,10 +113,14 @@ class CoverageTest(StaticLiveServerTestCase):
|
||||
password_input = self.selenium.find_element_by_name("password")
|
||||
password_input.send_keys('1234')
|
||||
self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
|
||||
|
||||
self.wait_for_page()
|
||||
|
||||
self.assertEqual(parse.urlparse(self.selenium.current_url).path, "/")
|
||||
|
||||
self.recalculate_thread = RecalculateThread()
|
||||
self.recalculate_thread.start()
|
||||
|
||||
def tearDown(self):
|
||||
self.recalculate_thread.running = False
|
||||
self.recalculate_thread.join()
|
||||
@ -244,7 +252,6 @@ class CoverageTest(StaticLiveServerTestCase):
|
||||
self.selenium.find_element_by_xpath("//input[@name='each_cents/%d']" % order_id).send_keys(Keys.DELETE)
|
||||
|
||||
self.selenium.find_element_by_xpath('//button[text()="Save"]').send_keys(Keys.NULL)
|
||||
#sleep()
|
||||
self.selenium.find_element_by_xpath('//button[text()="Save"]').click()
|
||||
self.wait_for_page()
|
||||
|
||||
@ -330,7 +337,7 @@ class CoverageTest(StaticLiveServerTestCase):
|
||||
self.selenium.find_element_by_xpath('//button[text()="Save"]').click()
|
||||
self.wait_for_page()
|
||||
|
||||
sleep(1) # time to recalculate
|
||||
sleep(2) # time to recalculate
|
||||
|
||||
self.selenium.get('%s%s' % (self.live_server_url, '/inventories/'))
|
||||
self.wait_for_page()
|
||||
@ -339,8 +346,12 @@ class CoverageTest(StaticLiveServerTestCase):
|
||||
self.assertEqual(len(self.get_simple_list_text()), 2)
|
||||
|
||||
self.selenium.find_elements_by_class_name("list-group-item")[0].click()
|
||||
for csv_a in self.selenium.find_elements_by_xpath('//a[@target="_blank"]'):
|
||||
self.selenium.get(csv_a.get_attribute("href"))
|
||||
|
||||
csv_links = self.selenium.find_elements_by_xpath('//a[@target="_blank"]')
|
||||
self.assertEqual(2, len(csv_links))
|
||||
for csv in csv_links:
|
||||
csv.click()
|
||||
|
||||
self.selenium.find_element_by_xpath("//button[text()='Submit Changes']").click()
|
||||
self.selenium.find_element_by_xpath("//button[text()='Submit']").click()
|
||||
self.assertEqual(len(self.selenium.find_elements_by_xpath("//button[text()='Submit Changes']")), 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user