CSC/ECE 517 Fall 2015/oss E1574 BKS: Difference between revisions
(312 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
'''Expertiza''' is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities. <ref> | '''Expertiza''' is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities. <ref>[https://github.com/expertiza/expertiza Expertiza on GitHub]</ref> | ||
==Introduction== | ==Introduction== | ||
Our contribution | Our contribution to this project is to write feature tests for assignment submission by student. The tests would mock steps taken by the student when he/she manually submit the assignment. | ||
===Problem Statement=== | ===Problem Statement=== | ||
Once an assignment is created by the instructor the only call to action for the student is to submit the assignment. Currently, there is no feature test for assignment submission. The goal is to understand the flow of the assignment submission by student manually and mock this flow in the '''Feature Tests''' using '''RSpec''' and '''Capybara''' framework. | |||
Once | ===Motivation=== | ||
Once the application is built, it is necessary to test its functionality. More importantly, it is essential to test the functionality from users perspective. '''Feature spec''' allows testing of your application's functionality from the outside either by simulating a browser or by headless browser simulation. By manually clicking on the interface, the tests can discover bugs in the system and so has ours. | |||
===Assumptions=== | ===Assumptions=== | ||
To successfully implement each scenario in the test, the following assumptions are taken: | To successfully implement each scenario in the test, the following assumptions are taken: | ||
# The feature test will use the development environment. In particular, it will use the '''expertiza_development''' database. | # The feature test will use the development environment. In particular, it will use the '''expertiza_development''' database. | ||
# A student entry is assumed to be present in the database. The credentials for this student is '''student13''' as username and '''password''' as password. | # An instructor entry is assumed to be present in the database. The credentials for this instructor is '''instructor6''' as username and '''password''' as password. | ||
# The assignment created for testing contain no teams and topic | # A student entry is also assumed to be present in the database. The credentials for this student is '''student13''' as username and '''password''' as password. | ||
# The assignment created for testing contain no teams and topic for selection. | |||
===Steps for manual submission=== | ===Steps for manual submission=== | ||
Before analyzing code, one must | Before analyzing code, one must familiarize themselves with the steps involved in assignment submission by student on Expertiza. The steps involved are: | ||
# Login with valid student username and password | # Login with valid student username and password | ||
# Click on an assignment to submit | # Click on an assignment to submit | ||
Line 32: | Line 32: | ||
====rspec-rails==== | ====rspec-rails==== | ||
Rspec-rails is a testing framework for Rails 3.x and 4.x. It supports testing of models, controllers, requests, features, views and routes. It does this by accepting test scenarios called specs.<ref>https://github.com/rspec/rspec-rails</ref> | Rspec-rails is a testing framework for Rails 3.x and 4.x. It supports testing of models, controllers, requests, features, views and routes. It does this by accepting test scenarios called specs.<ref>[https://github.com/rspec/rspec-rails rpsce-rails on GitHub]</ref> | ||
====capybara==== | ====capybara==== | ||
Capybara helps you test web applications by simulating how a real user would interact with your | Capybara helps you test web applications by simulating how a real user would interact with your application. It comes with built in Rack::Test and Selenium support. WebKit is supported through an external gem.<ref>[https://github.com/jnicklas/capybara capybara on GitHub]</ref> To control the environments in which the scenarios are run, it provides before and after hooks.<ref>[https://www.relishapp.com/rspec/rspec-core/v/2-2/docs/hooks/before-and-after-hooks Before and after hooks]</ref> | ||
*before(:each) blocks are run before each scenario in the group | |||
*before(:all) blocks are run once before all of the scenarios in the group | |||
*after(:each) blocks are run after each scenario in the group | |||
*after(:all) blocks are run once after all of the scenarios in the group | |||
===Test Scenarios=== | ===Test Scenarios=== | ||
Based on the steps involved in manual submission of the assignment, the following test scenarios are considered: | Based on the steps involved in manual submission of the assignment, the following test scenarios are considered: | ||
===Code | <div style="width:750px; margin-top:10px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | ||
Code for the feature test consist in two files | Scenario to check whether student is able to login<br> | ||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Updated page should have text content <b>Assignment</b><br> | |||
</div> | |||
<div style="width:750px; margin-top:20px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
Scenario to check whether student is able to submit valid link to an ongoing assignment<br> | |||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Click on <b>OnGoing Assignment</b><br> | |||
:Click on <b>Your work</b><br> | |||
:Upload link <b><nowiki>http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule</nowiki></b><br> | |||
:Updated page should have link <b><nowiki>http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule</nowiki></b> | |||
</div> | |||
<div style="width:750px; margin-top:20px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
Scenario to check whether student is not able submit invalid link to an ongoing assignment<br> | |||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Click on <b>OnGoing Assignment</b><br> | |||
:Click on <b>Your work</b><br> | |||
:Upload link <b>http://</b><br> | |||
:Updated page should display flash message with text <b>URI is not valid</b> | |||
</div> | |||
<div style="width:750px; margin-top:20px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
Scenario to check whether student is able to upload a file to an ongoing assignment<br> | |||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Click on <b>OnGoing Assignment</b><br> | |||
:Click on <b>Your work</b><br> | |||
:Upload file <b>student_submission_spec.rb</b><br> | |||
:Updated page should contain filename <b>student_submission_spec.rb</b> | |||
</div> | |||
<div style="width:750px; margin-top:20px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
Scenario to check whether student is able to upload valid link and a file to an ongoing assignment<br> | |||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Click on <b>OnGoing Assignment</b><br> | |||
:Click on <b>Your work</b><br> | |||
:Upload link <b><nowiki>http://www.csc.ncsu.edu/faculty/efg/517/f15/assignments</nowiki></b><br> | |||
:Upload file <b>users_spec.rb</b><br> | |||
:Updated page should have link <b><nowiki>http://www.csc.ncsu.edu/faculty/efg/517/f15/assignments</nowiki></b><br> | |||
:Updated page should contain filename <b>users_spec.rb</b> | |||
</div> | |||
<div style="width:750px; margin-top:20px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
Scenario to check whether student is not able submit valid link to a finished assignment<br> | |||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Click on <b>Finished Assignment</b><br> | |||
:Click on <b>Your work</b><br> | |||
:Page should not have <b>Upload link</b> button | |||
</div> | |||
<div style="width:750px; margin-top:20px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
Scenario to check whether student is able upload file to a finished assignment<br> | |||
:Login with <b>student13</b> and <b>password</b><br> | |||
:Click on <b>Sign In</b> button<br> | |||
:Click on <b>Finished Assignment</b><br> | |||
:Click on <b>Your work</b><br> | |||
:Upload file <b>student_submission_spec.rb</b><br> | |||
:Updated page should contain filename <b>student_submission_spec.rb</b> | |||
</div> | |||
===Code=== | |||
Code for the feature test consist in two files: | |||
* [https://github.com/shrenujgandhi/expertiza/blob/master/spec/assignment_setup.rb assignment_setup.rb] which contains method for creating assignments using controller calls. | |||
* [https://github.com/shrenujgandhi/expertiza/blob/master/spec/features/student_submission_spec.rb student_assignment_submission.rb] which contain calls to assignment_setup, scenarios to test assignment submission and commands to delete the created assignments. | |||
====Structure==== | |||
<div style="width:750px; margin-top:10px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
<b>require</b> files | |||
<b>RSpec.feature 'assignment submission when student' do</b> | |||
:<b>before(:all) do</b> | |||
::create assignments for submission | |||
:<b>end</b> | |||
:<b>before(:each) do</b> | |||
::capybara steps to login | |||
:<b>end</b> | |||
:<b>after(:all) do</b> | |||
::delete assignments created | |||
:<b>end</b> | |||
:<b>scenario 'submits only valid link to ongoing assignment' do</b> | |||
::mock steps using capybara | |||
::make assertions | |||
:<b>end</b> | |||
:.... | |||
:.... | |||
:.... | |||
<pre> | <b>end</b> | ||
</div> | |||
====Sample Scenario==== | |||
<pre style="font-size:12.5px; width:750px; margin-top:10px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
require 'rails_helper' | require 'rails_helper' | ||
require 'spec_helper' | require 'spec_helper' | ||
require 'assignment_setup' | |||
RSpec.feature 'assignment | RSpec.feature 'assignment submission when student' do | ||
active_assignment="FeatureTest" | |||
expired_assignment="LibraryRailsApp" | |||
d = Date.parse(Time.now.to_s) | |||
due_date1=(d >> 1).strftime("%Y-%m-%d %H:%M:00") | |||
due_date2=(d << 1).strftime("%Y-%m-%d %H:%M:00") | |||
# Before all block runs once before all the scenarios are tested | |||
before(:all) do | |||
# Create active/ongoing assignment | |||
create_assignment(active_assignment, due_date1) | |||
# Create expired/finished assignment | |||
create_assignment(expired_assignment, due_date2) | |||
end | |||
# Before each block runs before every scenario | |||
before(:each) do | before(:each) do | ||
# Login as | # Login as a student before each scenario | ||
visit root_path | visit root_path | ||
fill_in | fill_in 'User Name', :with => 'student13' | ||
fill_in | fill_in 'Password', :with => 'password' | ||
click_on | click_on 'SIGN IN' | ||
end | |||
# | # After all block runs after all the scenarios are tested | ||
after(:all)do | |||
# Delete active/ongoing assignment created by the test | |||
assignment = Assignment.find_by_name(active_assignment) | |||
assignment.delete | |||
# | # Delete expired/finished assignment created by the test | ||
assignment = Assignment.find_by_name(expired_assignment) | |||
assignment.delete | |||
end | end | ||
# Scenario to check whether student is able to submit valid link to an ongoing assignment | |||
scenario 'submits only valid link to ongoing assignment' do | |||
click_on active_assignment | |||
fill_in | click_on 'Your work' | ||
fill_in 'submission', :with => 'http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule' | |||
click_on 'Upload link' | |||
expect(page).to have_content 'http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule' | |||
end | |||
end | |||
</pre> | |||
==Running the tests== | |||
The following are steps required to run the test | |||
* Clone the repository in a new directory | |||
<pre style="font-size:12.5px; width:750px; margin-top:10px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
$ mkdir review | |||
$ cd review | |||
$ git clone https://github.com/shrenujgandhi/expertiza.git | |||
</pre> | |||
In case you don't have a database with student and instructor entries then download the dump from https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uESEkzSWpJRnhGbmc/view. Extract its contents. | |||
<pre style="font-size:12.5px; width:750px; margin-top:10px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
$ cd expertiza | |||
$ rake db:create:all | |||
$ cd Downloads/ | |||
$ mysql -u root -p expertiza_development < expertiza_scrubbed_2015_08_14.sql | |||
password: | |||
$ cd expertiza | |||
$ rake db:migrate | |||
</pre> | |||
* Type the command to run tests for assignment submission | |||
<pre style="font-size:12.5px; width:750px; margin-top:10px; border:1px solid lightgrey; background:ivory; color:black; padding-left:15px; padding-top:15px; padding-bottom:15px;"> | |||
rspec spec/features/student_submission_spec.rb | |||
</pre> | |||
==Test Results== | |||
The following screenshot shows the result of the rspec command. | |||
[[File:test_result_temp2_expertiza.jpg|Feature Test Result]] | |||
=== Test Analysis === | |||
* ''7 examples, 0 failures'' imply that there are 7 test scenarios and none of them failed. | |||
* The tests take around 35 seconds to run, which implies that they are fast. | |||
* They are also repeatable as the assignments that are created in the ''before all'' block are also deleted in the ''after all'' block. | |||
* They are also self-verifying as all the results are in green, which mean that all the cases passed. | |||
=== Existing Bugs === | |||
During the course of our testing, we encountered two potential bugs in the Expertiza system. These are: | |||
# A student can upload file even after the assignment is finished. | |||
# A student can upload an .exe file to any assignment. | |||
The following screenshots show these bugs on the current version of Expertiza used by the batch of Fall 2015. | |||
[[File:one_screenshot_expertiza.jpg|List of Assignments in Expertiza with Current Stage]] | |||
<center>'''Figure''': This screenshot shows the list of assignments along with their current stage in Expertiza.</center> | |||
[[File:two_screenshot_expertiza.jpg|Select file for finished assignment]] | |||
<center>'''Figure''': This screenshot shows that a student can select a file in a finished assignment in Expertiza.</center> | |||
[[File:three_screenshot_expertiza.jpg|Uploaded file for finished assignment]] | |||
<center>'''Figure''': This screenshot shows that a student can upload a file in a finished assignment in Expertiza.</center> | |||
[[File:four_screenshot_expertiza.jpg|Select .exe file for ongoing assignment]] | |||
<center>'''Figure''': This screenshot shows that a student can select an .exe file in any assignment in Expertiza.</center> | |||
[[File:five_screenshot_expertiza.jpg|Uploaded .exe file for ongoing assignment]] | |||
<center>'''Figure''': This screenshot shows that a student can upload an .exe file in any assignment in Expertiza.</center> | |||
=== Future Work === | |||
* To prevent students from uploading a file to a finished assignment, like the upload link button, remove the upload file button. | |||
* Executable files can sometimes be a part of the assignment. To there needs to be a check while creating the assignment whether .exe files are allowed or not. | |||
* To run the test on test database using factories and fixtures, so that the tests are completely independent. | |||
==Project Resources== | ==Project Resources== | ||
GitHub Link | # [https://github.com/shrenujgandhi/expertiza GitHub Link] | ||
# [https://youtu.be/_58l0VPy04M YouTube Demo] | |||
=References= | |||
<references></references> | |||
=External links= | |||
* | * [http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Documentation] |
Latest revision as of 22:25, 7 November 2015
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities. <ref>Expertiza on GitHub</ref>
Introduction
Our contribution to this project is to write feature tests for assignment submission by student. The tests would mock steps taken by the student when he/she manually submit the assignment.
Problem Statement
Once an assignment is created by the instructor the only call to action for the student is to submit the assignment. Currently, there is no feature test for assignment submission. The goal is to understand the flow of the assignment submission by student manually and mock this flow in the Feature Tests using RSpec and Capybara framework.
Motivation
Once the application is built, it is necessary to test its functionality. More importantly, it is essential to test the functionality from users perspective. Feature spec allows testing of your application's functionality from the outside either by simulating a browser or by headless browser simulation. By manually clicking on the interface, the tests can discover bugs in the system and so has ours.
Assumptions
To successfully implement each scenario in the test, the following assumptions are taken:
- The feature test will use the development environment. In particular, it will use the expertiza_development database.
- An instructor entry is assumed to be present in the database. The credentials for this instructor is instructor6 as username and password as password.
- A student entry is also assumed to be present in the database. The credentials for this student is student13 as username and password as password.
- The assignment created for testing contain no teams and topic for selection.
Steps for manual submission
Before analyzing code, one must familiarize themselves with the steps involved in assignment submission by student on Expertiza. The steps involved are:
- Login with valid student username and password
- Click on an assignment to submit
- Click on "Your Work"
- Paste the link or browse to the file containing your work
- Click on "Upload Link" or "Upload File" to submit deliverable
Creating the Tests
Gems involved
The gems used in feature testing are rspec-rails and capybara
rspec-rails
Rspec-rails is a testing framework for Rails 3.x and 4.x. It supports testing of models, controllers, requests, features, views and routes. It does this by accepting test scenarios called specs.<ref>rpsce-rails on GitHub</ref>
capybara
Capybara helps you test web applications by simulating how a real user would interact with your application. It comes with built in Rack::Test and Selenium support. WebKit is supported through an external gem.<ref>capybara on GitHub</ref> To control the environments in which the scenarios are run, it provides before and after hooks.<ref>Before and after hooks</ref>
- before(:each) blocks are run before each scenario in the group
- before(:all) blocks are run once before all of the scenarios in the group
- after(:each) blocks are run after each scenario in the group
- after(:all) blocks are run once after all of the scenarios in the group
Test Scenarios
Based on the steps involved in manual submission of the assignment, the following test scenarios are considered:
Scenario to check whether student is able to login
- Login with student13 and password
- Click on Sign In button
- Updated page should have text content Assignment
Scenario to check whether student is able to submit valid link to an ongoing assignment
- Login with student13 and password
- Click on Sign In button
- Click on OnGoing Assignment
- Click on Your work
- Upload link http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule
- Updated page should have link http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule
Scenario to check whether student is not able submit invalid link to an ongoing assignment
- Login with student13 and password
- Click on Sign In button
- Click on OnGoing Assignment
- Click on Your work
- Upload link http://
- Updated page should display flash message with text URI is not valid
Scenario to check whether student is able to upload a file to an ongoing assignment
- Login with student13 and password
- Click on Sign In button
- Click on OnGoing Assignment
- Click on Your work
- Upload file student_submission_spec.rb
- Updated page should contain filename student_submission_spec.rb
Scenario to check whether student is able to upload valid link and a file to an ongoing assignment
- Login with student13 and password
- Click on Sign In button
- Click on OnGoing Assignment
- Click on Your work
- Upload link http://www.csc.ncsu.edu/faculty/efg/517/f15/assignments
- Upload file users_spec.rb
- Updated page should have link http://www.csc.ncsu.edu/faculty/efg/517/f15/assignments
- Updated page should contain filename users_spec.rb
Scenario to check whether student is not able submit valid link to a finished assignment
- Login with student13 and password
- Click on Sign In button
- Click on Finished Assignment
- Click on Your work
- Page should not have Upload link button
Scenario to check whether student is able upload file to a finished assignment
- Login with student13 and password
- Click on Sign In button
- Click on Finished Assignment
- Click on Your work
- Upload file student_submission_spec.rb
- Updated page should contain filename student_submission_spec.rb
Code
Code for the feature test consist in two files:
- assignment_setup.rb which contains method for creating assignments using controller calls.
- student_assignment_submission.rb which contain calls to assignment_setup, scenarios to test assignment submission and commands to delete the created assignments.
Structure
require files
RSpec.feature 'assignment submission when student' do
- before(:all) do
- create assignments for submission
- end
- before(:each) do
- capybara steps to login
- end
- after(:all) do
- delete assignments created
- end
- scenario 'submits only valid link to ongoing assignment' do
- mock steps using capybara
- make assertions
- end
- ....
- ....
- ....
end
Sample Scenario
require 'rails_helper' require 'spec_helper' require 'assignment_setup' RSpec.feature 'assignment submission when student' do active_assignment="FeatureTest" expired_assignment="LibraryRailsApp" d = Date.parse(Time.now.to_s) due_date1=(d >> 1).strftime("%Y-%m-%d %H:%M:00") due_date2=(d << 1).strftime("%Y-%m-%d %H:%M:00") # Before all block runs once before all the scenarios are tested before(:all) do # Create active/ongoing assignment create_assignment(active_assignment, due_date1) # Create expired/finished assignment create_assignment(expired_assignment, due_date2) end # Before each block runs before every scenario before(:each) do # Login as a student before each scenario visit root_path fill_in 'User Name', :with => 'student13' fill_in 'Password', :with => 'password' click_on 'SIGN IN' end # After all block runs after all the scenarios are tested after(:all)do # Delete active/ongoing assignment created by the test assignment = Assignment.find_by_name(active_assignment) assignment.delete # Delete expired/finished assignment created by the test assignment = Assignment.find_by_name(expired_assignment) assignment.delete end # Scenario to check whether student is able to submit valid link to an ongoing assignment scenario 'submits only valid link to ongoing assignment' do click_on active_assignment click_on 'Your work' fill_in 'submission', :with => 'http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule' click_on 'Upload link' expect(page).to have_content 'http://www.csc.ncsu.edu/faculty/efg/517/f15/schedule' end end
Running the tests
The following are steps required to run the test
- Clone the repository in a new directory
$ mkdir review $ cd review $ git clone https://github.com/shrenujgandhi/expertiza.git
In case you don't have a database with student and instructor entries then download the dump from https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uESEkzSWpJRnhGbmc/view. Extract its contents.
$ cd expertiza $ rake db:create:all $ cd Downloads/ $ mysql -u root -p expertiza_development < expertiza_scrubbed_2015_08_14.sql password: $ cd expertiza $ rake db:migrate
- Type the command to run tests for assignment submission
rspec spec/features/student_submission_spec.rb
Test Results
The following screenshot shows the result of the rspec command.
Test Analysis
- 7 examples, 0 failures imply that there are 7 test scenarios and none of them failed.
- The tests take around 35 seconds to run, which implies that they are fast.
- They are also repeatable as the assignments that are created in the before all block are also deleted in the after all block.
- They are also self-verifying as all the results are in green, which mean that all the cases passed.
Existing Bugs
During the course of our testing, we encountered two potential bugs in the Expertiza system. These are:
- A student can upload file even after the assignment is finished.
- A student can upload an .exe file to any assignment.
The following screenshots show these bugs on the current version of Expertiza used by the batch of Fall 2015.
Future Work
- To prevent students from uploading a file to a finished assignment, like the upload link button, remove the upload file button.
- Executable files can sometimes be a part of the assignment. To there needs to be a check while creating the assignment whether .exe files are allowed or not.
- To run the test on test database using factories and fixtures, so that the tests are completely independent.
Project Resources
References
<references></references>