diff --git a/common/lib/capa/capa/safe_exec/tests/test_lazymod.py b/common/lib/capa/capa/safe_exec/tests/test_lazymod.py
index dff45620c929b8f89696547f4152f724860ade62..fb7bdda28d3afdd0caf99d7f0df560ec8d334dfd 100644
--- a/common/lib/capa/capa/safe_exec/tests/test_lazymod.py
+++ b/common/lib/capa/capa/safe_exec/tests/test_lazymod.py
@@ -42,7 +42,7 @@ class TestLazyMod(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         assert module_name not in sys.modules
         colorsys = LazyModule(module_name)
         hsv = colorsys.rgb_to_hsv(.3, .4, .2)
-        self.assertEqual(hsv[0], 0.25)
+        assert hsv[0] == 0.25
 
     def test_dotted(self):
         # wsgiref is a module with submodules that is not already imported.
@@ -54,4 +54,4 @@ class TestLazyMod(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
             del sys.modules[module_name]
         assert module_name not in sys.modules
         wsgiref_util = LazyModule(module_name)
-        self.assertEqual(wsgiref_util.guess_scheme({}), "http")
+        assert wsgiref_util.guess_scheme({}) == 'http'
diff --git a/common/lib/capa/capa/safe_exec/tests/test_safe_exec.py b/common/lib/capa/capa/safe_exec/tests/test_safe_exec.py
index faaf87853faa102a7af707cdbf7ae84e8f90ab63..e8f62159956b6d45c64f55418e38dfdf3a787164 100644
--- a/common/lib/capa/capa/safe_exec/tests/test_safe_exec.py
+++ b/common/lib/capa/capa/safe_exec/tests/test_safe_exec.py
@@ -26,19 +26,19 @@ class TestSafeExec(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-
     def test_set_values(self):
         g = {}
         safe_exec("a = 17", g)
-        self.assertEqual(g['a'], 17)
+        assert g['a'] == 17
 
     def test_division(self):
         g = {}
         # Future division: 1/2 is 0.5.
         safe_exec("a = 1/2", g)
-        self.assertEqual(g['a'], 0.5)
+        assert g['a'] == 0.5
 
     def test_assumed_imports(self):
         g = {}
         # Math is always available.
         safe_exec("a = int(math.pi)", g)
-        self.assertEqual(g['a'], 3)
+        assert g['a'] == 3
 
     def test_random_seeding(self):
         g = {}
@@ -47,11 +47,11 @@ class TestSafeExec(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-
 
         # Without a seed, the results are unpredictable
         safe_exec("rnums = [random.randint(0, 999) for _ in xrange(100)]", g)
-        self.assertNotEqual(g['rnums'], rnums)
+        assert g['rnums'] != rnums
 
         # With a seed, the results are predictable
         safe_exec("rnums = [random.randint(0, 999) for _ in xrange(100)]", g, random_seed=17)
-        self.assertEqual(g['rnums'], rnums)
+        assert g['rnums'] == rnums
 
     def test_random_is_still_importable(self):
         g = {}
@@ -63,7 +63,7 @@ class TestSafeExec(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-
             "import random\n"
             "rnums = [random.randint(0, 999) for _ in xrange(100)]\n",
             g, random_seed=17)
-        self.assertEqual(g['rnums'], rnums)
+        assert g['rnums'] == rnums
 
     def test_python_lib(self):
         pylib = os.path.dirname(__file__) + "/test_files/pylib"
@@ -75,9 +75,9 @@ class TestSafeExec(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-
 
     def test_raising_exceptions(self):
         g = {}
-        with self.assertRaises(SafeExecException) as cm:
+        with pytest.raises(SafeExecException) as cm:
             safe_exec("1/0", g)
-        self.assertIn("ZeroDivisionError", text_type(cm.exception))
+        assert 'ZeroDivisionError' in text_type(cm.exception)
 
 
 class TestSafeOrNot(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -87,7 +87,7 @@ class TestSafeOrNot(unittest.TestCase):  # lint-amnesty, pylint: disable=missing
             pytest.skip()
 
         g = {}
-        with self.assertRaises(SafeExecException) as cm:
+        with pytest.raises(SafeExecException) as cm:
             safe_exec("import os; files = os.listdir('/')", g)
         assert "OSError" in text_type(cm.exception)
         assert "Permission denied" in text_type(cm.exception)
@@ -95,7 +95,7 @@ class TestSafeOrNot(unittest.TestCase):  # lint-amnesty, pylint: disable=missing
     def test_can_do_something_forbidden_if_run_unsafely(self):
         g = {}
         safe_exec("import os; files = os.listdir('/')", g, unsafely=True)
-        self.assertEqual(g['files'], os.listdir('/'))
+        assert g['files'] == os.listdir('/')
 
 
 class TestLimitConfiguration(unittest.TestCase):
@@ -199,16 +199,16 @@ class TestSafeExecCaching(unittest.TestCase):
 
         # Cache miss
         safe_exec("a = int(math.pi)", g, cache=DictCache(cache))
-        self.assertEqual(g['a'], 3)
+        assert g['a'] == 3
         # A result has been cached
-        self.assertEqual(list(cache.values())[0], (None, {'a': 3}))
+        assert list(cache.values())[0] == (None, {'a': 3})
 
         # Fiddle with the cache, then try it again.
         cache[list(cache.keys())[0]] = (None, {'a': 17})
 
         g = {}
         safe_exec("a = int(math.pi)", g, cache=DictCache(cache))
-        self.assertEqual(g['a'], 17)
+        assert g['a'] == 17
 
     def test_cache_large_code_chunk(self):
         # Caching used to die on memcache with more than 250 bytes of code.
@@ -218,7 +218,7 @@ class TestSafeExecCaching(unittest.TestCase):
         g = {}
         cache = {}
         safe_exec(code, g, cache=DictCache(cache))
-        self.assertEqual(g['a'], 12345)
+        assert g['a'] == 12345
 
     def test_cache_exceptions(self):
         # Used to be that running code that raised an exception didn't cache
@@ -226,28 +226,28 @@ class TestSafeExecCaching(unittest.TestCase):
         code = "1/0"
         g = {}
         cache = {}
-        with self.assertRaises(SafeExecException):
+        with pytest.raises(SafeExecException):
             safe_exec(code, g, cache=DictCache(cache))
 
         # The exception should be in the cache now.
-        self.assertEqual(len(cache), 1)
+        assert len(cache) == 1
         cache_exc_msg, cache_globals = list(cache.values())[0]  # lint-amnesty, pylint: disable=unused-variable
-        self.assertIn("ZeroDivisionError", cache_exc_msg)
+        assert 'ZeroDivisionError' in cache_exc_msg
 
         # Change the value stored in the cache, the result should change.
         cache[list(cache.keys())[0]] = ("Hey there!", {})
 
-        with self.assertRaises(SafeExecException):
+        with pytest.raises(SafeExecException):
             safe_exec(code, g, cache=DictCache(cache))
 
-        self.assertEqual(len(cache), 1)
+        assert len(cache) == 1
         cache_exc_msg, cache_globals = list(cache.values())[0]
-        self.assertEqual("Hey there!", cache_exc_msg)
+        assert 'Hey there!' == cache_exc_msg
 
         # Change it again, now no exception!
         cache[list(cache.keys())[0]] = (None, {'a': 17})
         safe_exec(code, g, cache=DictCache(cache))
-        self.assertEqual(g['a'], 17)
+        assert g['a'] == 17
 
     def test_unicode_submission(self):
         # Check that using non-ASCII unicode does not raise an encoding error.
@@ -288,8 +288,8 @@ class TestUpdateHash(unittest.TestCase):
             del d2[i]
 
         # Check that our dicts are equal, but with different key order.
-        self.assertEqual(d1, d2)
-        self.assertNotEqual(list(d1.keys()), list(d2.keys()))
+        assert d1 == d2
+        assert list(d1.keys()) != list(d2.keys())
 
         return d1, d2
 
@@ -298,19 +298,19 @@ class TestUpdateHash(unittest.TestCase):
         h10 = self.hash_obj(10)
         hs1 = self.hash_obj("1")
 
-        self.assertNotEqual(h1, h10)
-        self.assertNotEqual(h1, hs1)
+        assert h1 != h10
+        assert h1 != hs1
 
     def test_list_ordering(self):
         h1 = self.hash_obj({'a': [1, 2, 3]})
         h2 = self.hash_obj({'a': [3, 2, 1]})
-        self.assertNotEqual(h1, h2)
+        assert h1 != h2
 
     def test_dict_ordering(self):
         d1, d2 = self.equal_but_different_dicts()
         h1 = self.hash_obj(d1)
         h2 = self.hash_obj(d2)
-        self.assertEqual(h1, h2)
+        assert h1 == h2
 
     def test_deep_ordering(self):
         d1, d2 = self.equal_but_different_dicts()
@@ -318,7 +318,7 @@ class TestUpdateHash(unittest.TestCase):
         o2 = {'a': [1, 2, [d2], 3, 4]}
         h1 = self.hash_obj(o1)
         h2 = self.hash_obj(o2)
-        self.assertEqual(h1, h2)
+        assert h1 == h2
 
 
 class TestRealProblems(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -386,4 +386,4 @@ class TestRealProblems(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             """)
         g = {}
         safe_exec(code, g)
-        self.assertIn("aVAP", g)
+        assert 'aVAP' in g
diff --git a/common/lib/capa/capa/tests/test_answer_pool.py b/common/lib/capa/capa/tests/test_answer_pool.py
index 934e460f4efcd7a42dd8d6ff75c0c60a73aad75d..d2a87869aa6f48574772c72870241877799c6db5 100644
--- a/common/lib/capa/capa/tests/test_answer_pool.py
+++ b/common/lib/capa/capa/tests/test_answer_pool.py
@@ -58,12 +58,12 @@ class CapaAnswerPoolTest(unittest.TestCase):
         # [('choice_3', u'wrong-3'), ('choice_5', u'correct-2'), ('choice_1', u'wrong-2'), ('choice_4', u'wrong-4')]
         self.assertRegex(the_html, r"<div>.*\[.*'wrong-3'.*'correct-2'.*'wrong-2'.*'wrong-4'.*\].*</div>")
         self.assertRegex(the_html, r"<div>\{.*'1_solution_2'.*\}</div>")
-        self.assertEqual(the_html, problem.get_html(), 'should be able to call get_html() twice')
+        assert the_html == problem.get_html(), 'should be able to call get_html() twice'
         # Check about masking
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertTrue(response.has_answerpool())
-        self.assertEqual(response.unmask_order(), ['choice_3', 'choice_5', 'choice_1', 'choice_4'])
+        assert not response.has_mask()
+        assert response.has_answerpool()
+        assert response.unmask_order() == ['choice_3', 'choice_5', 'choice_1', 'choice_4']
 
     def test_answer_pool_4_choices_1_multiplechoiceresponse_seed2(self):
         problem = new_loncapa_problem(self.common_question_xml, seed=9)
@@ -73,9 +73,9 @@ class CapaAnswerPoolTest(unittest.TestCase):
         self.assertRegex(the_html, r"<div>\{.*'1_solution_1'.*\}</div>")
         # Check about masking
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertTrue(hasattr(response, 'has_answerpool'))
-        self.assertEqual(response.unmask_order(), ['choice_0', 'choice_4', 'choice_3', 'choice_2'])
+        assert not response.has_mask()
+        assert hasattr(response, 'has_answerpool')
+        assert response.unmask_order() == ['choice_0', 'choice_4', 'choice_3', 'choice_2']
 
     def test_no_answer_pool_4_choices_1_multiplechoiceresponse(self):
         xml_str = textwrap.dedent("""
@@ -117,11 +117,11 @@ class CapaAnswerPoolTest(unittest.TestCase):
         the_html = problem.get_html()
         self.assertRegex(the_html, r"<div>.*\[.*'wrong-1'.*'wrong-2'.*'correct-1'.*'wrong-3'.*'wrong-4'.*'correct-2'.*\].*</div>")  # lint-amnesty, pylint: disable=line-too-long
         self.assertRegex(the_html, r"<div>\{.*'1_solution_1'.*'1_solution_2'.*\}</div>")
-        self.assertEqual(the_html, problem.get_html(), 'should be able to call get_html() twice')
+        assert the_html == problem.get_html(), 'should be able to call get_html() twice'
         # Check about masking
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertFalse(response.has_answerpool())
+        assert not response.has_mask()
+        assert not response.has_answerpool()
 
     def test_0_answer_pool_4_choices_1_multiplechoiceresponse(self):
         xml_str = textwrap.dedent("""
@@ -164,8 +164,8 @@ class CapaAnswerPoolTest(unittest.TestCase):
         self.assertRegex(the_html, r"<div>.*\[.*'wrong-1'.*'wrong-2'.*'correct-1'.*'wrong-3'.*'wrong-4'.*'correct-2'.*\].*</div>")  # lint-amnesty, pylint: disable=line-too-long
         self.assertRegex(the_html, r"<div>\{.*'1_solution_1'.*'1_solution_2'.*\}</div>")
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertFalse(response.has_answerpool())
+        assert not response.has_mask()
+        assert not response.has_answerpool()
 
     def test_invalid_answer_pool_value(self):
         xml_str = textwrap.dedent("""
@@ -282,8 +282,8 @@ class CapaAnswerPoolTest(unittest.TestCase):
         self.assertRegex(the_html, r"<div>.*\[.*'correct-2'.*'wrong-1'.*'wrong-2'.*.*'wrong-3'.*'wrong-4'.*\].*</div>")
         self.assertRegex(the_html, r"<div>\{.*'1_solution_2'.*\}</div>")
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertEqual(response.unmask_order(), ['choice_5', 'choice_0', 'choice_1', 'choice_3', 'choice_4'])
+        assert not response.has_mask()
+        assert response.unmask_order() == ['choice_5', 'choice_0', 'choice_1', 'choice_3', 'choice_4']
 
     def test_answer_pool_2_multiplechoiceresponses_seed1(self):
         xml_str = textwrap.dedent("""
@@ -543,8 +543,8 @@ class CapaAnswerPoolTest(unittest.TestCase):
         self.assertRegex(the_html, str1)
         # attributes *not* present
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertFalse(response.has_answerpool())
+        assert not response.has_mask()
+        assert not response.has_answerpool()
 
     def test_answer_pool_and_no_answer_pool(self):
         xml_str = textwrap.dedent("""
diff --git a/common/lib/capa/capa/tests/test_capa_problem.py b/common/lib/capa/capa/tests/test_capa_problem.py
index 4c3beea499d1805b4102f4c997f6d2ac6b04063f..6b2cc02fc44148745be12bfac8f75fd89f0a0c0b 100644
--- a/common/lib/capa/capa/tests/test_capa_problem.py
+++ b/common/lib/capa/capa/tests/test_capa_problem.py
@@ -5,7 +5,7 @@ Test capa problem.
 
 import textwrap
 import unittest
-
+import pytest
 import ddt
 import six
 from lxml import etree
@@ -48,17 +48,9 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(question=question)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': question,
-                    'descriptions': {'description_1_1_1': 'Only the paranoid survive.'}
-                }
-            }
-        )
-        self.assertEqual(len(problem.tree.xpath('//label')), 0)
+        assert problem.problem_data ==\
+               {'1_2_1': {'label': question, 'descriptions': {'description_1_1_1': 'Only the paranoid survive.'}}}
+        assert len(problem.tree.xpath('//label')) == 0
 
     @ddt.unpack
     @ddt.data(
@@ -85,20 +77,8 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(question, label_attr)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': question,
-                    'descriptions': {}
-                }
-            }
-        )
-        self.assertEqual(
-            len(problem.tree.xpath("//*[normalize-space(text())='{}']".format(question))),
-            0
-        )
+        assert problem.problem_data == {'1_2_1': {'label': question, 'descriptions': {}}}
+        assert len(problem.tree.xpath("//*[normalize-space(text())='{}']".format(question))) == 0
 
     @ddt.unpack
     @ddt.data(
@@ -137,26 +117,10 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(question1, question2)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': question1,
-                    'descriptions': {}
-                },
-                '1_3_1':
-                {
-                    'label': question2,
-                    'descriptions': {}
-                }
-            }
-        )
+        assert problem.problem_data ==\
+               {'1_2_1': {'label': question1, 'descriptions': {}}, '1_3_1': {'label': question2, 'descriptions': {}}}
         for question in (question1, question2):
-            self.assertEqual(
-                len(problem.tree.xpath('//label[text()="{}"]'.format(question))),
-                0
-            )
+            assert len(problem.tree.xpath('//label[text()="{}"]'.format(question))) == 0
 
     def test_multiple_descriptions(self):
         """
@@ -176,19 +140,9 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(desc1, desc2)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': '___ requires sacrifices.',
-                    'descriptions': {
-                        'description_1_1_1': desc1,
-                        'description_1_1_2': desc2
-                    }
-                }
-            }
-        )
+        assert problem.problem_data ==\
+               {'1_2_1': {'label': '___ requires sacrifices.',
+                          'descriptions': {'description_1_1_1': desc1, 'description_1_1_2': desc2}}}
 
     def test_additional_answer_is_skipped_from_resulting_html(self):
         """Tests that additional_answer element is not present in transformed HTML"""
@@ -204,8 +158,8 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """
         problem = new_loncapa_problem(xml)
-        self.assertEqual(len(problem.extracted_tree.xpath('//additional_answer')), 0)
-        self.assertNotIn('additional_answer', problem.get_html())
+        assert len(problem.extracted_tree.xpath('//additional_answer')) == 0
+        assert 'additional_answer' not in problem.get_html()
 
     def test_non_accessible_inputtype(self):
         """
@@ -223,18 +177,9 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(question, question)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': question,
-                    'descriptions': {}
-                }
-            }
-        )
+        assert problem.problem_data == {'1_2_1': {'label': question, 'descriptions': {}}}
         # <p> tag with question text should not be deleted
-        self.assertEqual(problem.tree.xpath("string(p[text()='{}'])".format(question)), question)
+        assert problem.tree.xpath("string(p[text()='{}'])".format(question)) == question
 
     def test_label_is_empty_if_no_label_attribute(self):
         """
@@ -252,16 +197,7 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(question)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': '',
-                    'descriptions': {}
-                }
-            }
-        )
+        assert problem.problem_data == {'1_2_1': {'label': '', 'descriptions': {}}}
 
     def test_multiple_questions_problem(self):
         """
@@ -294,22 +230,12 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': 'Select the correct synonym of paranoid?',
-                    'descriptions': {'description_1_1_1': 'Only the paranoid survive.'}
-                },
-                '1_3_1':
-                {
-                    'label': 'What Apple device competed with the portable CD player?',
-                    'descriptions': {'description_1_2_1': 'Device looks like an egg plant.'}
-                }
-            }
-        )
-        self.assertEqual(len(problem.tree.xpath('//label')), 0)
+        assert problem.problem_data ==\
+               {'1_2_1': {'label': 'Select the correct synonym of paranoid?',
+                          'descriptions': {'description_1_1_1': 'Only the paranoid survive.'}},
+                '1_3_1': {'label': 'What Apple device competed with the portable CD player?',
+                          'descriptions': {'description_1_2_1': 'Device looks like an egg plant.'}}}
+        assert len(problem.tree.xpath('//label')) == 0
 
     def test_question_title_not_removed_got_children(self):
         """
@@ -334,20 +260,8 @@ class CAPAProblemTest(unittest.TestCase):
         </problem>
         """.format(question)
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': '',
-                    'descriptions': {}
-                }
-            }
-        )
-        self.assertEqual(
-            len(problem.tree.xpath('//p/img')),
-            1
-        )
+        assert problem.problem_data == {'1_2_1': {'label': '', 'descriptions': {}}}
+        assert len(problem.tree.xpath('//p/img')) == 1
 
     @ddt.unpack
     @ddt.data(
@@ -371,23 +285,9 @@ class CAPAProblemTest(unittest.TestCase):
         """.format(group_label, input1_label, input2_label)
 
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'group_label': group_label,
-                    'label': input1_label,
-                    'descriptions': {}
-                },
-                '1_2_2':
-                {
-                    'group_label': group_label,
-                    'label': input2_label,
-                    'descriptions': {}
-                }
-            }
-        )
+        assert problem.problem_data ==\
+               {'1_2_1': {'group_label': group_label, 'label': input1_label, 'descriptions': {}},
+                '1_2_2': {'group_label': group_label, 'label': input2_label, 'descriptions': {}}}
 
     def test_single_inputtypes(self):
         """
@@ -411,11 +311,11 @@ class CAPAProblemTest(unittest.TestCase):
 
         # verify that only no multi input group div is present
         multi_inputs_group = problem_html.xpath('//div[@class="multi-inputs-group"]')
-        self.assertEqual(len(multi_inputs_group), 0)
+        assert len(multi_inputs_group) == 0
 
         # verify that question is rendered only once
         question = problem_html.xpath("//*[normalize-space(text())='{}']".format(question))
-        self.assertEqual(len(question), 1)
+        assert len(question) == 1
 
     def assert_question_tag(self, question1, question2, tag, label_attr=False):
         """
@@ -449,22 +349,9 @@ class CAPAProblemTest(unittest.TestCase):
             question2_label_attr=question2_label_attr,
         )
         problem = new_loncapa_problem(xml)
-        self.assertEqual(
-            problem.problem_data,
-            {
-                '1_2_1':
-                {
-                    'label': question1,
-                    'descriptions': {}
-                },
-                '1_3_1':
-                {
-                    'label': question2,
-                    'descriptions': {}
-                }
-            }
-        )
-        self.assertEqual(len(problem.tree.xpath('//{}'.format(tag))), 0)
+        assert problem.problem_data ==\
+               {'1_2_1': {'label': question1, 'descriptions': {}}, '1_3_1': {'label': question2, 'descriptions': {}}}
+        assert len(problem.tree.xpath('//{}'.format(tag))) == 0
 
     @ddt.unpack
     @ddt.data(
@@ -505,10 +392,10 @@ class CAPAProblemTest(unittest.TestCase):
             </optionresponse>
         </problem>
         """
-        with self.assertRaises(LoncapaProblemError):
+        with pytest.raises(LoncapaProblemError):
             new_loncapa_problem(xml.format(correctness=True))
         problem = new_loncapa_problem(xml.format(correctness=False))
-        self.assertIsNotNone(problem)
+        assert problem is not None
 
 
 @ddt.ddt
@@ -524,7 +411,7 @@ class CAPAMultiInputProblemTest(unittest.TestCase):
     def assert_problem_data(self, problem_data):
         """Verify problem data is in expected state"""
         for problem_value in six.viewvalues(problem_data):
-            self.assertIsInstance(problem_value['label'], Markup)
+            assert isinstance(problem_value['label'], Markup)
 
     def assert_problem_html(self, problem_html, group_label, *input_labels):
         """
@@ -541,24 +428,24 @@ class CAPAMultiInputProblemTest(unittest.TestCase):
         multi_inputs_group = html.xpath(
             '//div[@class="wrapper-problem-response"]/div[@class="multi-inputs-group"]'
         )
-        self.assertEqual(len(multi_inputs_group), 1)
+        assert len(multi_inputs_group) == 1
 
         if group_label is None:
             # if multi inputs group label is not present then there shouldn't be `aria-labelledby` attribute
-            self.assertEqual(multi_inputs_group[0].attrib.get('aria-labelledby'), None)
+            assert multi_inputs_group[0].attrib.get('aria-labelledby') is None
         else:
             # verify that multi input group label <p> tag exists and its
             # id matches with correct multi input group aria-labelledby
             multi_inputs_group_label_id = multi_inputs_group[0].attrib.get('aria-labelledby')
             multi_inputs_group_label = html.xpath('//p[@id="{}"]'.format(multi_inputs_group_label_id))
-            self.assertEqual(len(multi_inputs_group_label), 1)
-            self.assertEqual(multi_inputs_group_label[0].text, group_label)
+            assert len(multi_inputs_group_label) == 1
+            assert multi_inputs_group_label[0].text == group_label
 
         # verify that label for each input comes only once
         for input_label in input_labels:
             # normalize-space is used to remove whitespace around the text
             input_label_element = multi_inputs_group[0].xpath('//*[normalize-space(text())="{}"]'.format(input_label))
-            self.assertEqual(len(input_label_element), 1)
+            assert len(input_label_element) == 1
 
     @ddt.unpack
     @ddt.data(
@@ -646,13 +533,13 @@ class CAPAMultiInputProblemTest(unittest.TestCase):
         description_ids = multi_inputs_group.attrib.get('aria-describedby', '').split()
 
         # Verify that number of descriptions matches description_ids
-        self.assertEqual(len(description_ids), len(descriptions))
+        assert len(description_ids) == len(descriptions)
 
         # For each description, check its order and text is correct
         for index, description_id in enumerate(description_ids):
             description_element = multi_inputs_group.xpath('//p[@id="{}"]'.format(description_id))
-            self.assertEqual(len(description_element), 1)
-            self.assertEqual(description_element[0].text, descriptions[index])
+            assert len(description_element) == 1
+            assert description_element[0].text == descriptions[index]
 
 
 @ddt.ddt
@@ -678,7 +565,7 @@ class CAPAProblemReportHelpersTest(unittest.TestCase):
             }
         }
         with patch.object(problem, 'problem_data', mock_problem_data):
-            self.assertEqual(problem.find_question_label(answer_id), stripped_label)
+            assert problem.find_question_label(answer_id) == stripped_label
 
     @ddt.data(None, dict(), [None])
     def test_find_answer_test_not_implemented(self, current_answer):
@@ -718,7 +605,7 @@ class CAPAProblemReportHelpersTest(unittest.TestCase):
             </problem>
             """
         )
-        self.assertEqual(problem.find_answer_text(answer_id, choice_id), answer_text)
+        assert problem.find_answer_text(answer_id, choice_id) == answer_text
 
     @ddt.data(
         # Test for ChoiceResponse
@@ -756,7 +643,7 @@ class CAPAProblemReportHelpersTest(unittest.TestCase):
             </problem>
             """
         )
-        self.assertEqual(problem.find_correct_answer_text(answer_id), answer_text)
+        assert problem.find_correct_answer_text(answer_id) == answer_text
 
     def test_find_answer_text_textinput(self):
         problem = new_loncapa_problem(
@@ -768,7 +655,7 @@ class CAPAProblemReportHelpersTest(unittest.TestCase):
             </problem>
             """
         )
-        self.assertEqual(problem.find_answer_text('1_2_1', 'hide'), 'hide')
+        assert problem.find_answer_text('1_2_1', 'hide') == 'hide'
 
     def test_get_question_answer(self):
         problem = new_loncapa_problem(
@@ -789,4 +676,4 @@ class CAPAProblemReportHelpersTest(unittest.TestCase):
 
         # Ensure that the answer is a string so that the dict returned from this
         # function can eventualy be serialized to json without issues.
-        self.assertIsInstance(problem.get_question_answers()['1_solution_1'], six.text_type)
+        assert isinstance(problem.get_question_answers()['1_solution_1'], six.text_type)
diff --git a/common/lib/capa/capa/tests/test_correctmap.py b/common/lib/capa/capa/tests/test_correctmap.py
index c82fb9b553843461e302fbf18dc74cd9f8d310b3..e58b3deadddc1656e42027744eb433425c7ab3dc 100644
--- a/common/lib/capa/capa/tests/test_correctmap.py
+++ b/common/lib/capa/capa/tests/test_correctmap.py
@@ -5,7 +5,7 @@ Tests to verify that CorrectMap behaves correctly
 
 import datetime
 import unittest
-
+import pytest
 from capa.correctmap import CorrectMap
 
 
@@ -54,48 +54,48 @@ class CorrectMapTest(unittest.TestCase):
         )
 
         # Assert that each input has the expected properties
-        self.assertTrue(self.cmap.is_correct('1_2_1'))
-        self.assertFalse(self.cmap.is_correct('2_2_1'))
-        self.assertTrue(self.cmap.is_correct('3_2_1'))
+        assert self.cmap.is_correct('1_2_1')
+        assert not self.cmap.is_correct('2_2_1')
+        assert self.cmap.is_correct('3_2_1')
 
-        self.assertTrue(self.cmap.is_partially_correct('3_2_1'))
-        self.assertFalse(self.cmap.is_partially_correct('2_2_1'))
+        assert self.cmap.is_partially_correct('3_2_1')
+        assert not self.cmap.is_partially_correct('2_2_1')
 
         # Intentionally testing an item that's not in cmap.
-        self.assertFalse(self.cmap.is_partially_correct('9_2_1'))
+        assert not self.cmap.is_partially_correct('9_2_1')
 
-        self.assertEqual(self.cmap.get_correctness('1_2_1'), 'correct')
-        self.assertEqual(self.cmap.get_correctness('2_2_1'), 'incorrect')
-        self.assertEqual(self.cmap.get_correctness('3_2_1'), 'partially-correct')
+        assert self.cmap.get_correctness('1_2_1') == 'correct'
+        assert self.cmap.get_correctness('2_2_1') == 'incorrect'
+        assert self.cmap.get_correctness('3_2_1') == 'partially-correct'
 
-        self.assertEqual(self.cmap.get_npoints('1_2_1'), 5)
-        self.assertEqual(self.cmap.get_npoints('2_2_1'), 0)
-        self.assertEqual(self.cmap.get_npoints('3_2_1'), 3)
+        assert self.cmap.get_npoints('1_2_1') == 5
+        assert self.cmap.get_npoints('2_2_1') == 0
+        assert self.cmap.get_npoints('3_2_1') == 3
 
-        self.assertEqual(self.cmap.get_msg('1_2_1'), 'Test message')
-        self.assertEqual(self.cmap.get_msg('2_2_1'), None)
+        assert self.cmap.get_msg('1_2_1') == 'Test message'
+        assert self.cmap.get_msg('2_2_1') is None
 
-        self.assertEqual(self.cmap.get_hint('1_2_1'), 'Test hint')
-        self.assertEqual(self.cmap.get_hint('2_2_1'), None)
+        assert self.cmap.get_hint('1_2_1') == 'Test hint'
+        assert self.cmap.get_hint('2_2_1') is None
 
-        self.assertEqual(self.cmap.get_hintmode('1_2_1'), 'always')
-        self.assertEqual(self.cmap.get_hintmode('2_2_1'), None)
+        assert self.cmap.get_hintmode('1_2_1') == 'always'
+        assert self.cmap.get_hintmode('2_2_1') is None
 
-        self.assertTrue(self.cmap.is_queued('1_2_1'))
-        self.assertFalse(self.cmap.is_queued('2_2_1'))
+        assert self.cmap.is_queued('1_2_1')
+        assert not self.cmap.is_queued('2_2_1')
 
-        self.assertEqual(self.cmap.get_queuetime_str('1_2_1'), '20130228100026')
-        self.assertEqual(self.cmap.get_queuetime_str('2_2_1'), None)
+        assert self.cmap.get_queuetime_str('1_2_1') == '20130228100026'
+        assert self.cmap.get_queuetime_str('2_2_1') is None
 
-        self.assertTrue(self.cmap.is_right_queuekey('1_2_1', 'secretstring'))
-        self.assertFalse(self.cmap.is_right_queuekey('1_2_1', 'invalidstr'))
-        self.assertFalse(self.cmap.is_right_queuekey('1_2_1', ''))
-        self.assertFalse(self.cmap.is_right_queuekey('1_2_1', None))
+        assert self.cmap.is_right_queuekey('1_2_1', 'secretstring')
+        assert not self.cmap.is_right_queuekey('1_2_1', 'invalidstr')
+        assert not self.cmap.is_right_queuekey('1_2_1', '')
+        assert not self.cmap.is_right_queuekey('1_2_1', None)
 
-        self.assertFalse(self.cmap.is_right_queuekey('2_2_1', 'secretstring'))
-        self.assertFalse(self.cmap.is_right_queuekey('2_2_1', 'invalidstr'))
-        self.assertFalse(self.cmap.is_right_queuekey('2_2_1', ''))
-        self.assertFalse(self.cmap.is_right_queuekey('2_2_1', None))
+        assert not self.cmap.is_right_queuekey('2_2_1', 'secretstring')
+        assert not self.cmap.is_right_queuekey('2_2_1', 'invalidstr')
+        assert not self.cmap.is_right_queuekey('2_2_1', '')
+        assert not self.cmap.is_right_queuekey('2_2_1', None)
 
     def test_get_npoints(self):
         # Set the correctmap properties for 4 inputs
@@ -153,28 +153,28 @@ class CorrectMapTest(unittest.TestCase):
         # If no points assigned and correct --> 1 point
         # If no points assigned and partially correct --> 1 point
         # If no points assigned and incorrect --> 0 points
-        self.assertEqual(self.cmap.get_npoints('1_2_1'), 5.3)
-        self.assertEqual(self.cmap.get_npoints('2_2_1'), 1)
-        self.assertEqual(self.cmap.get_npoints('3_2_1'), 5)
-        self.assertEqual(self.cmap.get_npoints('4_2_1'), 0)
-        self.assertEqual(self.cmap.get_npoints('5_2_1'), 0)
-        self.assertEqual(self.cmap.get_npoints('6_2_1'), 2.5)
-        self.assertEqual(self.cmap.get_npoints('7_2_1'), 1)
+        assert self.cmap.get_npoints('1_2_1') == 5.3
+        assert self.cmap.get_npoints('2_2_1') == 1
+        assert self.cmap.get_npoints('3_2_1') == 5
+        assert self.cmap.get_npoints('4_2_1') == 0
+        assert self.cmap.get_npoints('5_2_1') == 0
+        assert self.cmap.get_npoints('6_2_1') == 2.5
+        assert self.cmap.get_npoints('7_2_1') == 1
 
     def test_set_overall_message(self):
 
         # Default is an empty string string
-        self.assertEqual(self.cmap.get_overall_message(), "")
+        assert self.cmap.get_overall_message() == ''
 
         # Set a message that applies to the whole question
         self.cmap.set_overall_message("Test message")
 
         # Retrieve the message
-        self.assertEqual(self.cmap.get_overall_message(), "Test message")
+        assert self.cmap.get_overall_message() == 'Test message'
 
         # Setting the message to None --> empty string
         self.cmap.set_overall_message(None)
-        self.assertEqual(self.cmap.get_overall_message(), "")
+        assert self.cmap.get_overall_message() == ''
 
     def test_update_from_correctmap(self):
         # Initialize a CorrectMap with some properties
@@ -199,15 +199,9 @@ class CorrectMapTest(unittest.TestCase):
         other_cmap.update(self.cmap)
 
         # Assert that it has all the same properties
-        self.assertEqual(
-            other_cmap.get_overall_message(),
-            self.cmap.get_overall_message()
-        )
+        assert other_cmap.get_overall_message() == self.cmap.get_overall_message()
 
-        self.assertEqual(
-            other_cmap.get_dict(),
-            self.cmap.get_dict()
-        )
+        assert other_cmap.get_dict() == self.cmap.get_dict()
 
     def test_update_from_invalid(self):
         # Should get an exception if we try to update() a CorrectMap
@@ -215,7 +209,7 @@ class CorrectMapTest(unittest.TestCase):
         invalid_list = [None, "string", 5, datetime.datetime.today()]
 
         for invalid in invalid_list:
-            with self.assertRaises(Exception):
+            with pytest.raises(Exception):
                 self.cmap.update(invalid)
 
     def test_set_none_state(self):
@@ -226,4 +220,4 @@ class CorrectMapTest(unittest.TestCase):
         invalid_list = [None, "", False, 0]
         for invalid in invalid_list:
             self.cmap.set_dict(invalid)
-            self.assertEqual(self.cmap.get_dict(), {})
+            assert self.cmap.get_dict() == {}
diff --git a/common/lib/capa/capa/tests/test_customrender.py b/common/lib/capa/capa/tests/test_customrender.py
index b0c89a68eb283870dacb477b7de1b0221888ed9a..8afc50e82cdaf2e33b62e65268b19694d03c8350 100644
--- a/common/lib/capa/capa/tests/test_customrender.py
+++ b/common/lib/capa/capa/tests/test_customrender.py
@@ -30,7 +30,7 @@ class HelperTest(unittest.TestCase):
     '''
     def check(self, d):
         xml = etree.XML(test_capa_system().render_template('blah', d))
-        self.assertEqual(d, extract_context(xml))
+        assert d == extract_context(xml)
 
     def test_extract_context(self):
         self.check({})
@@ -51,12 +51,12 @@ class SolutionRenderTest(unittest.TestCase):
 
         renderer = lookup_tag('solution')(test_capa_system(), element)
 
-        self.assertEqual(renderer.id, 'solution_12')
+        assert renderer.id == 'solution_12'
 
         # Our test_capa_system "renders" templates to a div with the repr of the context.
         xml = renderer.get_html()
         context = extract_context(xml)
-        self.assertEqual(context, {'id': 'solution_12'})
+        assert context == {'id': 'solution_12'}
 
 
 class MathRenderTest(unittest.TestCase):
@@ -70,7 +70,7 @@ class MathRenderTest(unittest.TestCase):
 
         renderer = lookup_tag('math')(test_capa_system(), element)
 
-        self.assertEqual(renderer.mathstr, mathjax_out)
+        assert renderer.mathstr == mathjax_out
 
     def test_parsing(self):
         self.check_parse('$abc$', '[mathjaxinline]abc[/mathjaxinline]')
diff --git a/common/lib/capa/capa/tests/test_hint_functionality.py b/common/lib/capa/capa/tests/test_hint_functionality.py
index c2d89eea79c029d7bfda52962584d8407aedba56..cfa2a8b147d16e3c833a1d5bed12db128130a6f1 100644
--- a/common/lib/capa/capa/tests/test_hint_functionality.py
+++ b/common/lib/capa/capa/tests/test_hint_functionality.py
@@ -5,7 +5,7 @@ Tests of extended hints
 
 
 import unittest
-
+import pytest
 from ddt import data, ddt, unpack
 
 from capa.tests.helpers import load_fixture, new_loncapa_problem
@@ -89,7 +89,7 @@ class TextInputHintsTest(HintTest):
     @unpack
     def test_text_input_hints(self, problem_id, choice, expected_string):
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 @ddt
@@ -121,7 +121,7 @@ class TextInputExtendedHintsCaseInsensitive(HintTest):
     @unpack
     def test_text_input_hints(self, problem_id, choice, expected_string):
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 @ddt
@@ -149,7 +149,7 @@ class TextInputExtendedHintsCaseSensitive(HintTest):
     @unpack
     def test_text_input_hints(self, problem_id, choice, expected_string):
         message_text = self.get_hint(problem_id, choice)
-        self.assertEqual(message_text, expected_string)
+        assert message_text == expected_string
 
 
 @ddt
@@ -173,8 +173,8 @@ class TextInputExtendedHintsCompatible(HintTest):
     @unpack
     def test_text_input_hints(self, problem_id, choice, correct, expected_string):
         message_text = self.get_hint(problem_id, choice)
-        self.assertEqual(message_text, expected_string)
-        self.assertEqual(self.correctness(problem_id, choice), correct)
+        assert message_text == expected_string
+        assert self.correctness(problem_id, choice) == correct
 
 
 @ddt
@@ -209,8 +209,8 @@ class TextInputExtendedHintsRegex(HintTest):
     @unpack
     def test_text_input_hints(self, problem_id, choice, correct, expected_string):
         message_text = self.get_hint(problem_id, choice)
-        self.assertEqual(message_text, expected_string)
-        self.assertEqual(self.correctness(problem_id, choice), correct)
+        assert message_text == expected_string
+        assert self.correctness(problem_id, choice) == correct
 
 
 @ddt
@@ -250,7 +250,7 @@ class NumericInputHintsTest(HintTest):
     @unpack
     def test_numeric_input_hints(self, problem_id, choice, expected_string):
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 @ddt
@@ -329,7 +329,7 @@ class CheckboxHintsTest(HintTest):
     def test_checkbox_hints(self, problem_id, choice, expected_string):
         self.maxDiff = None  # pylint: disable=invalid-name
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 class CheckboxHintsTestTracking(HintTest):
@@ -449,7 +449,7 @@ class MultpleChoiceHintsTest(HintTest):
     @unpack
     def test_multiplechoice_hints(self, problem_id, choice, expected_string):
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 @ddt
@@ -483,7 +483,7 @@ class MultpleChoiceHintsWithHtmlTest(HintTest):
     @unpack
     def test_multiplechoice_hints(self, problem_id, choice, expected_string):
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 @ddt
@@ -530,7 +530,7 @@ class DropdownHintsTest(HintTest):
     @unpack
     def test_dropdown_hints(self, problem_id, choice, expected_string):
         hint = self.get_hint(problem_id, choice)
-        self.assertEqual(hint, expected_string)
+        assert hint == expected_string
 
 
 class ErrorConditionsTest(HintTest):
@@ -539,5 +539,5 @@ class ErrorConditionsTest(HintTest):
     """
     def test_error_conditions_illegal_element(self):
         xml_with_errors = load_fixture('extended_hints_with_errors.xml')
-        with self.assertRaises(Exception):
+        with pytest.raises(Exception):
             new_loncapa_problem(xml_with_errors)    # this problem is improperly constructed
diff --git a/common/lib/capa/capa/tests/test_html_render.py b/common/lib/capa/capa/tests/test_html_render.py
index 17bc9878dd5f534662218edfbfc2e7a8772f850d..4bfe49ccaecd84146d6b370b2fcc72de9a2c774d 100644
--- a/common/lib/capa/capa/tests/test_html_render.py
+++ b/common/lib/capa/capa/tests/test_html_render.py
@@ -65,8 +65,8 @@ class CapaHtmlRenderTest(unittest.TestCase):
 
         # Expect that the include file was embedded in the problem
         test_element = rendered_html.find("test")
-        self.assertEqual(test_element.tag, "test")
-        self.assertEqual(test_element.text, "Test include")
+        assert test_element.tag == 'test'
+        assert test_element.text == 'Test include'
 
     def test_process_outtext(self):
         # Generate some XML with <startouttext /> and <endouttext />
@@ -85,7 +85,7 @@ class CapaHtmlRenderTest(unittest.TestCase):
         # Expect that the <startouttext /> and <endouttext />
         # were converted to <span></span> tags
         span_element = rendered_html.find('span')
-        self.assertEqual(span_element.text, 'Test text')
+        assert span_element.text == 'Test text'
 
     def test_anonymous_student_id(self):
         # make sure anonymous_student_id is rendered properly as a context variable
@@ -103,7 +103,7 @@ class CapaHtmlRenderTest(unittest.TestCase):
 
         # Expect that the anonymous_student_id was converted to "student"
         span_element = rendered_html.find('span')
-        self.assertEqual(span_element.text, 'Welcome student')
+        assert span_element.text == 'Welcome student'
 
     def test_render_script(self):
         # Generate some XML with a <script> tag
@@ -121,7 +121,7 @@ class CapaHtmlRenderTest(unittest.TestCase):
 
         # Expect that the script element has been removed from the rendered HTML
         script_element = rendered_html.find('script')
-        self.assertEqual(None, script_element)
+        assert script_element is None
 
     def test_render_javascript(self):
         # Generate some XML with a <script> tag
@@ -138,10 +138,7 @@ class CapaHtmlRenderTest(unittest.TestCase):
         rendered_html = etree.XML(problem.get_html())
 
         # expect the javascript is still present in the rendered html
-        self.assertIn(
-            "<script type=\"text/javascript\">function(){}</script>",
-            etree.tostring(rendered_html).decode('utf-8')
-        )
+        assert '<script type="text/javascript">function(){}</script>' in etree.tostring(rendered_html).decode('utf-8')
 
     def test_render_response_xml(self):
         # Generate some XML for a string response
@@ -162,23 +159,23 @@ class CapaHtmlRenderTest(unittest.TestCase):
         problem = new_loncapa_problem(xml_str, capa_system=the_system)
         rendered_html = etree.XML(problem.get_html())
         # Expect problem has been turned into a <div>
-        self.assertEqual(rendered_html.tag, "div")
+        assert rendered_html.tag == 'div'
 
         # Expect that the response has been turned into a <div> with correct attributes
         response_element = rendered_html.find('div')
 
-        self.assertEqual(response_element.tag, "div")
-        self.assertEqual(response_element.attrib["aria-label"], "Question 1")
+        assert response_element.tag == 'div'
+        assert response_element.attrib['aria-label'] == 'Question 1'
 
         # Expect that the response div.wrapper-problem-response
         # that contains a <div> for the textline
         textline_element = response_element.find('div')
-        self.assertEqual(textline_element.text, 'Input Template Render')
+        assert textline_element.text == 'Input Template Render'
 
         # Expect a child <div> for the solution
         # with the rendered template
         solution_element = rendered_html.xpath('//div[@class="input-template-render"]')[0]
-        self.assertEqual(solution_element.text, 'Input Template Render')
+        assert solution_element.text == 'Input Template Render'
 
         # Expect that the template renderer was called with the correct
         # arguments, once for the textline input and once for
@@ -208,10 +205,7 @@ class CapaHtmlRenderTest(unittest.TestCase):
             mock.call('solutionspan.html', expected_solution_context)
         ]
 
-        self.assertEqual(
-            the_system.render_template.call_args_list,
-            expected_calls
-        )
+        assert the_system.render_template.call_args_list == expected_calls
 
     def test_correct_aria_label(self):
         xml = """
@@ -233,8 +227,8 @@ class CapaHtmlRenderTest(unittest.TestCase):
         problem = new_loncapa_problem(xml)
         rendered_html = etree.XML(problem.get_html())
         response_elements = rendered_html.findall('div')
-        self.assertEqual(response_elements[0].attrib['aria-label'], 'Question 1')
-        self.assertEqual(response_elements[1].attrib['aria-label'], 'Question 2')
+        assert response_elements[0].attrib['aria-label'] == 'Question 1'
+        assert response_elements[1].attrib['aria-label'] == 'Question 2'
 
     def test_render_response_with_overall_msg(self):
         # CustomResponse script that sets an overall_message
@@ -261,16 +255,16 @@ class CapaHtmlRenderTest(unittest.TestCase):
         # Expect that there is a <div> within the response <div>
         # with css class response_message
         msg_div_element = rendered_html.find(".//div[@class='response_message']")
-        self.assertEqual(msg_div_element.tag, "div")
-        self.assertEqual(msg_div_element.get('class'), "response_message")
+        assert msg_div_element.tag == 'div'
+        assert msg_div_element.get('class') == 'response_message'
 
         # Expect that the <div> contains our message (as part of the XML tree)
         msg_p_elements = msg_div_element.findall('p')
-        self.assertEqual(msg_p_elements[0].tag, "p")
-        self.assertEqual(msg_p_elements[0].text, "Test message 1")
+        assert msg_p_elements[0].tag == 'p'
+        assert msg_p_elements[0].text == 'Test message 1'
 
-        self.assertEqual(msg_p_elements[1].tag, "p")
-        self.assertEqual(msg_p_elements[1].text, "Test message 2")
+        assert msg_p_elements[1].tag == 'p'
+        assert msg_p_elements[1].text == 'Test message 2'
 
     def test_substitute_python_vars(self):
         # Generate some XML with Python variables defined in a script
@@ -288,7 +282,7 @@ class CapaHtmlRenderTest(unittest.TestCase):
 
         # Expect that the variable $test has been replaced with its value
         span_element = rendered_html.find('span')
-        self.assertEqual(span_element.get('attr'), "TEST")
+        assert span_element.get('attr') == 'TEST'
 
     def test_xml_comments_and_other_odd_things(self):
         # Comments and processing instructions should be skipped.
diff --git a/common/lib/capa/capa/tests/test_input_templates.py b/common/lib/capa/capa/tests/test_input_templates.py
index 5d3d0ae1f28921f5a566711fc9aac4494feb5fc1..3425c623d0656b3ea6b2fe4fddcb4f80d67df9f6 100644
--- a/common/lib/capa/capa/tests/test_input_templates.py
+++ b/common/lib/capa/capa/tests/test_input_templates.py
@@ -91,7 +91,7 @@ class TemplateTestCase(unittest.TestCase):
         message = ("XML does not have %d match(es) for xpath '%s'\nXML: %s\nContext: %s"
                    % (exact_num, str(xpath), etree.tostring(xml_root), str(context_dict)))
 
-        self.assertEqual(len(xml_root.xpath(xpath)), exact_num, msg=message)
+        assert len(xml_root.xpath(xpath)) == exact_num, message
 
     def assert_no_xpath(self, xml_root, xpath, context_dict):
         """
@@ -117,12 +117,11 @@ class TemplateTestCase(unittest.TestCase):
         If no elements are found, the assertion fails.
         """
         element_list = xml_root.xpath(xpath)
-        self.assertGreater(len(element_list), 0, "Could not find element at '%s'\n%s" %
-                           (str(xpath), etree.tostring(xml_root)))
+        assert len(element_list) > 0, ("Could not find element at '%s'\n%s" % (str(xpath), etree.tostring(xml_root)))
         if exact:
-            self.assertEqual(text, element_list[0].text.strip())
+            assert text == element_list[0].text.strip()
         else:
-            self.assertIn(text, element_list[0].text.strip())
+            assert text in element_list[0].text.strip()
 
     def assert_description(self, describedby_xpaths):
         """
@@ -137,17 +136,17 @@ class TemplateTestCase(unittest.TestCase):
         descriptions = OrderedDict(
             (tag.get('id'), stringify_children(tag)) for tag in xml.xpath('//p[@class="question-description"]')
         )
-        self.assertEqual(self.DESCRIPTIONS, descriptions)
+        assert self.DESCRIPTIONS == descriptions
 
         # for each xpath verify that description_ids are set correctly
         for describedby_xpath in describedby_xpaths:
             describedbys = xml.xpath(describedby_xpath)
 
             # aria-describedby attributes must have ids
-            self.assertTrue(describedbys)
+            assert describedbys
 
             for describedby in describedbys:
-                self.assertEqual(describedby, self.DESCRIPTION_IDS)
+                assert describedby == self.DESCRIPTION_IDS
 
     def assert_describedby_attribute(self, describedby_xpaths):
         """
@@ -162,7 +161,7 @@ class TemplateTestCase(unittest.TestCase):
         # for each xpath verify that description_ids are set correctly
         for describedby_xpath in describedby_xpaths:
             describedbys = xml.xpath(describedby_xpath)
-            self.assertFalse(describedbys)
+            assert not describedbys
 
     def assert_status(self, status_div=False, status_class=False):
         """
@@ -234,8 +233,8 @@ class TemplateTestCase(unittest.TestCase):
                 self.assert_has_xpath(xml, "//*[@aria-label='%s']" % label['expected'], self.context)
             else:
                 element_list = xml.xpath(xpath)
-                self.assertEqual(len(element_list), 1)
-                self.assertEqual(stringify_children(element_list[0]), label['actual'])
+                assert len(element_list) == 1
+                assert stringify_children(element_list[0]) == label['actual']
 
 
 class ChoiceGroupTemplateTest(TemplateTestCase):
diff --git a/common/lib/capa/capa/tests/test_inputtypes.py b/common/lib/capa/capa/tests/test_inputtypes.py
index b3df59bf5cfe90869625a117331292a40987c349..8c7e3be93d72e1b9b311e88669fa42fb4bf70295 100644
--- a/common/lib/capa/capa/tests/test_inputtypes.py
+++ b/common/lib/capa/capa/tests/test_inputtypes.py
@@ -24,6 +24,7 @@ import unittest
 import xml.sax.saxutils as saxutils
 from collections import OrderedDict
 
+import pytest
 import six
 from lxml import etree
 from lxml.html import fromstring
@@ -88,7 +89,7 @@ class OptionInputTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id='sky_input')
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_option_parsing(self):
         f = inputtypes.OptionInput.parse_options
@@ -98,7 +99,7 @@ class OptionInputTest(unittest.TestCase):
             Take list of options, confirm that output is in the silly doubled format
             """
             expected = [(o, o) for o in options]
-            self.assertEqual(f(input), expected)
+            assert f(input) == expected
 
         check("('a','b')", ['a', 'b'])
         check("('a', 'b')", ['a', 'b'])
@@ -159,7 +160,7 @@ class ChoiceGroupTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id='sky_input')
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_choicegroup(self):
         self.check_group('choicegroup', 'radio', '')
@@ -251,7 +252,7 @@ class JSInputTest(unittest.TestCase):
         }
         full_expected_context.update(expected_context)
 
-        self.assertEqual(full_expected_context, context)
+        assert full_expected_context == context
 
 
 class TextLineTest(unittest.TestCase):
@@ -288,7 +289,7 @@ class TextLineTest(unittest.TestCase):
             'response_data': RESPONSE_DATA,
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_math_rendering(self):
         size = "42"
@@ -327,7 +328,7 @@ class TextLineTest(unittest.TestCase):
             'response_data': RESPONSE_DATA,
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_trailing_text_rendering(self):
         size = "42"
@@ -372,7 +373,7 @@ class TextLineTest(unittest.TestCase):
                 'response_data': RESPONSE_DATA,
                 'describedby_html': TRAILING_TEXT_DESCRIBEDBY.format(trailing_text_id=prob_id, status_id=prob_id)
             }
-            self.assertEqual(context, expected)
+            assert context == expected
 
 
 class FileSubmissionTest(unittest.TestCase):
@@ -416,7 +417,7 @@ class FileSubmissionTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
 
 class CodeInputTest(unittest.TestCase):
@@ -472,7 +473,7 @@ class CodeInputTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
 
 class MatlabTest(unittest.TestCase):
@@ -534,7 +535,7 @@ class MatlabTest(unittest.TestCase):
             'describedby_html': HTML('aria-describedby="status_prob_1_2"')
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_rendering_with_state(self):
         state = {
@@ -569,7 +570,7 @@ class MatlabTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_rendering_when_completed(self):
         for status in ['correct', 'incorrect']:
@@ -603,7 +604,7 @@ class MatlabTest(unittest.TestCase):
                 'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
             }
 
-            self.assertEqual(context, expected)
+            assert context == expected
 
     @patch('capa.inputtypes.time.time', return_value=10)
     def test_rendering_while_queued(self, time):  # lint-amnesty, pylint: disable=unused-argument
@@ -637,7 +638,7 @@ class MatlabTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_plot_data(self):
         data = {'submission': 'x = 1234;'}
@@ -645,19 +646,19 @@ class MatlabTest(unittest.TestCase):
 
         test_capa_system().xqueue['interface'].send_to_queue.assert_called_with(header=ANY, body=ANY)
 
-        self.assertTrue(response['success'])
-        self.assertIsNotNone(self.the_input.input_state['queuekey'])
-        self.assertEqual(self.the_input.input_state['queuestate'], 'queued')
+        assert response['success']
+        assert self.the_input.input_state['queuekey'] is not None
+        assert self.the_input.input_state['queuestate'] == 'queued'
 
     def test_plot_data_failure(self):
         data = {'submission': 'x = 1234;'}
         error_message = 'Error message!'
         test_capa_system().xqueue['interface'].send_to_queue.return_value = (1, error_message)
         response = self.the_input.handle_ajax("plot", data)
-        self.assertFalse(response['success'])
-        self.assertEqual(response['message'], error_message)
-        self.assertNotIn('queuekey', self.the_input.input_state)
-        self.assertNotIn('queuestate', self.the_input.input_state)
+        assert not response['success']
+        assert response['message'] == error_message
+        assert 'queuekey' not in self.the_input.input_state
+        assert 'queuestate' not in self.the_input.input_state
 
     @patch('capa.inputtypes.time.time', return_value=10)
     def test_ungraded_response_success(self, time):  # lint-amnesty, pylint: disable=unused-argument
@@ -674,9 +675,9 @@ class MatlabTest(unittest.TestCase):
         queue_msg = json.dumps({'msg': inner_msg})
 
         the_input.ungraded_response(queue_msg, queuekey)
-        self.assertIsNone(input_state['queuekey'])
-        self.assertIsNone(input_state['queuestate'])
-        self.assertEqual(input_state['queue_msg'], inner_msg)
+        assert input_state['queuekey'] is None
+        assert input_state['queuestate'] is None
+        assert input_state['queue_msg'] == inner_msg
 
     @patch('capa.inputtypes.time.time', return_value=10)
     def test_ungraded_response_key_mismatch(self, time):  # lint-amnesty, pylint: disable=unused-argument
@@ -693,9 +694,9 @@ class MatlabTest(unittest.TestCase):
         queue_msg = json.dumps({'msg': inner_msg})
 
         the_input.ungraded_response(queue_msg, 'abc')
-        self.assertEqual(input_state['queuekey'], queuekey)
-        self.assertEqual(input_state['queuestate'], 'queued')
-        self.assertNotIn('queue_msg', input_state)
+        assert input_state['queuekey'] == queuekey
+        assert input_state['queuestate'] == 'queued'
+        assert 'queue_msg' not in input_state
 
     @patch('capa.inputtypes.time.time', return_value=20)
     def test_matlab_response_timeout_not_exceeded(self, time):  # lint-amnesty, pylint: disable=unused-argument
@@ -704,7 +705,7 @@ class MatlabTest(unittest.TestCase):
         elt = etree.fromstring(self.xml)
 
         the_input = self.input_class(test_capa_system(), elt, state)
-        self.assertEqual(the_input.status, 'queued')
+        assert the_input.status == 'queued'
 
     @patch('capa.inputtypes.time.time', return_value=45)
     def test_matlab_response_timeout_exceeded(self, time):  # lint-amnesty, pylint: disable=unused-argument
@@ -713,8 +714,8 @@ class MatlabTest(unittest.TestCase):
         elt = etree.fromstring(self.xml)
 
         the_input = self.input_class(test_capa_system(), elt, state)
-        self.assertEqual(the_input.status, 'unsubmitted')
-        self.assertEqual(the_input.msg, 'No response from Xqueue within {} seconds. Aborted.'.format(XQUEUE_TIMEOUT))
+        assert the_input.status == 'unsubmitted'
+        assert the_input.msg == 'No response from Xqueue within {} seconds. Aborted.'.format(XQUEUE_TIMEOUT)
 
     @patch('capa.inputtypes.time.time', return_value=20)
     def test_matlab_response_migration_of_queuetime(self, time):  # lint-amnesty, pylint: disable=unused-argument
@@ -725,7 +726,7 @@ class MatlabTest(unittest.TestCase):
         elt = etree.fromstring(self.xml)
 
         the_input = self.input_class(test_capa_system(), elt, state)
-        self.assertEqual(the_input.status, 'unsubmitted')
+        assert the_input.status == 'unsubmitted'
 
     def test_matlab_api_key(self):
         """
@@ -741,8 +742,8 @@ class MatlabTest(unittest.TestCase):
 
         body = system.xqueue['interface'].send_to_queue.call_args[1]['body']
         payload = json.loads(body)
-        self.assertEqual('test_api_key', payload['token'])
-        self.assertEqual('2', payload['endpoint_version'])
+        assert 'test_api_key' == payload['token']
+        assert '2' == payload['endpoint_version']
 
     def test_get_html(self):
         # usual output
@@ -791,17 +792,17 @@ class MatlabTest(unittest.TestCase):
         audio_index = element_tags.index('audio')
 
         six.assertCountEqual(self, element_keys[audio_index], ['autobuffer', 'controls', 'autoplay', 'src'])
-        self.assertEqual(elements[audio_index].get('src'), 'data:audio/wav;base64=')
-        self.assertEqual(elements[audio_index].text, 'Audio is not supported on this browser.')
+        assert elements[audio_index].get('src') == 'data:audio/wav;base64='
+        assert elements[audio_index].text == 'Audio is not supported on this browser.'
         href_index = element_keys.index(['href'])
-        self.assertEqual(elements[href_index].get('href'), 'https://endpoint.mss-mathworks.com/media/filename.wav')
+        assert elements[href_index].get('href') == 'https://endpoint.mss-mathworks.com/media/filename.wav'
         id_index = element_keys.index(['id'])
-        self.assertEqual(elements[id_index].get('id'), 'mwAudioPlaceHolder')
+        assert elements[id_index].get('id') == 'mwAudioPlaceHolder'
         output_string = etree.tostring(output).decode('utf-8')
 
         # check that exception is raised during parsing for html.
         self.the_input.capa_system.render_template = lambda *args: "<aaa"
-        with self.assertRaises(etree.XMLSyntaxError):
+        with pytest.raises(etree.XMLSyntaxError):
             self.the_input.get_html()
 
         self.the_input.capa_system.render_template = old_render_template
@@ -886,7 +887,7 @@ class MatlabTest(unittest.TestCase):
             'response_data': {},
             'describedby_html': 'aria-describedby="status_{id}"'.format(id=prob_id)
         }
-        self.assertEqual(context, expected)
+        assert context == expected
         self.the_input.capa_system.render_template = DemoSystem().render_template
         self.the_input.get_html()  # Should not raise an exception
 
@@ -903,7 +904,7 @@ class MatlabTest(unittest.TestCase):
             }
             elt = etree.fromstring(self.xml)
             the_input = self.input_class(test_capa_system(), elt, state)
-            self.assertEqual(the_input.queue_msg, queue_msg)
+            assert the_input.queue_msg == queue_msg
 
     def test_matlab_queue_message_not_allowed_tag(self):
         """
@@ -918,7 +919,7 @@ class MatlabTest(unittest.TestCase):
         elt = etree.fromstring(self.xml)
         the_input = self.input_class(test_capa_system(), elt, state)
         expected = "&lt;script&gt;Test message&lt;/script&gt;"
-        self.assertEqual(the_input.queue_msg, expected)
+        assert the_input.queue_msg == expected
 
     def test_matlab_sanitize_msg(self):
         """
@@ -927,7 +928,7 @@ class MatlabTest(unittest.TestCase):
         not_allowed_tag = 'script'
         self.the_input.msg = "<{0}>Test message</{0}>".format(not_allowed_tag)
         expected = "&lt;script&gt;Test message&lt;/script&gt;"
-        self.assertEqual(self.the_input._get_render_context()['msg'], expected)  # pylint: disable=protected-access
+        assert self.the_input._get_render_context()['msg'] == expected  # pylint: disable=protected-access
 
 
 def html_tree_equal(received, expected):
@@ -996,7 +997,7 @@ class SchematicTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
 
 class ImageInputTest(unittest.TestCase):
@@ -1041,7 +1042,7 @@ class ImageInputTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_with_value(self):
         # Check that compensating for the dot size works properly.
@@ -1096,7 +1097,7 @@ class CrystallographyTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
 
 class VseprTest(unittest.TestCase):
@@ -1143,7 +1144,7 @@ class VseprTest(unittest.TestCase):
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
 
-        self.assertEqual(context, expected)
+        assert context == expected
 
 
 class ChemicalEquationTest(unittest.TestCase):
@@ -1180,7 +1181,7 @@ class ChemicalEquationTest(unittest.TestCase):
             'response_data': RESPONSE_DATA,
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_chemcalc_ajax_sucess(self):
         """
@@ -1189,24 +1190,24 @@ class ChemicalEquationTest(unittest.TestCase):
         data = {'formula': "H"}
         response = self.the_input.handle_ajax("preview_chemcalc", data)
 
-        self.assertIn('preview', response)
-        self.assertNotEqual(response['preview'], '')
-        self.assertEqual(response['error'], "")
+        assert 'preview' in response
+        assert response['preview'] != ''
+        assert response['error'] == ''
 
     def test_ajax_bad_method(self):
         """
         With a bad dispatch, we shouldn't receive anything
         """
         response = self.the_input.handle_ajax("obviously_not_real", {})
-        self.assertEqual(response, {})
+        assert response == {}
 
     def test_ajax_no_formula(self):
         """
         When we ask for a formula rendering, there should be an error if no formula
         """
         response = self.the_input.handle_ajax("preview_chemcalc", {})
-        self.assertIn('error', response)
-        self.assertEqual(response['error'], "No formula specified.")
+        assert 'error' in response
+        assert response['error'] == 'No formula specified.'
 
     def test_ajax_parse_err(self):
         """
@@ -1220,8 +1221,8 @@ class ChemicalEquationTest(unittest.TestCase):
                 {'formula': 'H2O + invalid chemistry'}
             )
 
-        self.assertIn('error', response)
-        self.assertIn("Couldn't parse formula", response['error'])
+        assert 'error' in response
+        assert "Couldn't parse formula" in response['error']
 
     @patch('capa.inputtypes.log')
     def test_ajax_other_err(self, mock_log):
@@ -1237,8 +1238,8 @@ class ChemicalEquationTest(unittest.TestCase):
         mock_log.warning.assert_called_once_with(
             "Error while previewing chemical formula", exc_info=True
         )
-        self.assertIn('error', response)
-        self.assertEqual(response['error'], "Error while rendering preview")
+        assert 'error' in response
+        assert response['error'] == 'Error while rendering preview'
 
 
 class FormulaEquationTest(unittest.TestCase):
@@ -1277,7 +1278,7 @@ class FormulaEquationTest(unittest.TestCase):
             'response_data': RESPONSE_DATA,
             'describedby_html': DESCRIBEDBY.format(status_id=prob_id)
         }
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_trailing_text_rendering(self):
         """
@@ -1324,7 +1325,7 @@ class FormulaEquationTest(unittest.TestCase):
                 'describedby_html': TRAILING_TEXT_DESCRIBEDBY.format(trailing_text_id=prob_id, status_id=prob_id)
             }
 
-            self.assertEqual(context, expected)
+            assert context == expected
 
     def test_formcalc_ajax_sucess(self):
         """
@@ -1333,17 +1334,17 @@ class FormulaEquationTest(unittest.TestCase):
         data = {'formula': "x^2+1/2", 'request_start': 0}
         response = self.the_input.handle_ajax("preview_formcalc", data)
 
-        self.assertIn('preview', response)
-        self.assertNotEqual(response['preview'], '')
-        self.assertEqual(response['error'], "")
-        self.assertEqual(response['request_start'], data['request_start'])
+        assert 'preview' in response
+        assert response['preview'] != ''
+        assert response['error'] == ''
+        assert response['request_start'] == data['request_start']
 
     def test_ajax_bad_method(self):
         """
         With a bad dispatch, we shouldn't receive anything
         """
         response = self.the_input.handle_ajax("obviously_not_real", {})
-        self.assertEqual(response, {})
+        assert response == {}
 
     def test_ajax_no_formula(self):
         """
@@ -1353,8 +1354,8 @@ class FormulaEquationTest(unittest.TestCase):
             "preview_formcalc",
             {'request_start': 1, }
         )
-        self.assertIn('error', response)
-        self.assertEqual(response['error'], "No formula specified.")
+        assert 'error' in response
+        assert response['error'] == 'No formula specified.'
 
     def test_ajax_parse_err(self):
         """
@@ -1368,8 +1369,8 @@ class FormulaEquationTest(unittest.TestCase):
                 {'formula': 'x^2+1/2', 'request_start': 1, }
             )
 
-        self.assertIn('error', response)
-        self.assertEqual(response['error'], "Sorry, couldn't parse formula")
+        assert 'error' in response
+        assert response['error'] == "Sorry, couldn't parse formula"
 
     @patch('capa.inputtypes.log')
     def test_ajax_other_err(self, mock_log):
@@ -1385,8 +1386,8 @@ class FormulaEquationTest(unittest.TestCase):
         mock_log.warning.assert_called_once_with(
             "Error while previewing formula", exc_info=True
         )
-        self.assertIn('error', response)
-        self.assertEqual(response['error'], "Error while rendering preview")
+        assert 'error' in response
+        assert response['error'] == 'Error while rendering preview'
 
 
 class DragAndDropTest(unittest.TestCase):
@@ -1457,10 +1458,10 @@ class DragAndDropTest(unittest.TestCase):
 
         # as we are dumping 'draggables' dicts while dumping user_input, string
         # comparison will fail, as order of keys is random.
-        self.assertEqual(json.loads(context['drag_and_drop_json']), user_input)
+        assert json.loads(context['drag_and_drop_json']) == user_input
         context.pop('drag_and_drop_json')
         expected.pop('drag_and_drop_json')
-        self.assertEqual(context, expected)
+        assert context == expected
 
 
 class AnnotationInputTest(unittest.TestCase):
@@ -1591,7 +1592,7 @@ class TestChoiceText(unittest.TestCase):
         expected.update(state)
         the_input = lookup_tag(tag)(test_capa_system(), element, state)
         context = the_input._get_render_context()  # pylint: disable=protected-access
-        self.assertEqual(context, expected)
+        assert context == expected
 
     def test_radiotextgroup(self):
         """
@@ -1611,7 +1612,7 @@ class TestChoiceText(unittest.TestCase):
         """
         Test to ensure that an unrecognized inputtype tag causes an error
         """
-        with self.assertRaises(Exception):
+        with pytest.raises(Exception):
             self.check_group('invalid', 'choice', 'checkbox')
 
     def test_invalid_input_tag(self):
@@ -1632,8 +1633,8 @@ class TestStatus(unittest.TestCase):
         Test stringifing Status objects
         """
         statobj = inputtypes.Status('test')
-        self.assertEqual(str(statobj), 'test')
-        self.assertEqual(six.text_type(statobj), u'test')
+        assert str(statobj) == 'test'
+        assert six.text_type(statobj) == u'test'
 
     def test_classes(self):
         """
@@ -1648,7 +1649,7 @@ class TestStatus(unittest.TestCase):
         ]
         for status, classname in css_classes:
             statobj = inputtypes.Status(status)
-            self.assertEqual(statobj.classname, classname)
+            assert statobj.classname == classname
 
     def test_display_names(self):
         """
@@ -1665,7 +1666,7 @@ class TestStatus(unittest.TestCase):
         ]
         for status, display_name in names:
             statobj = inputtypes.Status(status)
-            self.assertEqual(statobj.display_name, display_name)
+            assert statobj.display_name == display_name
 
     def test_translated_names(self):
         """
@@ -1674,10 +1675,10 @@ class TestStatus(unittest.TestCase):
         func = lambda t: t.upper()
         # status is in the mapping
         statobj = inputtypes.Status('queued', func)
-        self.assertEqual(statobj.display_name, u'PROCESSING')
+        assert statobj.display_name == u'PROCESSING'
 
         # status is not in the mapping
         statobj = inputtypes.Status('test', func)
-        self.assertEqual(statobj.display_name, u'test')
-        self.assertEqual(str(statobj), 'test')
-        self.assertEqual(statobj.classname, 'test')
+        assert statobj.display_name == u'test'
+        assert str(statobj) == 'test'
+        assert statobj.classname == 'test'
diff --git a/common/lib/capa/capa/tests/test_responsetypes.py b/common/lib/capa/capa/tests/test_responsetypes.py
index c4bd0cd6dbf02c71aa2a5ecb6ce366536e9f50bc..f86a47cef3b0ec78479abefc267db9c7ab373176 100644
--- a/common/lib/capa/capa/tests/test_responsetypes.py
+++ b/common/lib/capa/capa/tests/test_responsetypes.py
@@ -12,6 +12,7 @@ import unittest
 import zipfile
 from datetime import datetime
 
+import pytest
 import calc
 import mock
 import pyparsing
@@ -66,23 +67,23 @@ class ResponseTest(unittest.TestCase):
         input_dict = {'1_2_1': submission}
         correct_map = problem.grade_answers(input_dict)
         if msg is None:
-            self.assertEqual(correct_map.get_correctness('1_2_1'), expected_correctness)
+            assert correct_map.get_correctness('1_2_1') == expected_correctness
         else:
-            self.assertEqual(correct_map.get_correctness('1_2_1'), expected_correctness, msg)
+            assert correct_map.get_correctness('1_2_1') == expected_correctness, msg
 
     def assert_answer_format(self, problem):
         answers = problem.get_question_answers()
-        self.assertIsNotNone(answers['1_2_1'])
+        assert answers['1_2_1'] is not None
 
     # pylint: disable=missing-function-docstring
     def assert_multiple_grade(self, problem, correct_answers, incorrect_answers):
         for input_str in correct_answers:
             result = problem.grade_answers({'1_2_1': input_str}).get_correctness('1_2_1')
-            self.assertEqual(result, 'correct')
+            assert result == 'correct'
 
         for input_str in incorrect_answers:
             result = problem.grade_answers({'1_2_1': input_str}).get_correctness('1_2_1')
-            self.assertEqual(result, 'incorrect')
+            assert result == 'incorrect'
 
     def assert_multiple_partial(self, problem, correct_answers, incorrect_answers, partial_answers):
         """
@@ -91,15 +92,15 @@ class ResponseTest(unittest.TestCase):
         """
         for input_str in correct_answers:
             result = problem.grade_answers({'1_2_1': input_str}).get_correctness('1_2_1')
-            self.assertEqual(result, 'correct')
+            assert result == 'correct'
 
         for input_str in incorrect_answers:
             result = problem.grade_answers({'1_2_1': input_str}).get_correctness('1_2_1')
-            self.assertEqual(result, 'incorrect')
+            assert result == 'incorrect'
 
         for input_str in partial_answers:
             result = problem.grade_answers({'1_2_1': input_str}).get_correctness('1_2_1')
-            self.assertEqual(result, 'partially-correct')
+            assert result == 'partially-correct'
 
     def _get_random_number_code(self):
         """Returns code to be used to generate a random result."""
@@ -143,13 +144,13 @@ class MultiChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-do
         # Multiple Choice problems only allow one partial credit scheme.
         # Change this test if that changes.
         problem = self.build_problem(choices=[False, True, 'partial'], credit_type='points,points')
-        with self.assertRaises(LoncapaProblemError):
+        with pytest.raises(LoncapaProblemError):
             input_dict = {'1_2_1': 'choice_1'}
             problem.grade_answers(input_dict)
 
         # 'bongo' is not a valid grading scheme.
         problem = self.build_problem(choices=[False, True, 'partial'], credit_type='bongo')
-        with self.assertRaises(LoncapaProblemError):
+        with pytest.raises(LoncapaProblemError):
             input_dict = {'1_2_1': 'choice_1'}
             problem.grade_answers(input_dict)
 
@@ -163,13 +164,13 @@ class MultiChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-do
         # Ensure that we get the expected number of points
         # Using assertAlmostEqual to avoid floating point issues
         correct_map = problem.grade_answers({'1_2_1': 'choice_0'})
-        self.assertAlmostEqual(correct_map.get_npoints('1_2_1'), 1)
+        assert round(correct_map.get_npoints('1_2_1') - 1, 7) >= 0
 
         correct_map = problem.grade_answers({'1_2_1': 'choice_1'})
-        self.assertAlmostEqual(correct_map.get_npoints('1_2_1'), 0.6)
+        assert round(correct_map.get_npoints('1_2_1') - 0.6, 7) >= 0
 
         correct_map = problem.grade_answers({'1_2_1': 'choice_2'})
-        self.assertAlmostEqual(correct_map.get_npoints('1_2_1'), 0)
+        assert round(correct_map.get_npoints('1_2_1') - 0, 7) >= 0
 
     def test_contextualized_choices(self):
         script = textwrap.dedent("""
@@ -350,7 +351,7 @@ class SymbolicResponseTest(ResponseTest):  # pylint: disable=missing-class-docst
 
         # Should not allow multiple inputs, since we specify
         # only one "expect" value
-        with self.assertRaises(Exception):
+        with pytest.raises(Exception):
             self.build_problem(math_display=True, expect="2*x+3*y", num_inputs=3)
 
     def _assert_symbolic_grade(
@@ -375,9 +376,7 @@ class SymbolicResponseTest(ResponseTest):  # pylint: disable=missing-class-docst
 
             correct_map = problem.grade_answers(input_dict)
 
-            self.assertEqual(
-                correct_map.get_correctness('1_2_1'), expected_correctness
-            )
+            assert correct_map.get_correctness('1_2_1') == expected_correctness
 
 
 class OptionResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
@@ -423,8 +422,8 @@ class OptionResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
 
         input_dict = {'1_2_1': '1000'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
-        self.assertEqual(correct_map.get_property('1_2_1', 'answervariable'), '$a')
+        assert correct_map.get_correctness('1_2_1') == 'correct'
+        assert correct_map.get_property('1_2_1', 'answervariable') == '$a'
 
 
 class FormulaResponseTest(ResponseTest):
@@ -480,14 +479,12 @@ class FormulaResponseTest(ResponseTest):
         # Expect to receive a hint  if we add an extra y
         input_dict = {'1_2_1': "x + 2*y + y"}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'),
-                         'Check the coefficient of y')
+        assert correct_map.get_hint('1_2_1') == 'Check the coefficient of y'
 
         # Expect to receive a hint if we leave out x
         input_dict = {'1_2_1': "2*y"}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'),
-                         'Try including the variable x')
+        assert correct_map.get_hint('1_2_1') == 'Try including the variable x'
 
     def test_script(self):
         """
@@ -574,8 +571,8 @@ class FormulaResponseTest(ResponseTest):
             tolerance="1%",
             answer="x"
         )
-        self.assertTrue(list(problem.responders.values())[0].validate_answer('14*x'))
-        self.assertFalse(list(problem.responders.values())[0].validate_answer('3*y+2*x'))
+        assert list(problem.responders.values())[0].validate_answer('14*x')
+        assert not list(problem.responders.values())[0].validate_answer('3*y+2*x')
 
 
 class StringResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
@@ -799,10 +796,10 @@ class StringResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
 
     def test_exception(self):
         problem = self.build_problem(answer="a2", case_sensitive=False, regexp=True, additional_answers=['?\\d?'])
-        with self.assertRaises(Exception) as cm:
+        with pytest.raises(Exception) as cm:
             self.assert_grade(problem, "a3", "correct")
         exception_message = text_type(cm.exception)
-        self.assertIn("nothing to repeat", exception_message)
+        assert 'nothing to repeat' in exception_message
 
     def test_hints(self):
 
@@ -818,24 +815,22 @@ class StringResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         # We should get a hint for Wisconsin
         input_dict = {'1_2_1': 'Wisconsin'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'),
-                         "The state capital of Wisconsin is Madison")
+        assert correct_map.get_hint('1_2_1') == 'The state capital of Wisconsin is Madison'
 
         # We should get a hint for Minnesota
         input_dict = {'1_2_1': 'Minnesota'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'),
-                         "The state capital of Minnesota is St. Paul")
+        assert correct_map.get_hint('1_2_1') == 'The state capital of Minnesota is St. Paul'
 
         # We should NOT get a hint for Michigan (the correct answer)
         input_dict = {'1_2_1': 'Michigan'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "")
+        assert correct_map.get_hint('1_2_1') == ''
 
         # We should NOT get a hint for any other string
         input_dict = {'1_2_1': 'California'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "")
+        assert correct_map.get_hint('1_2_1') == ''
 
     def test_hints_regexp_and_answer_regexp(self):
         different_student_answers = [
@@ -867,38 +862,36 @@ class StringResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         # We should get a hint for Wisconsin
         input_dict = {'1_2_1': 'Wisconsin'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'),
-                         "The state capital of Wisconsin is Madison")
+        assert correct_map.get_hint('1_2_1') == 'The state capital of Wisconsin is Madison'
 
         # We should get a hint for Minnesota
         input_dict = {'1_2_1': 'Minnesota'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'),
-                         "The state capital of Minnesota is St. Paul")
+        assert correct_map.get_hint('1_2_1') == 'The state capital of Minnesota is St. Paul'
 
         # We should NOT get a hint for Michigan (the correct answer)
         input_dict = {'1_2_1': 'Michigan'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "")
+        assert correct_map.get_hint('1_2_1') == ''
 
         # We should NOT get a hint for any other string
         input_dict = {'1_2_1': 'California'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "")
+        assert correct_map.get_hint('1_2_1') == ''
 
         # We should get the same hint for each answer
         for answer in different_student_answers:
             input_dict = {'1_2_1': answer}
             correct_map = problem.grade_answers(input_dict)
-            self.assertEqual(correct_map.get_hint('1_2_1'), "First letter of correct answer is M.")
+            assert correct_map.get_hint('1_2_1') == 'First letter of correct answer is M.'
 
         input_dict = {'1_2_1': '59'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "Should not end with 9.")
+        assert correct_map.get_hint('1_2_1') == 'Should not end with 9.'
 
         input_dict = {'1_2_1': '57'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "")
+        assert correct_map.get_hint('1_2_1') == ''
 
     def test_computed_hints(self):
         problem = self.build_problem(
@@ -914,7 +907,7 @@ class StringResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
 
         input_dict = {'1_2_1': 'Hello'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_hint('1_2_1'), "Hello??")
+        assert correct_map.get_hint('1_2_1') == 'Hello??'
 
     def test_hint_function_randomization(self):
         # The hint function should get the seed from the problem.
@@ -930,7 +923,7 @@ class StringResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         )
         correct_map = problem.grade_answers({'1_2_1': '2'})
         hint = correct_map.get_hint('1_2_1')
-        self.assertEqual(hint, self._get_random_number_result(problem.seed))
+        assert hint == self._get_random_number_result(problem.seed)
 
     def test_empty_answer_graded_as_incorrect(self):
         """
@@ -971,7 +964,7 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
             cmap.update(CorrectMap(answer_id=answer_id, queuestate=None))
         self.problem.correct_map.update(cmap)
 
-        self.assertEqual(self.problem.is_queued(), False)
+        assert self.problem.is_queued() is False
 
         # Now we queue the LCP
         cmap = CorrectMap()
@@ -980,7 +973,7 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
             cmap.update(CorrectMap(answer_id=answer_ids[i], queuestate=queuestate))
         self.problem.correct_map.update(cmap)
 
-        self.assertEqual(self.problem.is_queued(), True)
+        assert self.problem.is_queued() is True
 
     def test_update_score(self):
         '''
@@ -1009,10 +1002,12 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
             self.problem.correct_map.update(old_cmap)  # Deep copy
 
             self.problem.update_score(xserver_msgs[correctness], queuekey=0)
-            self.assertEqual(self.problem.correct_map.get_dict(), old_cmap.get_dict())  # Deep comparison
+            assert self.problem.correct_map.get_dict() == old_cmap.get_dict()
+            # Deep comparison
 
             for answer_id in answer_ids:
-                self.assertTrue(self.problem.correct_map.is_queued(answer_id))  # Should be still queued, since message undelivered  # lint-amnesty, pylint: disable=line-too-long
+                assert self.problem.correct_map.is_queued(answer_id)
+                # Should be still queued, since message undelivered  # lint-amnesty, pylint: disable=line-too-long
 
         # Correct queuekey, state should be updated
         for correctness in ['correct', 'incorrect']:
@@ -1026,13 +1021,15 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
                 new_cmap.set(answer_id=answer_id, npoints=npoints, correctness=correctness, msg=grader_msg, queuestate=None)  # lint-amnesty, pylint: disable=line-too-long
 
                 self.problem.update_score(xserver_msgs[correctness], queuekey=1000 + i)
-                self.assertEqual(self.problem.correct_map.get_dict(), new_cmap.get_dict())
+                assert self.problem.correct_map.get_dict() == new_cmap.get_dict()
 
                 for j, test_id in enumerate(answer_ids):
                     if j == i:
-                        self.assertFalse(self.problem.correct_map.is_queued(test_id))  # Should be dequeued, message delivered  # lint-amnesty, pylint: disable=line-too-long
+                        assert not self.problem.correct_map.is_queued(test_id)
+                        # Should be dequeued, message delivered  # lint-amnesty, pylint: disable=line-too-long
                     else:
-                        self.assertTrue(self.problem.correct_map.is_queued(test_id))  # Should be queued, message undelivered  # lint-amnesty, pylint: disable=line-too-long
+                        assert self.problem.correct_map.is_queued(test_id)
+                        # Should be queued, message undelivered  # lint-amnesty, pylint: disable=line-too-long
 
     def test_recentmost_queuetime(self):
         '''
@@ -1046,7 +1043,7 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
             cmap.update(CorrectMap(answer_id=answer_id, queuestate=None))
         self.problem.correct_map.update(cmap)
 
-        self.assertEqual(self.problem.get_recentmost_queuetime(), None)
+        assert self.problem.get_recentmost_queuetime() is None
 
         # CodeResponse requires internal CorrectMap state. Build it now in the queued state
         cmap = CorrectMap()
@@ -1062,7 +1059,7 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
             datetime.strftime(latest_timestamp, dateformat), dateformat
         ).replace(tzinfo=UTC)
 
-        self.assertEqual(self.problem.get_recentmost_queuetime(), latest_timestamp)
+        assert self.problem.get_recentmost_queuetime() == latest_timestamp
 
     def test_convert_files_to_filenames(self):
         '''
@@ -1074,9 +1071,9 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
                                  '1_3_1': ['answer1', 'answer2', 'answer3'],
                                  '1_4_1': [fp, fp]}
             answers_converted = convert_files_to_filenames(answers_with_file)
-            self.assertEqual(answers_converted['1_2_1'], 'String-based answer')
-            self.assertEqual(answers_converted['1_3_1'], ['answer1', 'answer2', 'answer3'])
-            self.assertEqual(answers_converted['1_4_1'], [fp.name, fp.name])
+            assert answers_converted['1_2_1'] == 'String-based answer'
+            assert answers_converted['1_3_1'] == ['answer1', 'answer2', 'answer3']
+            assert answers_converted['1_4_1'] == [fp.name, fp.name]
 
     def test_parse_score_msg_of_responder(self):
         """
@@ -1116,7 +1113,7 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
                 self.problem.correct_map = CorrectMap()
                 self.problem.correct_map.update(old_cmap)
                 output = self.problem.update_score(xserver_msgs['correct'], queuekey=1000 + i)
-                self.assertEqual(output[answer_id]['msg'], grader_msg)
+                assert output[answer_id]['msg'] == grader_msg
 
         for grader_msg in invalid_grader_msgs:
             correct_score_msg = json.dumps({'correct': True, 'score': 1, 'msg': grader_msg})
@@ -1128,7 +1125,7 @@ class CodeResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
                 self.problem.correct_map.update(old_cmap)
 
                 output = self.problem.update_score(xserver_msgs['correct'], queuekey=1000 + i)
-                self.assertEqual(output[answer_id]['msg'], u'Invalid grader reply. Please contact the course staff.')
+                assert output[answer_id]['msg'] == u'Invalid grader reply. Please contact the course staff.'
 
 
 class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
@@ -1169,7 +1166,7 @@ class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
             choices=[False, False, True, True],
             credit_type='edc,halves,bongo'
         )
-        with self.assertRaises(LoncapaProblemError):
+        with pytest.raises(LoncapaProblemError):
             input_dict = {'1_2_1': 'choice_1'}
             problem.grade_answers(input_dict)
 
@@ -1179,7 +1176,7 @@ class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
             choices=[False, False, True, True],
             credit_type='bongo'
         )
-        with self.assertRaises(LoncapaProblemError):
+        with pytest.raises(LoncapaProblemError):
             input_dict = {'1_2_1': 'choice_1'}
             problem.grade_answers(input_dict)
 
@@ -1245,7 +1242,7 @@ class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         )
 
         correct_map = problem.grade_answers({'1_2_1': 'choice_2'})
-        self.assertAlmostEqual(correct_map.get_npoints('1_2_1'), 0.75)
+        assert round(correct_map.get_npoints('1_2_1') - 0.75, 7) >= 0
 
         # Second: Halves grading style
         problem = self.build_problem(
@@ -1255,7 +1252,7 @@ class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         )
 
         correct_map = problem.grade_answers({'1_2_1': 'choice_2'})
-        self.assertAlmostEqual(correct_map.get_npoints('1_2_1'), 0.5)
+        assert round(correct_map.get_npoints('1_2_1') - 0.5, 7) >= 0
 
         # Third: Halves grading style with more options
         problem = self.build_problem(
@@ -1265,7 +1262,7 @@ class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         )
 
         correct_map = problem.grade_answers({'1_2_1': 'choice_2,choice4'})
-        self.assertAlmostEqual(correct_map.get_npoints('1_2_1'), 0.25)
+        assert round(correct_map.get_npoints('1_2_1') - 0.25, 7) >= 0
 
     def test_grade_with_no_checkbox_selected(self):
         """
@@ -1276,7 +1273,7 @@ class ChoiceResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         )
 
         correct_map = problem.grade_answers({})
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'incorrect')
+        assert correct_map.get_correctness('1_2_1') == 'incorrect'
 
     def test_contextualized_choices(self):
         script = textwrap.dedent("""
@@ -1337,14 +1334,14 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
 
         # Assert primary answer is graded correctly.
         correct_map = problem.grade_answers({'1_2_1': primary_answer})
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
-        self.assertIn(primary_correcthint, correct_map.get_msg('1_2_1'))
+        assert correct_map.get_correctness('1_2_1') == 'correct'
+        assert primary_correcthint in correct_map.get_msg('1_2_1')
 
         # Assert additional answers are graded correct
         for answer, correcthint in additional_answers.items():
             correct_map = problem.grade_answers({'1_2_1': answer})
-            self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
-            self.assertIn(correcthint, correct_map.get_msg('1_2_1'))
+            assert correct_map.get_correctness('1_2_1') == 'correct'
+            assert correcthint in correct_map.get_msg('1_2_1')
 
     def test_additional_answer_get_score(self):
         """
@@ -1355,15 +1352,15 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
 
         # Check primary answer.
         new_cmap = responder.get_score({'1_2_1': '100'})
-        self.assertEqual(new_cmap.get_correctness('1_2_1'), 'correct')
+        assert new_cmap.get_correctness('1_2_1') == 'correct'
 
         # Check additional answer.
         new_cmap = responder.get_score({'1_2_1': '1'})
-        self.assertEqual(new_cmap.get_correctness('1_2_1'), 'correct')
+        assert new_cmap.get_correctness('1_2_1') == 'correct'
 
         # Check any wrong answer.
         new_cmap = responder.get_score({'1_2_1': '2'})
-        self.assertEqual(new_cmap.get_correctness('1_2_1'), 'incorrect')
+        assert new_cmap.get_correctness('1_2_1') == 'incorrect'
 
     def test_grade_range_tolerance_partial_credit(self):
         problem_setup = [
@@ -1404,13 +1401,13 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
         # no complex number in range tolerance staff answer
         problem = self.build_problem(answer='[1j, 5]')
         input_dict = {'1_2_1': '3'}
-        with self.assertRaises(StudentInputError):
+        with pytest.raises(StudentInputError):
             problem.grade_answers(input_dict)
 
         # no complex numbers in student ansers to range tolerance problems
         problem = self.build_problem(answer='(1, 5)')
         input_dict = {'1_2_1': '1*J'}
-        with self.assertRaises(StudentInputError):
+        with pytest.raises(StudentInputError):
             problem.grade_answers(input_dict)
 
         # test isnan student input: no exception,
@@ -1419,16 +1416,16 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
         input_dict = {'1_2_1': ''}
         correct_map = problem.grade_answers(input_dict)
         correctness = correct_map.get_correctness('1_2_1')
-        self.assertEqual(correctness, 'incorrect')
+        assert correctness == 'incorrect'
 
         # test invalid range tolerance answer
-        with self.assertRaises(StudentInputError):
+        with pytest.raises(StudentInputError):
             problem = self.build_problem(answer='(1 5)')
 
         # test empty boundaries
         problem = self.build_problem(answer='(1, ]')
         input_dict = {'1_2_1': '3'}
-        with self.assertRaises(StudentInputError):
+        with pytest.raises(StudentInputError):
             problem.grade_answers(input_dict)
 
     def test_grade_exact(self):
@@ -1489,7 +1486,7 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
         # 'bongo' is not a valid grading scheme.
         problem = self.build_problem(answer=4, tolerance=0.1, credit_type='bongo')
         input_dict = {'1_2_1': '4'}
-        with self.assertRaises(LoncapaProblemError):
+        with pytest.raises(LoncapaProblemError):
             problem.grade_answers(input_dict)
 
     def test_grade_decimal_tolerance(self):
@@ -1556,7 +1553,7 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
         """See if division by zero is handled correctly."""
         problem = self.build_problem(answer="1")  # Answer doesn't matter
         input_dict = {'1_2_1': '1/0'}
-        with self.assertRaises(StudentInputError):
+        with pytest.raises(StudentInputError):
             problem.grade_answers(input_dict)
 
     def test_staff_inputs_expressions(self):
@@ -1662,15 +1659,15 @@ class NumericalResponseTest(ResponseTest):  # pylint: disable=missing-class-docs
         """Tests the answer compare function."""
         problem = self.build_problem(answer="42")
         responder = list(problem.responders.values())[0]
-        self.assertTrue(responder.compare_answer('48', '8*6'))
-        self.assertFalse(responder.compare_answer('48', '9*5'))
+        assert responder.compare_answer('48', '8*6')
+        assert not responder.compare_answer('48', '9*5')
 
     def test_validate_answer(self):
         """Tests the answer validation function."""
         problem = self.build_problem(answer="42")
         responder = list(problem.responders.values())[0]
-        self.assertTrue(responder.validate_answer('23.5'))
-        self.assertFalse(responder.validate_answer('fish'))
+        assert responder.validate_answer('23.5')
+        assert not responder.validate_answer('fish')
 
 
 class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstring
@@ -1704,11 +1701,11 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
 
         # Check that the message for the particular input was received
         input_msg = correctmap.get_msg('1_2_1')
-        self.assertEqual(input_msg, "Test Message")
+        assert input_msg == 'Test Message'
 
         # Check that the overall message (for the whole response) was received
         overall_msg = correctmap.get_overall_message()
-        self.assertEqual(overall_msg, "Overall message")
+        assert overall_msg == 'Overall message'
 
     def test_inline_randomization(self):
         # Make sure the seed from the problem gets fed into the script execution.
@@ -1719,7 +1716,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correctmap = problem.grade_answers(input_dict)
 
         input_msg = correctmap.get_msg('1_2_1')
-        self.assertEqual(input_msg, self._get_random_number_result(problem.seed))
+        assert input_msg == self._get_random_number_result(problem.seed)
 
     def test_function_code_single_input(self):
         # For function code, we pass in these arguments:
@@ -1754,9 +1751,9 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         msg = correct_map.get_msg('1_2_1')
         npoints = correct_map.get_npoints('1_2_1')
 
-        self.assertEqual(correctness, 'correct')
-        self.assertEqual(msg, "Message text")
-        self.assertEqual(npoints, 1)
+        assert correctness == 'correct'
+        assert msg == 'Message text'
+        assert npoints == 1
 
         # Partially Credit answer
         input_dict = {'1_2_1': '21'}
@@ -1766,9 +1763,9 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         msg = correct_map.get_msg('1_2_1')
         npoints = correct_map.get_npoints('1_2_1')
 
-        self.assertEqual(correctness, 'partially-correct')
-        self.assertEqual(msg, "Message text")
-        self.assertTrue(0 <= npoints <= 1)
+        assert correctness == 'partially-correct'
+        assert msg == 'Message text'
+        assert 0 <= npoints <= 1
 
         # Incorrect answer
         input_dict = {'1_2_1': '0'}
@@ -1778,9 +1775,9 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         msg = correct_map.get_msg('1_2_1')
         npoints = correct_map.get_npoints('1_2_1')
 
-        self.assertEqual(correctness, 'incorrect')
-        self.assertEqual(msg, "Message text")
-        self.assertEqual(npoints, 0)
+        assert correctness == 'incorrect'
+        assert msg == 'Message text'
+        assert npoints == 0
 
     def test_function_code_single_input_decimal_score(self):
         # For function code, we pass in these arguments:
@@ -1817,20 +1814,20 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         # Correct answer
         input_dict = {'1_2_1': '42'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_npoints('1_2_1'), 0.9)
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
+        assert correct_map.get_npoints('1_2_1') == 0.9
+        assert correct_map.get_correctness('1_2_1') == 'correct'
 
         # Incorrect answer
         input_dict = {'1_2_1': '43'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_npoints('1_2_1'), 0.1)
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'incorrect')
+        assert correct_map.get_npoints('1_2_1') == 0.1
+        assert correct_map.get_correctness('1_2_1') == 'incorrect'
 
         # Partially Correct answer
         input_dict = {'1_2_1': '21'}
         correct_map = problem.grade_answers(input_dict)
-        self.assertEqual(correct_map.get_npoints('1_2_1'), 0.5)
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'partially-correct')
+        assert correct_map.get_npoints('1_2_1') == 0.5
+        assert correct_map.get_correctness('1_2_1') == 'partially-correct'
 
     def test_script_context(self):
         # Ensure that python script variables can be used in the "expect" and "answer" fields,
@@ -1853,11 +1850,11 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
             correctmap = problem.grade_answers(input_dict)
 
             # CustomResponse also adds 'expect' to the problem context; check that directly first:
-            self.assertEqual(problem.context['expect'], '42')
+            assert problem.context['expect'] == '42'
 
             # Also make sure the problem was graded correctly:
             correctness = correctmap.get_correctness('1_2_1')
-            self.assertEqual(correctness, 'correct')
+            assert correctness == 'correct'
 
     def test_function_code_multiple_input_no_msg(self):
 
@@ -1885,32 +1882,32 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correct_map = problem.grade_answers(input_dict)
 
         correctness = correct_map.get_correctness('1_2_1')
-        self.assertEqual(correctness, 'correct')
+        assert correctness == 'correct'
 
         correctness = correct_map.get_correctness('1_2_2')
-        self.assertEqual(correctness, 'correct')
+        assert correctness == 'correct'
 
         # One answer incorrect -- expect both inputs marked partially correct
         input_dict = {'1_2_1': '0', '1_2_2': '42'}
         correct_map = problem.grade_answers(input_dict)
 
         correctness = correct_map.get_correctness('1_2_1')
-        self.assertEqual(correctness, 'partially-correct')
-        self.assertTrue(0 <= correct_map.get_npoints('1_2_1') <= 1)
+        assert correctness == 'partially-correct'
+        assert 0 <= correct_map.get_npoints('1_2_1') <= 1
 
         correctness = correct_map.get_correctness('1_2_2')
-        self.assertEqual(correctness, 'partially-correct')
-        self.assertTrue(0 <= correct_map.get_npoints('1_2_2') <= 1)
+        assert correctness == 'partially-correct'
+        assert 0 <= correct_map.get_npoints('1_2_2') <= 1
 
         # Both answers incorrect -- expect both inputs marked incorrect
         input_dict = {'1_2_1': '0', '1_2_2': '0'}
         correct_map = problem.grade_answers(input_dict)
 
         correctness = correct_map.get_correctness('1_2_1')
-        self.assertEqual(correctness, 'incorrect')
+        assert correctness == 'incorrect'
 
         correctness = correct_map.get_correctness('1_2_2')
-        self.assertEqual(correctness, 'incorrect')
+        assert correctness == 'incorrect'
 
     def test_function_code_multiple_inputs(self):
 
@@ -1950,25 +1947,25 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correct_map = problem.grade_answers(input_dict)
 
         # Expect that we receive the overall message (for the whole response)
-        self.assertEqual(correct_map.get_overall_message(), "Overall message")
+        assert correct_map.get_overall_message() == 'Overall message'
 
         # Expect that the inputs were graded individually
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'incorrect')
-        self.assertEqual(correct_map.get_correctness('1_2_2'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_3'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_4'), 'partially-correct')
+        assert correct_map.get_correctness('1_2_1') == 'incorrect'
+        assert correct_map.get_correctness('1_2_2') == 'correct'
+        assert correct_map.get_correctness('1_2_3') == 'correct'
+        assert correct_map.get_correctness('1_2_4') == 'partially-correct'
 
         # Expect that the inputs were given correct npoints
-        self.assertEqual(correct_map.get_npoints('1_2_1'), 0)
-        self.assertEqual(correct_map.get_npoints('1_2_2'), 1)
-        self.assertEqual(correct_map.get_npoints('1_2_3'), 1)
-        self.assertTrue(0 <= correct_map.get_npoints('1_2_4') <= 1)
+        assert correct_map.get_npoints('1_2_1') == 0
+        assert correct_map.get_npoints('1_2_2') == 1
+        assert correct_map.get_npoints('1_2_3') == 1
+        assert 0 <= correct_map.get_npoints('1_2_4') <= 1
 
         # Expect that we received messages for each individual input
-        self.assertEqual(correct_map.get_msg('1_2_1'), 'Feedback 1')
-        self.assertEqual(correct_map.get_msg('1_2_2'), 'Feedback 2')
-        self.assertEqual(correct_map.get_msg('1_2_3'), 'Feedback 3')
-        self.assertEqual(correct_map.get_msg('1_2_4'), 'Feedback 4')
+        assert correct_map.get_msg('1_2_1') == 'Feedback 1'
+        assert correct_map.get_msg('1_2_2') == 'Feedback 2'
+        assert correct_map.get_msg('1_2_3') == 'Feedback 3'
+        assert correct_map.get_msg('1_2_4') == 'Feedback 4'
 
     def test_function_code_multiple_inputs_decimal_score(self):
 
@@ -2008,16 +2005,16 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correct_map = problem.grade_answers(input_dict)
 
         # Expect that the inputs were graded individually
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'incorrect')
-        self.assertEqual(correct_map.get_correctness('1_2_2'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_3'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_4'), 'partially-correct')
+        assert correct_map.get_correctness('1_2_1') == 'incorrect'
+        assert correct_map.get_correctness('1_2_2') == 'correct'
+        assert correct_map.get_correctness('1_2_3') == 'correct'
+        assert correct_map.get_correctness('1_2_4') == 'partially-correct'
 
         # Expect that the inputs were given correct npoints
-        self.assertEqual(correct_map.get_npoints('1_2_1'), 0.1)
-        self.assertEqual(correct_map.get_npoints('1_2_2'), 0.9)
-        self.assertEqual(correct_map.get_npoints('1_2_3'), 0.9)
-        self.assertEqual(correct_map.get_npoints('1_2_4'), 0.7)
+        assert correct_map.get_npoints('1_2_1') == 0.1
+        assert correct_map.get_npoints('1_2_2') == 0.9
+        assert correct_map.get_npoints('1_2_3') == 0.9
+        assert correct_map.get_npoints('1_2_4') == 0.7
 
     def test_function_code_with_extra_args(self):
         script = textwrap.dedent("""\
@@ -2048,8 +2045,8 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correctness = correct_map.get_correctness('1_2_1')
         msg = correct_map.get_msg('1_2_1')
 
-        self.assertEqual(correctness, 'correct')
-        self.assertEqual(msg, "Message text")
+        assert correctness == 'correct'
+        assert msg == 'Message text'
 
         # Partially Correct answer
         input_dict = {'1_2_1': '21'}
@@ -2058,8 +2055,8 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correctness = correct_map.get_correctness('1_2_1')
         msg = correct_map.get_msg('1_2_1')
 
-        self.assertEqual(correctness, 'partially-correct')
-        self.assertEqual(msg, "Message text")
+        assert correctness == 'partially-correct'
+        assert msg == 'Message text'
 
         # Incorrect answer
         input_dict = {'1_2_1': '0'}
@@ -2068,8 +2065,8 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correctness = correct_map.get_correctness('1_2_1')
         msg = correct_map.get_msg('1_2_1')
 
-        self.assertEqual(correctness, 'incorrect')
-        self.assertEqual(msg, "Message text")
+        assert correctness == 'incorrect'
+        assert msg == 'Message text'
 
     def test_function_code_with_attempt_number(self):
         script = textwrap.dedent("""\
@@ -2098,8 +2095,8 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correctness = correct_map.get_correctness('1_2_1')
         msg = correct_map.get_msg('1_2_1')
 
-        self.assertEqual(correctness, 'correct')
-        self.assertEqual(msg, "This is attempt number 1")
+        assert correctness == 'correct'
+        assert msg == 'This is attempt number 1'
 
         # second attempt
         problem.context['attempt'] = 2
@@ -2108,8 +2105,8 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correctness = correct_map.get_correctness('1_2_1')
         msg = correct_map.get_msg('1_2_1')
 
-        self.assertEqual(correctness, 'correct')
-        self.assertEqual(msg, "This is attempt number 2")
+        assert correctness == 'correct'
+        assert msg == 'This is attempt number 2'
 
     def test_multiple_inputs_return_one_status(self):
         # When given multiple inputs, the 'answer_given' argument
@@ -2143,30 +2140,30 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         correct_map = problem.grade_answers(input_dict)
 
         # Everything marked incorrect
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'incorrect')
-        self.assertEqual(correct_map.get_correctness('1_2_2'), 'incorrect')
-        self.assertEqual(correct_map.get_correctness('1_2_3'), 'incorrect')
+        assert correct_map.get_correctness('1_2_1') == 'incorrect'
+        assert correct_map.get_correctness('1_2_2') == 'incorrect'
+        assert correct_map.get_correctness('1_2_3') == 'incorrect'
 
         # Grade the inputs (one input partially correct)
         input_dict = {'1_2_1': '-1', '1_2_2': '2', '1_2_3': '3'}
         correct_map = problem.grade_answers(input_dict)
 
         # Everything marked partially correct
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'partially-correct')
-        self.assertEqual(correct_map.get_correctness('1_2_2'), 'partially-correct')
-        self.assertEqual(correct_map.get_correctness('1_2_3'), 'partially-correct')
+        assert correct_map.get_correctness('1_2_1') == 'partially-correct'
+        assert correct_map.get_correctness('1_2_2') == 'partially-correct'
+        assert correct_map.get_correctness('1_2_3') == 'partially-correct'
 
         # Grade the inputs (everything correct)
         input_dict = {'1_2_1': '1', '1_2_2': '2', '1_2_3': '3'}
         correct_map = problem.grade_answers(input_dict)
 
         # Everything marked incorrect
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_2'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_3'), 'correct')
+        assert correct_map.get_correctness('1_2_1') == 'correct'
+        assert correct_map.get_correctness('1_2_2') == 'correct'
+        assert correct_map.get_correctness('1_2_3') == 'correct'
 
         # Message is interpreted as an "overall message"
-        self.assertEqual(correct_map.get_overall_message(), 'Message text')
+        assert correct_map.get_overall_message() == 'Message text'
 
     def test_script_exception_function(self):
 
@@ -2179,7 +2176,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         problem = self.build_problem(script=script, cfn="check_func")
 
         # Expect that an exception gets raised when we check the answer
-        with self.assertRaises(ResponseError):
+        with pytest.raises(ResponseError):
             problem.grade_answers({'1_2_1': '42'})
 
     def test_script_exception_inline(self):
@@ -2189,7 +2186,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         problem = self.build_problem(answer=script)
 
         # Expect that an exception gets raised when we check the answer
-        with self.assertRaises(ResponseError):
+        with pytest.raises(ResponseError):
             problem.grade_answers({'1_2_1': '42'})
 
     def test_invalid_dict_exception(self):
@@ -2203,7 +2200,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         problem = self.build_problem(script=script, cfn="check_func")
 
         # Expect that an exception gets raised when we check the answer
-        with self.assertRaises(ResponseError):
+        with pytest.raises(ResponseError):
             problem.grade_answers({'1_2_1': '42'})
 
     def test_setup_randomization(self):
@@ -2212,7 +2209,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
             num = {code}
             """.format(code=self._get_random_number_code()))
         problem = self.build_problem(script=script)
-        self.assertEqual(problem.context['num'], self._get_random_number_result(problem.seed))
+        assert problem.context['num'] == self._get_random_number_result(problem.seed)
 
     def test_check_function_randomization(self):
         # The check function should get random-seeded from the problem.
@@ -2225,7 +2222,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         input_dict = {'1_2_1': '42'}
         correct_map = problem.grade_answers(input_dict)
         msg = correct_map.get_msg('1_2_1')
-        self.assertEqual(msg, self._get_random_number_result(problem.seed))
+        assert msg == self._get_random_number_result(problem.seed)
 
     def test_random_isnt_none(self):
         # Bug LMS-500 says random.seed(10) fails with:
@@ -2243,7 +2240,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
             num = random.randint(0, 1e9)
             """)
         problem = self.build_problem(script=script)
-        self.assertEqual(problem.context['num'], num)
+        assert problem.context['num'] == num
 
     def test_module_imports_inline(self):
         '''
@@ -2322,7 +2319,7 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
         capa_system = test_capa_system()
         capa_system.get_python_lib_zip = lambda: zipstring.getvalue()  # lint-amnesty, pylint: disable=unnecessary-lambda
         problem = self.build_problem(script=script, capa_system=capa_system)
-        self.assertEqual(problem.context['num'], 17)
+        assert problem.context['num'] == 17
 
     def test_function_code_multiple_inputs_order(self):
         # Ensure that order must be correct according to sub-problem position
@@ -2378,18 +2375,18 @@ class CustomResponseTest(ResponseTest):  # pylint: disable=missing-class-docstri
 
         correct_map = problem.grade_answers(input_dict)
 
-        self.assertNotEqual(list(problem.student_answers.keys()), correct_order)
+        assert list(problem.student_answers.keys()) != correct_order
 
         # euqal to correct order after sorting at get_score
         self.assertListEqual(list(problem.responders.values())[0].context['idset'], correct_order)
 
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_9'), 'correct')
-        self.assertEqual(correct_map.get_correctness('1_2_11'), 'incorrect')
+        assert correct_map.get_correctness('1_2_1') == 'correct'
+        assert correct_map.get_correctness('1_2_9') == 'correct'
+        assert correct_map.get_correctness('1_2_11') == 'incorrect'
 
-        self.assertEqual(correct_map.get_msg('1_2_1'), '1')
-        self.assertEqual(correct_map.get_msg('1_2_9'), '9')
-        self.assertEqual(correct_map.get_msg('1_2_11'), '11')
+        assert correct_map.get_msg('1_2_1') == '1'
+        assert correct_map.get_msg('1_2_9') == '9'
+        assert correct_map.get_msg('1_2_11') == '11'
 
 
 class SchematicResponseTest(ResponseTest):
@@ -2420,7 +2417,7 @@ class SchematicResponseTest(ResponseTest):
         # Expect that the problem is graded as true
         # (That is, our script verifies that the context
         # is what we expect)
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
+        assert correct_map.get_correctness('1_2_1') == 'correct'
 
     def test_check_function_randomization(self):
         # The check function should get a random seed from the problem.
@@ -2431,7 +2428,7 @@ class SchematicResponseTest(ResponseTest):
         input_dict = {'1_2_1': json.dumps(submission_dict)}
         correct_map = problem.grade_answers(input_dict)
 
-        self.assertEqual(correct_map.get_correctness('1_2_1'), 'correct')
+        assert correct_map.get_correctness('1_2_1') == 'correct'
 
     def test_script_exception(self):
         # Construct a script that will raise an exception
@@ -2439,7 +2436,7 @@ class SchematicResponseTest(ResponseTest):
         problem = self.build_problem(answer=script)
 
         # Expect that an exception gets raised when we check the answer
-        with self.assertRaises(ResponseError):
+        with pytest.raises(ResponseError):
             submission_dict = {'test': 'test'}
             input_dict = {'1_2_1': json.dumps(submission_dict)}
             problem.grade_answers(input_dict)
@@ -2476,10 +2473,9 @@ class AnnotationResponseTest(ResponseTest):  # lint-amnesty, pylint: disable=mis
             actual_correctness = correct_map.get_correctness(answer_id)
             actual_points = correct_map.get_npoints(answer_id)
 
-            self.assertEqual(expected_correctness, actual_correctness,
-                             msg="%s should be marked %s" % (answer_id, expected_correctness))
-            self.assertEqual(expected_points, actual_points,
-                             msg="%s should have %d points" % (answer_id, expected_points))
+            assert expected_correctness == actual_correctness,\
+                ('%s should be marked %s' % (answer_id, expected_correctness))
+            assert expected_points == actual_points, ('%s should have %d points' % (answer_id, expected_points))
 
 
 class ChoiceTextResponseTest(ResponseTest):
@@ -2654,7 +2650,7 @@ class ChoiceTextResponseTest(ResponseTest):
         """
         Test that build problem raises errors for invalid options
         """
-        with self.assertRaises(Exception):
+        with pytest.raises(Exception):
             self.build_problem(type="invalidtextgroup")
 
     def test_unchecked_input_not_validated(self):
diff --git a/common/lib/capa/capa/tests/test_shuffle.py b/common/lib/capa/capa/tests/test_shuffle.py
index 0a87c2edf208f415b4b70603709c04aa41b12af8..38b22173f4d194e229dd0e675571fff56025d2ce 100644
--- a/common/lib/capa/capa/tests/test_shuffle.py
+++ b/common/lib/capa/capa/tests/test_shuffle.py
@@ -35,9 +35,9 @@ class CapaShuffleTest(unittest.TestCase):
         self.assertRegex(the_html, r"<div>.*\[.*'Banana'.*'Apple'.*'Chocolate'.*'Donut'.*\].*</div>")
         # Check that choice name masking is enabled and that unmasking works
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertEqual(response.unmask_order(), ['choice_1', 'choice_0', 'choice_2', 'choice_3'])
-        self.assertEqual(the_html, problem.get_html(), 'should be able to call get_html() twice')
+        assert not response.has_mask()
+        assert response.unmask_order() == ['choice_1', 'choice_0', 'choice_2', 'choice_3']
+        assert the_html == problem.get_html(), 'should be able to call get_html() twice'
 
     def test_shuffle_custom_names(self):
         xml_str = textwrap.dedent("""
@@ -56,9 +56,9 @@ class CapaShuffleTest(unittest.TestCase):
         # B A C D
         # Check that the custom name= names come through
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertTrue(response.has_shuffle())
-        self.assertEqual(response.unmask_order(), ['choice_0', 'choice_aaa', 'choice_1', 'choice_ddd'])
+        assert not response.has_mask()
+        assert response.has_shuffle()
+        assert response.unmask_order() == ['choice_0', 'choice_aaa', 'choice_1', 'choice_ddd']
 
     def test_shuffle_different_seed(self):
         xml_str = textwrap.dedent("""
@@ -91,9 +91,9 @@ class CapaShuffleTest(unittest.TestCase):
         the_html = problem.get_html()
         self.assertRegex(the_html, r"<div>.*\[.*'Apple'.*\].*</div>")
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertTrue(response.has_shuffle())
-        self.assertEqual(response.unmask_order(), ['choice_0'])
+        assert not response.has_mask()
+        assert response.has_shuffle()
+        assert response.unmask_order() == ['choice_0']
 
     def test_shuffle_6_choices(self):
         xml_str = textwrap.dedent("""
@@ -132,8 +132,8 @@ class CapaShuffleTest(unittest.TestCase):
         the_html = problem.get_html()
         self.assertRegex(the_html, r"<div>.*\[.*'Apple'.*'Banana'.*'Chocolate'.*'Donut'.*\].*</div>")
         response = list(problem.responders.values())[0]
-        self.assertFalse(response.has_mask())
-        self.assertFalse(response.has_shuffle())
+        assert not response.has_mask()
+        assert not response.has_shuffle()
 
     def test_shuffle_fixed_head_end(self):
         xml_str = textwrap.dedent("""
@@ -275,18 +275,18 @@ class CapaShuffleTest(unittest.TestCase):
         """)
         problem = new_loncapa_problem(xml_str, seed=0)
         orig_html = problem.get_html()
-        self.assertEqual(orig_html, problem.get_html(), 'should be able to call get_html() twice')
+        assert orig_html == problem.get_html(), 'should be able to call get_html() twice'
         html = orig_html.replace('\n', ' ')  # avoid headaches with .* matching
         print(html)
         self.assertRegex(html, r"<div>.*\[.*'Banana'.*'Apple'.*'Chocolate'.*'Donut'.*\].*</div>.*" +
                          r"<div>.*\[.*'C'.*'A'.*'D'.*'B'.*\].*</div>")
         # Look at the responses in their authored order
         responses = sorted(list(problem.responders.values()), key=lambda resp: int(resp.id[resp.id.rindex('_') + 1:]))
-        self.assertFalse(responses[0].has_mask())
-        self.assertTrue(responses[0].has_shuffle())
-        self.assertTrue(responses[1].has_shuffle())
-        self.assertEqual(responses[0].unmask_order(), ['choice_1', 'choice_0', 'choice_2', 'choice_3'])
-        self.assertEqual(responses[1].unmask_order(), ['choice_2', 'choice_0', 'choice_3', 'choice_1'])
+        assert not responses[0].has_mask()
+        assert responses[0].has_shuffle()
+        assert responses[1].has_shuffle()
+        assert responses[0].unmask_order() == ['choice_1', 'choice_0', 'choice_2', 'choice_3']
+        assert responses[1].unmask_order() == ['choice_2', 'choice_0', 'choice_3', 'choice_1']
 
     def test_shuffle_not_with_answerpool(self):
         """Raise error if shuffle and answer-pool are both used."""
diff --git a/common/lib/capa/capa/tests/test_targeted_feedback.py b/common/lib/capa/capa/tests/test_targeted_feedback.py
index 09df597b65082e6d440faac1596d9fe1a0ebb1b7..628279df9a93f706d7623f43ffa3f9536bb6c731 100644
--- a/common/lib/capa/capa/tests/test_targeted_feedback.py
+++ b/common/lib/capa/capa/tests/test_targeted_feedback.py
@@ -91,7 +91,7 @@ class CapaTargetedFeedbackTest(unittest.TestCase):
 
         self.assertRegex(without_new_lines, r"<div>.*'wrong-1'.*'wrong-2'.*'correct-1'.*'wrong-3'.*</div>")
         self.assertNotRegex(without_new_lines, r"feedback1|feedback2|feedback3|feedbackC")
-        self.assertEqual(the_html, problem.get_html(), "Should be able to call get_html() twice")
+        assert the_html == problem.get_html(), 'Should be able to call get_html() twice'
 
     def test_targeted_feedback_student_answer1(self):
         problem = new_loncapa_problem(load_fixture('targeted_feedback.xml'))
@@ -105,7 +105,7 @@ class CapaTargetedFeedbackTest(unittest.TestCase):
         self.assertNotRegex(without_new_lines, r"feedback1|feedback2|feedbackC")
         # Check that calling it multiple times yields the same thing
         the_html2 = problem.get_html()
-        self.assertEqual(the_html, the_html2)
+        assert the_html == the_html2
 
     def test_targeted_feedback_student_answer2(self):
         problem = new_loncapa_problem(load_fixture('targeted_feedback.xml'))
@@ -304,7 +304,7 @@ class CapaTargetedFeedbackTest(unittest.TestCase):
         self.assertNotRegex(without_new_lines, r"feedback2|feedback3")
         # Check that calling it multiple times yields the same thing
         the_html2 = problem.get_html()
-        self.assertEqual(the_html, the_html2)
+        assert the_html == the_html2
 
     def test_targeted_feedback_no_show_solution_explanation(self):
         xml_str = textwrap.dedent("""
diff --git a/common/lib/capa/capa/tests/test_util.py b/common/lib/capa/capa/tests/test_util.py
index 8c6a380678cb9a7e23dc3df6876911f466939fd4..57533ff0c9306ef1f763a1bb7037eb9215e45c44 100644
--- a/common/lib/capa/capa/tests/test_util.py
+++ b/common/lib/capa/capa/tests/test_util.py
@@ -30,94 +30,94 @@ class UtilTest(unittest.TestCase):
     def test_compare_with_tolerance(self):  # lint-amnesty, pylint: disable=too-many-statements
         # Test default tolerance '0.001%' (it is relative)
         result = compare_with_tolerance(100.0, 100.0)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(100.001, 100.0)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(101.0, 100.0)
-        self.assertFalse(result)
+        assert not result
         # Test absolute percentage tolerance
         result = compare_with_tolerance(109.9, 100.0, '10%', False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(110.1, 100.0, '10%', False)
-        self.assertFalse(result)
+        assert not result
         # Test relative percentage tolerance
         result = compare_with_tolerance(111.0, 100.0, '10%', True)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(112.0, 100.0, '10%', True)
-        self.assertFalse(result)
+        assert not result
         # Test absolute tolerance (string)
         result = compare_with_tolerance(109.9, 100.0, '10.0', False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(110.1, 100.0, '10.0', False)
-        self.assertFalse(result)
+        assert not result
         # Test relative tolerance (string)
         result = compare_with_tolerance(111.0, 100.0, '0.1', True)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(112.0, 100.0, '0.1', True)
-        self.assertFalse(result)
+        assert not result
         # Test absolute tolerance (float)
         result = compare_with_tolerance(109.9, 100.0, 10.0, False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(110.1, 100.0, 10.0, False)
-        self.assertFalse(result)
+        assert not result
         # Test relative tolerance (float)
         result = compare_with_tolerance(111.0, 100.0, 0.1, True)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(112.0, 100.0, 0.1, True)
-        self.assertFalse(result)
+        assert not result
         ##### Infinite values #####
         infinity = float('Inf')
         # Test relative tolerance (float)
         result = compare_with_tolerance(infinity, 100.0, 1.0, True)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(100.0, infinity, 1.0, True)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(infinity, infinity, 1.0, True)
-        self.assertTrue(result)
+        assert result
         # Test absolute tolerance (float)
         result = compare_with_tolerance(infinity, 100.0, 1.0, False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(100.0, infinity, 1.0, False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(infinity, infinity, 1.0, False)
-        self.assertTrue(result)
+        assert result
         # Test relative tolerance (string)
         result = compare_with_tolerance(infinity, 100.0, '1.0', True)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(100.0, infinity, '1.0', True)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(infinity, infinity, '1.0', True)
-        self.assertTrue(result)
+        assert result
         # Test absolute tolerance (string)
         result = compare_with_tolerance(infinity, 100.0, '1.0', False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(100.0, infinity, '1.0', False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(infinity, infinity, '1.0', False)
-        self.assertTrue(result)
+        assert result
         # Test absolute tolerance for smaller values
         result = compare_with_tolerance(100.01, 100.0, 0.01, False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(100.001, 100.0, 0.001, False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(100.01, 100.0, '0.01%', False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(100.002, 100.0, 0.001, False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(0.4, 0.44, 0.01, False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(100.01, 100.0, 0.010, False)
-        self.assertTrue(result)
+        assert result
 
         # Test complex_number instructor_complex
         result = compare_with_tolerance(0.4, complex(0.44, 0), 0.01, False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(100.01, complex(100.0, 0), 0.010, False)
-        self.assertTrue(result)
+        assert result
         result = compare_with_tolerance(110.1, complex(100.0, 0), '10.0', False)
-        self.assertFalse(result)
+        assert not result
         result = compare_with_tolerance(111.0, complex(100.0, 0), '10%', True)
-        self.assertTrue(result)
+        assert result
 
     def test_sanitize_html(self):
         """
@@ -126,28 +126,26 @@ class UtilTest(unittest.TestCase):
         allowed_tags = ['div', 'p', 'audio', 'pre', 'span']
         for tag in allowed_tags:
             queue_msg = "<{0}>Test message</{0}>".format(tag)
-            self.assertEqual(sanitize_html(queue_msg), queue_msg)
+            assert sanitize_html(queue_msg) == queue_msg
 
         not_allowed_tag = 'script'
         queue_msg = "<{0}>Test message</{0}>".format(not_allowed_tag)
         expected = "&lt;script&gt;Test message&lt;/script&gt;"
-        self.assertEqual(sanitize_html(queue_msg), expected)
+        assert sanitize_html(queue_msg) == expected
 
     def test_get_inner_html_from_xpath(self):
         """
         Test for getting inner html as string from xpath node.
         """
         xpath_node = etree.XML('<hint style="smtng">aa<a href="#">bb</a>cc</hint>')
-        self.assertEqual(get_inner_html_from_xpath(xpath_node), 'aa<a href="#">bb</a>cc')
+        assert get_inner_html_from_xpath(xpath_node) == 'aa<a href="#">bb</a>cc'
 
     def test_remove_markup(self):
         """
         Test for markup removal with bleach.
         """
-        self.assertEqual(
-            remove_markup("The <mark>Truth</mark> is <em>Out There</em> & you need to <strong>find</strong> it"),
-            "The Truth is Out There &amp; you need to find it"
-        )
+        assert remove_markup('The <mark>Truth</mark> is <em>Out There</em> & you need to <strong>find</strong> it') ==\
+               'The Truth is Out There &amp; you need to find it'
 
     @ddt.data(
         'When the root level failš the whole hierarchy won’t work anymore.',
@@ -159,7 +157,7 @@ class UtilTest(unittest.TestCase):
         text = '$answer0'
         context = {key: context_value}
         contextual_text = contextualize_text(text, context)
-        self.assertEqual(context_value, contextual_text)
+        assert context_value == contextual_text
 
     def test_contextualize_text_with_non_ascii_context(self):
         """Verify that variable substitution works as intended with non-ascii characters."""
@@ -168,4 +166,4 @@ class UtilTest(unittest.TestCase):
         context = {'a': u'あなたあなたあなた', 'b': u'あなたhi'}
         expected_text = '$あなたあなたあなたあなた あなたhi'
         contextual_text = contextualize_text(text, context)
-        self.assertEqual(expected_text, contextual_text)
+        assert expected_text == contextual_text
diff --git a/common/lib/sandbox-packages/verifiers/tests_draganddrop.py b/common/lib/sandbox-packages/verifiers/tests_draganddrop.py
index 9c5e544e2864a491e2fc20c1495db12e6e2b66ab..03bea0858785769b497eeab25afe32373fac645f 100644
--- a/common/lib/sandbox-packages/verifiers/tests_draganddrop.py
+++ b/common/lib/sandbox-packages/verifiers/tests_draganddrop.py
@@ -12,34 +12,34 @@ class Test_PositionsCompare(unittest.TestCase):
     """ describe"""
 
     def test_nested_list_and_list1(self):
-        self.assertEqual(PositionsCompare([[1, 2], 40]), PositionsCompare([1, 3]))
+        assert PositionsCompare([[1, 2], 40]) == PositionsCompare([1, 3])
 
     def test_nested_list_and_list2(self):
-        self.assertNotEqual(PositionsCompare([1, 12]), PositionsCompare([1, 1]))
+        assert PositionsCompare([1, 12]) != PositionsCompare([1, 1])
 
     def test_list_and_list1(self):
-        self.assertNotEqual(PositionsCompare([[1, 2], 12]), PositionsCompare([1, 15]))
+        assert PositionsCompare([[1, 2], 12]) != PositionsCompare([1, 15])
 
     def test_list_and_list2(self):
-        self.assertEqual(PositionsCompare([1, 11]), PositionsCompare([1, 1]))
+        assert PositionsCompare([1, 11]) == PositionsCompare([1, 1])
 
     def test_numerical_list_and_string_list(self):
-        self.assertNotEqual(PositionsCompare([1, 2]), PositionsCompare(["1"]))
+        assert PositionsCompare([1, 2]) != PositionsCompare(['1'])
 
     def test_string_and_string_list1(self):
-        self.assertEqual(PositionsCompare("1"), PositionsCompare(["1"]))
+        assert PositionsCompare('1') == PositionsCompare(['1'])
 
     def test_string_and_string_list2(self):
-        self.assertEqual(PositionsCompare("abc"), PositionsCompare("abc"))
+        assert PositionsCompare('abc') == PositionsCompare('abc')
 
     def test_string_and_string_list3(self):
-        self.assertNotEqual(PositionsCompare("abd"), PositionsCompare("abe"))
+        assert PositionsCompare('abd') != PositionsCompare('abe')
 
     def test_float_and_string(self):
-        self.assertNotEqual(PositionsCompare([3.5, 5.7]), PositionsCompare(["1"]))
+        assert PositionsCompare([3.5, 5.7]) != PositionsCompare(['1'])
 
     def test_floats_and_ints(self):
-        self.assertEqual(PositionsCompare([3.5, 4.5]), PositionsCompare([5, 7]))
+        assert PositionsCompare([3.5, 4.5]) == PositionsCompare([5, 7])
 
 
 class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -64,7 +64,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'anyof'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_targets_are_draggable_2(self):
         user_input = json.dumps([
@@ -107,7 +107,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_targets_are_draggable_2_manual_parsing(self):
         user_input = json.dumps([
@@ -150,7 +150,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_targets_are_draggable_3_nested(self):
         user_input = json.dumps([
@@ -209,7 +209,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_targets_are_draggable_4_real_example(self):
         user_input = json.dumps([
@@ -283,83 +283,83 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
             },
 
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_targets_true(self):
         user_input = '[{"1": "t1"}, \
          {"name_with_icon": "t2"}]'
         correct_answer = {'1': 't1', 'name_with_icon': 't2'}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_expect_no_actions_wrong(self):
         user_input = '[{"1": "t1"}, \
          {"name_with_icon": "t2"}]'
         correct_answer = []
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_expect_no_actions_right(self):
         user_input = '[]'
         correct_answer = []
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_targets_false(self):
         user_input = '[{"1": "t1"}, \
         {"name_with_icon": "t2"}]'
         correct_answer = {'1': 't3', 'name_with_icon': 't2'}
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_multiple_images_per_target_true(self):
         user_input = '[{"1": "t1"}, {"name_with_icon": "t2"}, \
         {"2": "t1"}]'
         correct_answer = {'1': 't1', 'name_with_icon': 't2', '2': 't1'}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_multiple_images_per_target_false(self):
         user_input = '[{"1": "t1"}, {"name_with_icon": "t2"}, \
         {"2": "t1"}]'
         correct_answer = {'1': 't2', 'name_with_icon': 't2', '2': 't1'}
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_targets_and_positions(self):
         user_input = '[{"1": [10,10]}, \
          {"name_with_icon": [[10,10],4]}]'
         correct_answer = {'1': [10, 10], 'name_with_icon': [[10, 10], 4]}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_position_and_targets(self):
         user_input = '[{"1": "t1"}, {"name_with_icon": "t2"}]'
         correct_answer = {'1': 't1', 'name_with_icon': 't2'}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_positions_exact(self):
         user_input = '[{"1": [10, 10]}, {"name_with_icon": [20, 20]}]'
         correct_answer = {'1': [10, 10], 'name_with_icon': [20, 20]}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_positions_false(self):
         user_input = '[{"1": [10, 10]}, {"name_with_icon": [20, 20]}]'
         correct_answer = {'1': [25, 25], 'name_with_icon': [20, 20]}
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_positions_true_in_radius(self):
         user_input = '[{"1": [10, 10]}, {"name_with_icon": [20, 20]}]'
         correct_answer = {'1': [14, 14], 'name_with_icon': [20, 20]}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_positions_true_in_manual_radius(self):
         user_input = '[{"1": [10, 10]}, {"name_with_icon": [20, 20]}]'
         correct_answer = {'1': [[40, 10], 30], 'name_with_icon': [20, 20]}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_positions_false_in_manual_radius(self):
         user_input = '[{"1": [10, 10]}, {"name_with_icon": [20, 20]}]'
         correct_answer = {'1': [[40, 10], 29], 'name_with_icon': [20, 20]}
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_correct_answer_not_has_key_from_user_answer(self):
         user_input = '[{"1": "t1"}, {"name_with_icon": "t2"}]'
         correct_answer = {'3': 't3', 'name_with_icon': 't2'}
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_anywhere(self):
         """Draggables can be places anywhere on base image.
@@ -369,7 +369,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
             {"grass":[322.5,199.449951171875]}]'
 
         correct_answer = {'grass': [[300, 200], 200], 'ant': [[500, 0], 200]}
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_lcao_correct(self):
         """Describe carbon molecule in LCAO-MO"""
@@ -408,7 +408,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
             'rule': 'anyof'
         }]
 
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_lcao_extra_element_incorrect(self):
         """Describe carbon molecule in LCAO-MO"""
@@ -447,7 +447,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
             'rule': 'anyof'
         }]
 
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_reuse_draggable_no_mupliples(self):
         """Test reusable draggables (no mupltiple draggables per target)"""
@@ -471,7 +471,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'anyof'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_reuse_draggable_with_mupliples(self):
         """Test reusable draggables with mupltiple draggables per target"""
@@ -495,7 +495,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'anyof'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_reuse_many_draggable_with_mupliples(self):
         """Test reusable draggables with mupltiple draggables per target"""
@@ -525,7 +525,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'anyof'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_reuse_many_draggable_with_mupliples_wrong(self):
         """Test reusable draggables with mupltiple draggables per target"""
@@ -556,7 +556,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'targets': ['target6'],
                 'rule': 'anyof'
             }]
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_label_10_targets_with_a_b_c_false(self):
         """Test reusable draggables (no mupltiple draggables per target)"""
@@ -581,7 +581,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal'
             }
         ]
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_label_10_targets_with_a_b_c_(self):
         """Test reusable draggables (no mupltiple draggables per target)"""
@@ -606,7 +606,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_label_10_targets_with_a_b_c_multiple(self):
         """Test reusable draggables  (mupltiple draggables per target)"""
@@ -631,7 +631,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'anyof+number'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_label_10_targets_with_a_b_c_multiple_false(self):
         """Test reusable draggables  (mupltiple draggables per target)"""
@@ -656,7 +656,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'anyof+number'
             }
         ]
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_label_10_targets_with_a_b_c_reused(self):
         """Test a b c in 10 labels reused"""
@@ -681,7 +681,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal+number'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_label_10_targets_with_a_b_c_reused_false(self):
         """Test a b c in 10 labels reused false"""
@@ -706,7 +706,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'unordered_equal+number'
             }
         ]
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_mixed_reuse_and_not_reuse(self):
         """Test reusable draggables """
@@ -725,7 +725,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'exact'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_mixed_reuse_and_not_reuse_number(self):
         """Test reusable draggables with number """
@@ -743,7 +743,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'exact'
             }
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
     def test_mixed_reuse_and_not_reuse_number_false(self):
         """Test reusable draggables with numbers, but wrong"""
@@ -761,7 +761,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
                 'rule': 'exact'
             }
         ]
-        self.assertFalse(draganddrop.grade(user_input, correct_answer))
+        assert not draganddrop.grade(user_input, correct_answer)
 
     def test_alternative_correct_answer(self):
         user_input = '[{"name_with_icon":"t1"},\
@@ -772,7 +772,7 @@ class Test_DragAndDrop_Grade(unittest.TestCase):  # lint-amnesty, pylint: disabl
             {'draggables': ['name_with_icon'], 'targets': ['t1', 't1', 't1'],
                 'rule': 'exact'}
         ]
-        self.assertTrue(draganddrop.grade(user_input, correct_answer))
+        assert draganddrop.grade(user_input, correct_answer)
 
 
 class Test_DragAndDrop_Populate(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -787,61 +787,45 @@ class Test_DragAndDrop_Populate(unittest.TestCase):  # lint-amnesty, pylint: dis
         user_groups = [['1'], ['name_with_icon']]
         user_positions = [{'user': [[10, 10]]}, {'user': [[20, 20]]}]
 
-        self.assertEqual(correct_groups, dnd.correct_groups)
-        self.assertEqual(correct_positions, dnd.correct_positions)
-        self.assertEqual(user_groups, dnd.user_groups)
-        self.assertEqual(user_positions, dnd.user_positions)
+        assert correct_groups == dnd.correct_groups
+        assert correct_positions == dnd.correct_positions
+        assert user_groups == dnd.user_groups
+        assert user_positions == dnd.user_positions
 
 
 class Test_DraAndDrop_Compare_Positions(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
 
     def test_1(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertTrue(dnd.compare_positions(correct=[[1, 1], [2, 3]],
-                                              user=[[2, 3], [1, 1]],
-                                              flag='anyof'))
+        assert dnd.compare_positions(correct=[[1, 1], [2, 3]], user=[[2, 3], [1, 1]], flag='anyof')
 
     def test_2a(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertTrue(dnd.compare_positions(correct=[[1, 1], [2, 3]],
-                                              user=[[2, 3], [1, 1]],
-                                              flag='exact'))
+        assert dnd.compare_positions(correct=[[1, 1], [2, 3]], user=[[2, 3], [1, 1]], flag='exact')
 
     def test_2b(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertFalse(dnd.compare_positions(correct=[[1, 1], [2, 3]],
-                                               user=[[2, 13], [1, 1]],
-                                               flag='exact'))
+        assert not dnd.compare_positions(correct=[[1, 1], [2, 3]], user=[[2, 13], [1, 1]], flag='exact')
 
     def test_3(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertFalse(dnd.compare_positions(correct=["a", "b"],
-                                               user=["a", "b", "c"],
-                                               flag='anyof'))
+        assert not dnd.compare_positions(correct=['a', 'b'], user=['a', 'b', 'c'], flag='anyof')
 
     def test_4(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertTrue(dnd.compare_positions(correct=["a", "b", "c"],
-                                              user=["a", "b"],
-                                              flag='anyof'))
+        assert dnd.compare_positions(correct=['a', 'b', 'c'], user=['a', 'b'], flag='anyof')
 
     def test_5(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertFalse(dnd.compare_positions(correct=["a", "b", "c"],
-                                               user=["a", "c", "b"],
-                                               flag='exact'))
+        assert not dnd.compare_positions(correct=['a', 'b', 'c'], user=['a', 'c', 'b'], flag='exact')
 
     def test_6(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertTrue(dnd.compare_positions(correct=["a", "b", "c"],
-                                              user=["a", "c", "b"],
-                                              flag='anyof'))
+        assert dnd.compare_positions(correct=['a', 'b', 'c'], user=['a', 'c', 'b'], flag='anyof')
 
     def test_7(self):
         dnd = draganddrop.DragAndDrop({'1': 't1'}, '[{"1": "t1"}]')
-        self.assertFalse(dnd.compare_positions(correct=["a", "b", "b"],
-                                               user=["a", "c", "b"],
-                                               flag='anyof'))
+        assert not dnd.compare_positions(correct=['a', 'b', 'b'], user=['a', 'c', 'b'], flag='anyof')
 
 
 def suite():  # lint-amnesty, pylint: disable=missing-function-docstring
diff --git a/common/lib/symmath/symmath/test_formula.py b/common/lib/symmath/symmath/test_formula.py
index 25d163f0596c2457129384d693ba19d04e1be955..1235f7b771c100be7b4f418c132f725d6e33bc41 100644
--- a/common/lib/symmath/symmath/test_formula.py
+++ b/common/lib/symmath/symmath/test_formula.py
@@ -43,7 +43,7 @@ class FormulaTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         test = etree.tostring(xml)
 
         # success?
-        self.assertEqual(test.decode('utf-8'), expected)
+        assert test.decode('utf-8') == expected
 
     def test_fix_simple_superscripts(self):
         expr = '''
@@ -67,7 +67,7 @@ class FormulaTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         test = etree.tostring(xml)
 
         # success?
-        self.assertEqual(test.decode('utf-8'), expected)
+        assert test.decode('utf-8') == expected
 
     def test_fix_complex_superscripts(self):
         expr = '''
@@ -92,7 +92,7 @@ class FormulaTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         test = etree.tostring(xml)
 
         # success?
-        self.assertEqual(test.decode('utf-8'), expected)
+        assert test.decode('utf-8') == expected
 
     def test_fix_msubsup(self):
         expr = '''
@@ -114,4 +114,4 @@ class FormulaTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         test = etree.tostring(xml)
 
         # success?
-        self.assertEqual(test.decode('utf-8'), expected)
+        assert test.decode('utf-8') == expected
diff --git a/common/lib/symmath/symmath/test_symmath_check.py b/common/lib/symmath/symmath/test_symmath_check.py
index 0271f42ecc1c82f59595586b267babb460047ef1..b611cfe36fa0f94d4f9e177e946b027e09ce8683 100644
--- a/common/lib/symmath/symmath/test_symmath_check.py
+++ b/common/lib/symmath/symmath/test_symmath_check.py
@@ -32,7 +32,7 @@ class SymmathCheckTest(TestCase):  # lint-amnesty, pylint: disable=missing-class
 
         # Expect that the exact same symbolic string is marked correct
         result = symmath_check(expected_str, expected_str, dynamath=[dynamath])
-        self.assertTrue('ok' in result and result['ok'])
+        assert (('ok' in result) and result['ok'])
 
     def test_symmath_check_equivalent_symbols(self):
         expected_str = "x+2*y"
@@ -52,7 +52,7 @@ class SymmathCheckTest(TestCase):  # lint-amnesty, pylint: disable=missing-class
 
         # Expect that equivalent symbolic strings are marked correct
         result = symmath_check(expected_str, input_str, dynamath=[dynamath])
-        self.assertTrue('ok' in result and result['ok'])
+        assert (('ok' in result) and result['ok'])
 
     def test_symmath_check_different_symbols(self):
         expected_str = "0"
@@ -70,8 +70,8 @@ class SymmathCheckTest(TestCase):  # lint-amnesty, pylint: disable=missing-class
 
         # Expect that an incorrect response is marked incorrect
         result = symmath_check(expected_str, input_str, dynamath=[dynamath])
-        self.assertTrue('ok' in result and not result['ok'])
-        self.assertNotIn('fail', result['msg'])
+        assert (('ok' in result) and (not result['ok']))
+        assert 'fail' not in result['msg']
 
     def _symmath_check_numbers(self, number_list):  # lint-amnesty, pylint: disable=missing-function-docstring
 
@@ -81,11 +81,9 @@ class SymmathCheckTest(TestCase):  # lint-amnesty, pylint: disable=missing-class
             expect = n
             ans = n
             result = symmath_check(str(expect), str(ans))
-            self.assertTrue('ok' in result and result['ok'],
-                            "%f should == %f" % (expect, ans))
+            assert (('ok' in result) and result['ok']), ('%f should == %f' % (expect, ans))
 
             # Change expect so that it != ans
             expect += 0.1
             result = symmath_check(str(expect), str(ans))
-            self.assertTrue('ok' in result and not result['ok'],
-                            "%f should != %f" % (expect, ans))
+            assert (('ok' in result) and (not result['ok'])), ('%f should != %f' % (expect, ans))
diff --git a/common/lib/xmodule/xmodule/assetstore/tests/test_asset_xml.py b/common/lib/xmodule/xmodule/assetstore/tests/test_asset_xml.py
index a795a70cfc1f8ef1d23a074b97b2c591a49c2e0a..c647e952af3c9607a7984549c970ab8d64dcde1c 100644
--- a/common/lib/xmodule/xmodule/assetstore/tests/test_asset_xml.py
+++ b/common/lib/xmodule/xmodule/assetstore/tests/test_asset_xml.py
@@ -4,6 +4,7 @@ Test for asset XML generation / parsing.
 
 
 import unittest
+import pytest
 
 from contracts import ContractNotRespected
 from lxml import etree
@@ -59,7 +60,7 @@ class TestAssetXml(unittest.TestCase):
                 continue
             orig_value = getattr(asset_md, attr)
             new_value = getattr(new_asset_md, attr)
-            self.assertEqual(orig_value, new_value)
+            assert orig_value == new_value
 
     def test_export_with_None_value(self):
         """
@@ -87,7 +88,7 @@ class TestAssetXml(unittest.TestCase):
         Ensure full asset sections with the wrong tag are detected.
         """
         root = etree.Element("glassets")
-        with self.assertRaises(ContractNotRespected):
+        with pytest.raises(ContractNotRespected):
             AssetMetadata.add_all_assets_as_xml(root, self.course_assets)
 
     def test_wrong_node_type_single(self):
@@ -97,5 +98,5 @@ class TestAssetXml(unittest.TestCase):
         asset_md = self.course_assets[0]
         root = etree.Element("assets")
         asset = etree.SubElement(root, "smashset")
-        with self.assertRaises(ContractNotRespected):
+        with pytest.raises(ContractNotRespected):
             asset_md.to_xml(asset)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_abstraction.py b/common/lib/xmodule/xmodule/modulestore/tests/test_abstraction.py
index 85940cb969b4b4eac1992c1180ed3a770d15b4fc..d8dfbceeea7ef4828557d04a4334fea01eee2e06 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_abstraction.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_abstraction.py
@@ -4,6 +4,7 @@ Simple test to ensure that modulestore base classes remain abstract
 
 
 from unittest import TestCase
+import pytest
 
 from xmodule.modulestore import ModuleStoreRead, ModuleStoreWrite
 
@@ -14,5 +15,6 @@ class AbstractionTest(TestCase):
     """
 
     def test_cant_instantiate_abstract_class(self):
-        self.assertRaises(TypeError, ModuleStoreRead)  # Cannot be instantiated due to explicit abstraction
-        self.assertRaises(TypeError, ModuleStoreWrite)
+        pytest.raises(TypeError, ModuleStoreRead)
+        # Cannot be instantiated due to explicit abstraction
+        pytest.raises(TypeError, ModuleStoreWrite)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_asides.py b/common/lib/xmodule/xmodule/modulestore/tests/test_asides.py
index afe2b7ab104cf644abcde58ed35d417b032c959a..e336621c2e928f4f2af9410ea2a435dd22ed613d 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_asides.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_asides.py
@@ -45,11 +45,11 @@ class TestAsidesXmlStore(TestCase):
                 Check whether block has the expected aside w/ its fields and then recurse to the block's children
                 """
                 asides = block.runtime.get_asides(block)
-                self.assertEqual(len(asides), 1, "Found {} asides but expected only test_aside".format(asides))
-                self.assertIsInstance(asides[0], AsideTestType)
+                assert len(asides) == 1, 'Found {} asides but expected only test_aside'.format(asides)
+                assert isinstance(asides[0], AsideTestType)
                 category = block.scope_ids.block_type
-                self.assertEqual(asides[0].data_field, "{} aside data".format(category))
-                self.assertEqual(asides[0].content, "{} Aside".format(category.capitalize()))
+                assert asides[0].data_field == '{} aside data'.format(category)
+                assert asides[0].content == '{} Aside'.format(category.capitalize())
 
                 for child in block.get_children():
                     check_block(child)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_assetstore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_assetstore.py
index 41123dd241c220ce63822a9c76f668ea780eb9aa..905705491f2dcb1dfe430bbb09af9d0412708352 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_assetstore.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_assetstore.py
@@ -6,7 +6,7 @@ too.
 
 import unittest
 from datetime import datetime, timedelta
-
+import pytest
 import ddt
 import pytz
 import six
@@ -83,16 +83,14 @@ class TestSortedAssetList(unittest.TestCase):
 
     def test_exception_on_bad_sort(self):
         asset_key = self.course_key.make_asset_key('asset', 'pic1.jpg')
-        with self.assertRaises(IncorrectlySortedList):
+        with pytest.raises(IncorrectlySortedList):
             __ = self.sorted_asset_list_by_last_edit.find(asset_key)
 
     def test_find(self):
         asset_key = self.course_key.make_asset_key('asset', 'asset.txt')
-        self.assertEqual(self.sorted_asset_list_by_filename.find(asset_key), 0)
+        assert self.sorted_asset_list_by_filename.find(asset_key) == 0
         asset_key_last = self.course_key.make_asset_key('asset', 'weather_patterns.bmp')
-        self.assertEqual(
-            self.sorted_asset_list_by_filename.find(asset_key_last), len(AssetStoreTestData.all_asset_data) - 1
-        )
+        assert self.sorted_asset_list_by_filename.find(asset_key_last) == (len(AssetStoreTestData.all_asset_data) - 1)
 
 
 @attr('mongo')
@@ -126,7 +124,7 @@ class TestMongoAssetMetadataStorage(TestCase):
         if type(mdata1) != type(mdata2):  # lint-amnesty, pylint: disable=unidiomatic-typecheck
             self.fail(self._formatMessage(msg, u"{} is not same type as {}".format(mdata1, mdata2)))
         for attr in mdata1.ATTRS_ALLOWED_TO_UPDATE:  # lint-amnesty, pylint: disable=redefined-outer-name
-            self.assertEqual(getattr(mdata1, attr), getattr(mdata2, attr), msg)
+            assert getattr(mdata1, attr) == getattr(mdata2, attr), msg
 
     def _compare_datetimes(self, datetime1, datetime2, msg=None):
         """
@@ -188,9 +186,9 @@ class TestMongoAssetMetadataStorage(TestCase):
             store.save_asset_metadata(new_asset_md, ModuleStoreEnum.UserID.test)
             # Find the asset's metadata and confirm it's the same.
             found_asset_md = store.find_asset_metadata(new_asset_loc)
-            self.assertIsNotNone(found_asset_md)
-            self.assertEqual(new_asset_md, found_asset_md)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 1)
+            assert found_asset_md is not None
+            assert new_asset_md == found_asset_md
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 1
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_delete(self, storebuilder):
@@ -201,13 +199,13 @@ class TestMongoAssetMetadataStorage(TestCase):
             course = CourseFactory.create(modulestore=store)
             new_asset_loc = course.id.make_asset_key('asset', 'burnside.jpg')
             # Attempt to delete an asset that doesn't exist.
-            self.assertEqual(store.delete_asset_metadata(new_asset_loc, ModuleStoreEnum.UserID.test), 0)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 0)
+            assert store.delete_asset_metadata(new_asset_loc, ModuleStoreEnum.UserID.test) == 0
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 0
 
             new_asset_md = self._make_asset_metadata(new_asset_loc)
             store.save_asset_metadata(new_asset_md, ModuleStoreEnum.UserID.test)
-            self.assertEqual(store.delete_asset_metadata(new_asset_loc, ModuleStoreEnum.UserID.test), 1)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 0)
+            assert store.delete_asset_metadata(new_asset_loc, ModuleStoreEnum.UserID.test) == 1
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 0
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_find_non_existing_assets(self, storebuilder):
@@ -219,7 +217,7 @@ class TestMongoAssetMetadataStorage(TestCase):
             new_asset_loc = course.id.make_asset_key('asset', 'burnside.jpg')
             # Find existing asset metadata.
             asset_md = store.find_asset_metadata(new_asset_loc)
-            self.assertIsNone(asset_md)
+            assert asset_md is None
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_get_all_non_existing_assets(self, storebuilder):
@@ -230,7 +228,7 @@ class TestMongoAssetMetadataStorage(TestCase):
             course = CourseFactory.create(modulestore=store)
             # Find existing asset metadata.
             asset_md = store.get_all_asset_metadata(course.id, 'asset')
-            self.assertEqual(asset_md, [])
+            assert asset_md == []
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_find_assets_in_non_existent_course(self, storebuilder):
@@ -244,9 +242,9 @@ class TestMongoAssetMetadataStorage(TestCase):
             ))
             new_asset_loc = fake_course_id.make_asset_key('asset', 'burnside.jpg')
             # Find asset metadata from non-existent course.
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 store.find_asset_metadata(new_asset_loc)
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 store.get_all_asset_metadata(fake_course_id, 'asset')
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -260,11 +258,11 @@ class TestMongoAssetMetadataStorage(TestCase):
             new_asset_md = self._make_asset_metadata(new_asset_loc)
             # Add asset metadata.
             store.save_asset_metadata(new_asset_md, ModuleStoreEnum.UserID.test)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 1)
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 1
             # Add *the same* asset metadata.
             store.save_asset_metadata(new_asset_md, ModuleStoreEnum.UserID.test)
             # Still one here?
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 1)
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 1
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_different_asset_types(self, storebuilder):
@@ -277,8 +275,8 @@ class TestMongoAssetMetadataStorage(TestCase):
             new_asset_md = self._make_asset_metadata(new_asset_loc)
             # Add asset metadata.
             store.save_asset_metadata(new_asset_md, ModuleStoreEnum.UserID.test)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'vrml')), 1)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 0)
+            assert len(store.get_all_asset_metadata(course.id, 'vrml')) == 1
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 0
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_asset_types_with_other_field_names(self, storebuilder):
@@ -291,10 +289,10 @@ class TestMongoAssetMetadataStorage(TestCase):
             new_asset_md = self._make_asset_metadata(new_asset_loc)
             # Add asset metadata.
             store.save_asset_metadata(new_asset_md, ModuleStoreEnum.UserID.test)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'course_id')), 1)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'asset')), 0)
+            assert len(store.get_all_asset_metadata(course.id, 'course_id')) == 1
+            assert len(store.get_all_asset_metadata(course.id, 'asset')) == 0
             all_assets = store.get_all_asset_metadata(course.id, 'course_id')
-            self.assertEqual(all_assets[0].asset_id.path, new_asset_loc.path)
+            assert all_assets[0].asset_id.path == new_asset_loc.path
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_lock_unlock_assets(self, storebuilder):
@@ -312,13 +310,13 @@ class TestMongoAssetMetadataStorage(TestCase):
             store.set_asset_metadata_attr(new_asset_loc, "locked", not locked_state, ModuleStoreEnum.UserID.test)
             # Find the same course and check its locked status.
             updated_asset_md = store.find_asset_metadata(new_asset_loc)
-            self.assertIsNotNone(updated_asset_md)
-            self.assertEqual(updated_asset_md.locked, not locked_state)
+            assert updated_asset_md is not None
+            assert updated_asset_md.locked == (not locked_state)
             # Now flip it back.
             store.set_asset_metadata_attr(new_asset_loc, "locked", locked_state, ModuleStoreEnum.UserID.test)
             reupdated_asset_md = store.find_asset_metadata(new_asset_loc)
-            self.assertIsNotNone(reupdated_asset_md)
-            self.assertEqual(reupdated_asset_md.locked, locked_state)
+            assert reupdated_asset_md is not None
+            assert reupdated_asset_md.locked == locked_state
 
     ALLOWED_ATTRS = (
         ('pathname', '/new/path'),
@@ -359,9 +357,9 @@ class TestMongoAssetMetadataStorage(TestCase):
                 store.set_asset_metadata_attr(new_asset_loc, attribute, value, ModuleStoreEnum.UserID.test)
                 # Find the same course asset and check its changed attribute.
                 updated_asset_md = store.find_asset_metadata(new_asset_loc)
-                self.assertIsNotNone(updated_asset_md)
-                self.assertIsNotNone(getattr(updated_asset_md, attribute, None))
-                self.assertEqual(getattr(updated_asset_md, attribute, None), value)
+                assert updated_asset_md is not None
+                assert getattr(updated_asset_md, attribute, None) is not None
+                assert getattr(updated_asset_md, attribute, None) == value
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_set_disallowed_attrs(self, storebuilder):
@@ -379,10 +377,10 @@ class TestMongoAssetMetadataStorage(TestCase):
                 store.set_asset_metadata_attr(new_asset_loc, attribute, value, ModuleStoreEnum.UserID.test)
                 # Find the same course and check its changed attribute.
                 updated_asset_md = store.find_asset_metadata(new_asset_loc)
-                self.assertIsNotNone(updated_asset_md)
-                self.assertIsNotNone(getattr(updated_asset_md, attribute, None))
+                assert updated_asset_md is not None
+                assert getattr(updated_asset_md, attribute, None) is not None
                 # Make sure that the attribute is unchanged from its original value.
-                self.assertEqual(getattr(updated_asset_md, attribute, None), original_attr_val)
+                assert getattr(updated_asset_md, attribute, None) == original_attr_val
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_set_unknown_attrs(self, storebuilder):
@@ -399,10 +397,10 @@ class TestMongoAssetMetadataStorage(TestCase):
                 store.set_asset_metadata_attr(new_asset_loc, attribute, value, ModuleStoreEnum.UserID.test)
                 # Find the same course and check its changed attribute.
                 updated_asset_md = store.find_asset_metadata(new_asset_loc)
-                self.assertIsNotNone(updated_asset_md)
+                assert updated_asset_md is not None
                 # Make sure the unknown field was *not* added.
-                with self.assertRaises(AttributeError):
-                    self.assertEqual(getattr(updated_asset_md, attribute), value)
+                with pytest.raises(AttributeError):
+                    assert getattr(updated_asset_md, attribute) == value
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_save_one_different_asset(self, storebuilder):
@@ -416,9 +414,9 @@ class TestMongoAssetMetadataStorage(TestCase):
                 self._make_asset_metadata(asset_key)
             )
             store.save_asset_metadata(new_asset_thumbnail, ModuleStoreEnum.UserID.test)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'different')), 1)
-            self.assertEqual(store.delete_asset_metadata(asset_key, ModuleStoreEnum.UserID.test), 1)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'different')), 0)
+            assert len(store.get_all_asset_metadata(course.id, 'different')) == 1
+            assert store.delete_asset_metadata(asset_key, ModuleStoreEnum.UserID.test) == 1
+            assert len(store.get_all_asset_metadata(course.id, 'different')) == 0
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_find_different(self, storebuilder):
@@ -433,17 +431,17 @@ class TestMongoAssetMetadataStorage(TestCase):
             )
             store.save_asset_metadata(new_asset_thumbnail, ModuleStoreEnum.UserID.test)
 
-            self.assertIsNotNone(store.find_asset_metadata(asset_key))
+            assert store.find_asset_metadata(asset_key) is not None
             unknown_asset_key = course.id.make_asset_key('different', 'nosuchfile.jpg')
-            self.assertIsNone(store.find_asset_metadata(unknown_asset_key))
+            assert store.find_asset_metadata(unknown_asset_key) is None
 
     def _check_asset_values(self, assets, orig):
         """
         Check asset type/path values.
         """
         for idx, asset in enumerate(orig):
-            self.assertEqual(assets[idx].asset_id.asset_type, asset[0])
-            self.assertEqual(assets[idx].asset_id.path, asset[1])
+            assert assets[idx].asset_id.asset_type == asset[0]
+            assert assets[idx].asset_id.path == asset[1]
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_get_multiple_types(self, storebuilder):
@@ -468,17 +466,17 @@ class TestMongoAssetMetadataStorage(TestCase):
                 ('asset', self.regular_assets),
             ):
                 assets = store.get_all_asset_metadata(course.id, asset_type)
-                self.assertEqual(len(assets), len(asset_list))
+                assert len(assets) == len(asset_list)
                 self._check_asset_values(assets, asset_list)
 
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'not_here')), 0)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, None)), 4)
+            assert len(store.get_all_asset_metadata(course.id, 'not_here')) == 0
+            assert len(store.get_all_asset_metadata(course.id, None)) == 4
 
             assets = store.get_all_asset_metadata(
                 course.id, None, start=0, maxresults=-1,
                 sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(assets), len(self.alls))
+            assert len(assets) == len(self.alls)
             self._check_asset_values(assets, self.alls)
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -507,17 +505,17 @@ class TestMongoAssetMetadataStorage(TestCase):
                 ('asset', self.regular_assets),
             ):
                 assets = store.get_all_asset_metadata(course.id, asset_type)
-                self.assertEqual(len(assets), len(asset_list))
+                assert len(assets) == len(asset_list)
                 self._check_asset_values(assets, asset_list)
 
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'not_here')), 0)
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, None)), 4)
+            assert len(store.get_all_asset_metadata(course.id, 'not_here')) == 0
+            assert len(store.get_all_asset_metadata(course.id, None)) == 4
 
             assets = store.get_all_asset_metadata(
                 course.id, None, start=0, maxresults=-1,
                 sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(assets), len(self.alls))
+            assert len(assets) == len(self.alls)
             self._check_asset_values(assets, self.alls)
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -549,17 +547,17 @@ class TestMongoAssetMetadataStorage(TestCase):
                 ('vrml', self.vrmls),
             ):
                 assets = store.get_all_asset_metadata(course1.id, asset_type)
-                self.assertEqual(len(assets), len(asset_list))
+                assert len(assets) == len(asset_list)
                 self._check_asset_values(assets, asset_list)
 
-            self.assertEqual(len(store.get_all_asset_metadata(course1.id, 'asset')), 0)
-            self.assertEqual(len(store.get_all_asset_metadata(course1.id, None)), 3)
+            assert len(store.get_all_asset_metadata(course1.id, 'asset')) == 0
+            assert len(store.get_all_asset_metadata(course1.id, None)) == 3
 
             assets = store.get_all_asset_metadata(
                 course1.id, None, start=0, maxresults=-1,
                 sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(assets), len(self.differents + self.vrmls))
+            assert len(assets) == len((self.differents + self.vrmls))
             self._check_asset_values(assets, self.differents + self.vrmls)
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -575,7 +573,7 @@ class TestMongoAssetMetadataStorage(TestCase):
             )
             store.save_asset_metadata(new_asset_thumbnail, ModuleStoreEnum.UserID.test)
 
-            self.assertEqual(len(store.get_all_asset_metadata(course.id, 'different')), 1)
+            assert len(store.get_all_asset_metadata(course.id, 'different')) == 1
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_get_all_assets_with_paging(self, storebuilder):
@@ -617,38 +615,38 @@ class TestMongoAssetMetadataStorage(TestCase):
                     )
                     num_expected_results = sort_test[2][i]
                     expected_filename = sort_test[1][2 * i]
-                    self.assertEqual(len(asset_page), num_expected_results)
-                    self.assertEqual(asset_page[0].asset_id.path, expected_filename)
+                    assert len(asset_page) == num_expected_results
+                    assert asset_page[0].asset_id.path == expected_filename
                     if num_expected_results == 2:
                         expected_filename = sort_test[1][(2 * i) + 1]
-                        self.assertEqual(asset_page[1].asset_id.path, expected_filename)
+                        assert asset_page[1].asset_id.path == expected_filename
 
             # Now fetch everything.
             asset_page = store.get_all_asset_metadata(
                 course2.id, 'asset', start=0, sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(asset_page), 5)
-            self.assertEqual(asset_page[0].asset_id.path, 'code.tgz')
-            self.assertEqual(asset_page[1].asset_id.path, 'demo.swf')
-            self.assertEqual(asset_page[2].asset_id.path, 'dog.png')
-            self.assertEqual(asset_page[3].asset_id.path, 'roman_history.pdf')
-            self.assertEqual(asset_page[4].asset_id.path, 'weather_patterns.bmp')
+            assert len(asset_page) == 5
+            assert asset_page[0].asset_id.path == 'code.tgz'
+            assert asset_page[1].asset_id.path == 'demo.swf'
+            assert asset_page[2].asset_id.path == 'dog.png'
+            assert asset_page[3].asset_id.path == 'roman_history.pdf'
+            assert asset_page[4].asset_id.path == 'weather_patterns.bmp'
 
             # Some odd conditions.
             asset_page = store.get_all_asset_metadata(
                 course2.id, 'asset', start=100, sort=('uploadDate', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(asset_page), 0)
+            assert len(asset_page) == 0
             asset_page = store.get_all_asset_metadata(
                 course2.id, 'asset', start=3, maxresults=0,
                 sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(asset_page), 0)
+            assert len(asset_page) == 0
             asset_page = store.get_all_asset_metadata(
                 course2.id, 'asset', start=3, maxresults=-12345,
                 sort=('displayname', ModuleStoreEnum.SortOrder.descending)
             )
-            self.assertEqual(len(asset_page), 2)
+            assert len(asset_page) == 2
 
     @ddt.data('XML_MODULESTORE_BUILDER', 'MIXED_MODULESTORE_BUILDER')
     def test_xml_not_yet_implemented(self, storebuilderName):
@@ -659,8 +657,8 @@ class TestMongoAssetMetadataStorage(TestCase):
         with storebuilder.build(contentstore=None) as (__, store):
             course_key = store.make_course_key("org", "course", "run")
             asset_key = course_key.make_asset_key('asset', 'foo.jpg')
-            self.assertEqual(store.find_asset_metadata(asset_key), None)
-            self.assertEqual(store.get_all_asset_metadata(course_key, 'asset'), [])
+            assert store.find_asset_metadata(asset_key) is None
+            assert store.get_all_asset_metadata(course_key, 'asset') == []
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_copy_all_assets_same_modulestore(self, storebuilder):
@@ -671,16 +669,16 @@ class TestMongoAssetMetadataStorage(TestCase):
             course1 = CourseFactory.create(modulestore=store)
             course2 = CourseFactory.create(modulestore=store)
             self.setup_assets(course1.id, None, store)
-            self.assertEqual(len(store.get_all_asset_metadata(course1.id, 'asset')), 2)
-            self.assertEqual(len(store.get_all_asset_metadata(course2.id, 'asset')), 0)
+            assert len(store.get_all_asset_metadata(course1.id, 'asset')) == 2
+            assert len(store.get_all_asset_metadata(course2.id, 'asset')) == 0
             store.copy_all_asset_metadata(course1.id, course2.id, ModuleStoreEnum.UserID.test * 101)
-            self.assertEqual(len(store.get_all_asset_metadata(course1.id, 'asset')), 2)
+            assert len(store.get_all_asset_metadata(course1.id, 'asset')) == 2
             all_assets = store.get_all_asset_metadata(
                 course2.id, 'asset', sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(all_assets), 2)
-            self.assertEqual(all_assets[0].asset_id.path, 'pic1.jpg')
-            self.assertEqual(all_assets[1].asset_id.path, 'shout.ogg')
+            assert len(all_assets) == 2
+            assert all_assets[0].asset_id.path == 'pic1.jpg'
+            assert all_assets[1].asset_id.path == 'shout.ogg'
 
     @ddt.data(*MODULESTORE_SETUPS)
     def test_copy_all_assets_from_course_with_no_assets(self, storebuilder):
@@ -691,12 +689,12 @@ class TestMongoAssetMetadataStorage(TestCase):
             course1 = CourseFactory.create(modulestore=store)
             course2 = CourseFactory.create(modulestore=store)
             store.copy_all_asset_metadata(course1.id, course2.id, ModuleStoreEnum.UserID.test * 101)
-            self.assertEqual(len(store.get_all_asset_metadata(course1.id, 'asset')), 0)
-            self.assertEqual(len(store.get_all_asset_metadata(course2.id, 'asset')), 0)
+            assert len(store.get_all_asset_metadata(course1.id, 'asset')) == 0
+            assert len(store.get_all_asset_metadata(course2.id, 'asset')) == 0
             all_assets = store.get_all_asset_metadata(
                 course2.id, 'asset', sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(all_assets), 0)
+            assert len(all_assets) == 0
 
     @ddt.data(
         ('mongo', 'split'),
@@ -714,12 +712,12 @@ class TestMongoAssetMetadataStorage(TestCase):
             with mixed_store.default_store(to_store):
                 course2 = CourseFactory.create(modulestore=mixed_store)
             self.setup_assets(course1.id, None, mixed_store)
-            self.assertEqual(len(mixed_store.get_all_asset_metadata(course1.id, 'asset')), 2)
-            self.assertEqual(len(mixed_store.get_all_asset_metadata(course2.id, 'asset')), 0)
+            assert len(mixed_store.get_all_asset_metadata(course1.id, 'asset')) == 2
+            assert len(mixed_store.get_all_asset_metadata(course2.id, 'asset')) == 0
             mixed_store.copy_all_asset_metadata(course1.id, course2.id, ModuleStoreEnum.UserID.test * 102)
             all_assets = mixed_store.get_all_asset_metadata(
                 course2.id, 'asset', sort=('displayname', ModuleStoreEnum.SortOrder.ascending)
             )
-            self.assertEqual(len(all_assets), 2)
-            self.assertEqual(all_assets[0].asset_id.path, 'pic1.jpg')
-            self.assertEqual(all_assets[1].asset_id.path, 'shout.ogg')
+            assert len(all_assets) == 2
+            assert all_assets[0].asset_id.path == 'pic1.jpg'
+            assert all_assets[1].asset_id.path == 'shout.ogg'
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_contentstore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_contentstore.py
index 44ad9f2f64a755a861d649dcc00e068dcfaafbdb..3b78556bd8e5da31e6ce358b3d9d21b5d33aeaa5 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_contentstore.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_contentstore.py
@@ -10,6 +10,7 @@ import unittest
 from tempfile import mkdtemp
 from uuid import uuid4
 
+import pytest
 import ddt
 import path
 from opaque_keys.edx.keys import AssetKey
@@ -101,7 +102,7 @@ class TestContentstore(unittest.TestCase):
         asset_key = self.course1_key.make_asset_key('asset', self.course1_files[0])
         self.contentstore.delete(asset_key)
 
-        with self.assertRaises(NotFoundError):
+        with pytest.raises(NotFoundError):
             self.contentstore.find(asset_key)
 
         # ensure deleting a non-existent file is a noop
@@ -114,17 +115,15 @@ class TestContentstore(unittest.TestCase):
         """
         self.set_up_assets(deprecated)
         asset_key = self.course1_key.make_asset_key('asset', self.course1_files[0])
-        self.assertIsNotNone(self.contentstore.find(asset_key), "Could not find {}".format(asset_key))
+        assert self.contentstore.find(asset_key) is not None, 'Could not find {}'.format(asset_key)
 
-        self.assertIsNotNone(self.contentstore.find(asset_key, as_stream=True), "Could not find {}".format(asset_key))
+        assert self.contentstore.find(asset_key, as_stream=True) is not None, 'Could not find {}'.format(asset_key)
 
         unknown_asset = self.course1_key.make_asset_key('asset', 'no_such_file.gif')
-        with self.assertRaises(NotFoundError):
+        with pytest.raises(NotFoundError):
             self.contentstore.find(unknown_asset)
-        self.assertIsNone(
-            self.contentstore.find(unknown_asset, throw_on_not_found=False),
-            "Found unknown asset {}".format(unknown_asset)
-        )
+        assert self.contentstore.find(unknown_asset, throw_on_not_found=False) is None,\
+            f'Found unknown asset {unknown_asset}'
 
     @ddt.data(True, False)
     def test_export_for_course(self, deprecated):
@@ -140,11 +139,11 @@ class TestContentstore(unittest.TestCase):
             )
             for filename in self.course1_files:
                 filepath = path.Path(root_dir / filename)
-                self.assertTrue(filepath.isfile(), "{} is not a file".format(filepath))
+                assert filepath.isfile(), '{} is not a file'.format(filepath)
             for filename in self.course2_files:
                 if filename not in self.course1_files:
                     filepath = path.Path(root_dir / filename)
-                    self.assertFalse(filepath.isfile(), "{} is unexpected exported a file".format(filepath))
+                    assert not filepath.isfile(), '{} is unexpected exported a file'.format(filepath)
         finally:
             shutil.rmtree(root_dir)
 
@@ -155,18 +154,18 @@ class TestContentstore(unittest.TestCase):
         """
         self.set_up_assets(deprecated)
         course1_assets, count = self.contentstore.get_all_content_for_course(self.course1_key)
-        self.assertEqual(count, len(self.course1_files), course1_assets)
+        assert count == len(self.course1_files), course1_assets
         for asset in course1_assets:
             parsed = AssetKey.from_string(asset['filename'])
-            self.assertIn(parsed.block_id, self.course1_files)
+            assert parsed.block_id in self.course1_files
 
         course1_assets, __ = self.contentstore.get_all_content_for_course(self.course1_key, 1, 1)
-        self.assertEqual(len(course1_assets), 1, course1_assets)
+        assert len(course1_assets) == 1, course1_assets
 
         fake_course = CourseLocator('test', 'fake', 'non')
         course_assets, count = self.contentstore.get_all_content_for_course(fake_course)
-        self.assertEqual(count, 0)
-        self.assertEqual(course_assets, [])
+        assert count == 0
+        assert course_assets == []
 
     @ddt.data(True, False)
     def test_attrs(self, deprecated):
@@ -178,7 +177,7 @@ class TestContentstore(unittest.TestCase):
             asset_key = self.course1_key.make_asset_key('asset', filename)
             prelocked = self.contentstore.get_attr(asset_key, 'locked', False)
             self.contentstore.set_attr(asset_key, 'locked', not prelocked)
-            self.assertEqual(self.contentstore.get_attr(asset_key, 'locked', False), not prelocked)
+            assert self.contentstore.get_attr(asset_key, 'locked', False) == (not prelocked)
 
     @ddt.data(True, False)
     def test_copy_assets(self, deprecated):
@@ -194,10 +193,10 @@ class TestContentstore(unittest.TestCase):
             source = self.contentstore.find(asset_key)
             copied = self.contentstore.find(dest_key)
             for propname in ['name', 'content_type', 'length', 'locked']:
-                self.assertEqual(getattr(source, propname), getattr(copied, propname))
+                assert getattr(source, propname) == getattr(copied, propname)
 
         __, count = self.contentstore.get_all_content_for_course(dest_course)
-        self.assertEqual(count, len(self.course1_files))
+        assert count == len(self.course1_files)
 
     @ddt.data(True, False)
     def test_copy_assets_with_duplicates(self, deprecated):
@@ -209,7 +208,7 @@ class TestContentstore(unittest.TestCase):
         self.contentstore.copy_all_course_assets(self.course1_key, dest_course)
 
         __, count = self.contentstore.get_all_content_for_course(dest_course)
-        self.assertEqual(count, 5)
+        assert count == 5
 
     @ddt.data(True, False)
     def test_delete_assets(self, deprecated):
@@ -219,7 +218,7 @@ class TestContentstore(unittest.TestCase):
         self.set_up_assets(deprecated)
         self.contentstore.delete_all_course_assets(self.course1_key)
         __, count = self.contentstore.get_all_content_for_course(self.course1_key)
-        self.assertEqual(count, 0)
+        assert count == 0
         # ensure it didn't remove any from other course
         __, count = self.contentstore.get_all_content_for_course(self.course2_key)
-        self.assertEqual(count, len(self.course2_files))
+        assert count == len(self.course2_files)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_cross_modulestore_import_export.py b/common/lib/xmodule/xmodule/modulestore/tests/test_cross_modulestore_import_export.py
index 989dba15b3279bd59c763c95f6154fa455d61828..f44516b02db7bf7fddf85476c6ace29f6831a4f2 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_cross_modulestore_import_export.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_cross_modulestore_import_export.py
@@ -188,12 +188,12 @@ class CrossStoreXMLRoundtrip(CourseComparisonTest, PartitionTestCase):
 
                         source_course = source_store.get_course(source_course_key, depth=None, lazy=False)  # lint-amnesty, pylint: disable=no-member
 
-                        self.assertEqual(source_course.url_name, 'course')
+                        assert source_course.url_name == 'course'
 
                         export_dir_path = path(self.export_dir)
                         policy_dir = export_dir_path / 'exported_source_course' / 'policies' / source_course_key.run
                         policy_path = policy_dir / 'policy.json'
-                        self.assertTrue(os.path.exists(policy_path))
+                        assert os.path.exists(policy_path)
 
                         import_course_from_xml(
                             dest_store,
@@ -208,4 +208,4 @@ class CrossStoreXMLRoundtrip(CourseComparisonTest, PartitionTestCase):
 
                         dest_course = dest_store.get_course(dest_course_key, depth=None, lazy=False)  # lint-amnesty, pylint: disable=no-member
 
-                        self.assertEqual(dest_course.url_name, 'course')
+                        assert dest_course.url_name == 'course'
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_inheritance.py b/common/lib/xmodule/xmodule/modulestore/tests/test_inheritance.py
index 24234473cef6dd62b43a2487fb7e044cfedea31d..3a1e27972c2e188068458e0d202d058dcb2a1768 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_inheritance.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_inheritance.py
@@ -64,4 +64,4 @@ class TestInheritanceMixin(unittest.TestCase):
         confirm if the submission deadline has passed or not.
         """
         self.add_submission_deadline_information(due_date, graceperiod, self_paced)
-        self.assertEqual(is_past_deadline, self.xblock.has_deadline_passed())
+        assert is_past_deadline == self.xblock.has_deadline_passed()
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_libraries.py b/common/lib/xmodule/xmodule/modulestore/tests/test_libraries.py
index 72c0e35fa4839b23ee6849e655f7d1e36ea9b3cf..0ea137fc94ed9bd7f24532543c7e35abb5e09841 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_libraries.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_libraries.py
@@ -5,7 +5,7 @@ Basic unit tests related to content libraries.
 Higher-level tests are in `cms/djangoapps/contentstore`.
 """
 
-
+import pytest
 import ddt
 import six
 from bson.objectid import ObjectId
@@ -45,7 +45,7 @@ class TestLibraries(MixedSplitTestCase):
         """
         org, lib_code = ('DuplicateX', "DUP")
         LibraryFactory.create(org=org, library=lib_code, modulestore=self.store)
-        with self.assertRaises(DuplicateCourseError):
+        with pytest.raises(DuplicateCourseError):
             LibraryFactory.create(org=org, library=lib_code, modulestore=self.store)
 
     @ddt.data(
@@ -57,9 +57,9 @@ class TestLibraries(MixedSplitTestCase):
         Test __unicode__() and __str__() methods of libraries
         """
         library = LibraryFactory.create(metadata={"display_name": name}, modulestore=self.store)
-        self.assertIn(name, six.text_type(library))
+        assert name in six.text_type(library)
         if not isinstance(name, six.text_type):
-            self.assertIn(name, str(library))
+            assert name in str(library)
 
     def test_display_with_default_methods(self):
         """
@@ -69,8 +69,8 @@ class TestLibraries(MixedSplitTestCase):
         org = 'TestOrgX'
         lib_code = 'LC101'
         library = LibraryFactory.create(org=org, library=lib_code, modulestore=self.store)
-        self.assertEqual(library.display_org_with_default, org)
-        self.assertEqual(library.display_number_with_default, lib_code)
+        assert library.display_org_with_default == org
+        assert library.display_number_with_default == lib_code
 
     def test_block_with_children(self):
         """
@@ -94,7 +94,7 @@ class TestLibraries(MixedSplitTestCase):
             metadata={"data": "Hello world", },
             modulestore=self.store,
         )
-        self.assertEqual(child_block.parent.replace(version_guid=None, branch=None), vert_block.location)
+        assert child_block.parent.replace(version_guid=None, branch=None) == vert_block.location
 
     def test_update_item(self):
         """
@@ -116,10 +116,10 @@ class TestLibraries(MixedSplitTestCase):
         self.store.update_item(block, self.user_id)
         # Reload block from the modulestore
         block = self.store.get_item(block_key)
-        self.assertEqual(block.data, "NEW")
-        self.assertEqual(block.location, block_key)
+        assert block.data == 'NEW'
+        assert block.location == block_key
         new_version = self.store.get_item(block_key, remove_version=False, remove_branch=False).location.version_guid
-        self.assertNotEqual(old_version, new_version)
+        assert old_version != new_version
 
     def test_delete_item(self):
         """
@@ -135,15 +135,15 @@ class TestLibraries(MixedSplitTestCase):
             modulestore=self.store,
         )
         library = self.store.get_library(lib_key)
-        self.assertEqual(len(library.children), 1)
+        assert len(library.children) == 1
         self.store.delete_item(block.location, self.user_id)
         library = self.store.get_library(lib_key)
-        self.assertEqual(len(library.children), 0)
+        assert len(library.children) == 0
 
     def test_get_library_non_existent(self):
         """ Test get_library() with non-existent key """
         result = self.store.get_library(LibraryLocator("non", "existent"))
-        self.assertEqual(result, None)
+        assert result is None
 
     def test_get_library_keys(self):
         """ Test get_library_keys() """
@@ -159,9 +159,9 @@ class TestLibraries(MixedSplitTestCase):
 
         lib_list = self.store.get_libraries()
 
-        self.assertEqual(len(lib_list), len(libraries))
+        assert len(lib_list) == len(libraries)
         for lib in lib_list:
-            self.assertIn(lib.location.library_key, lib_dict)
+            assert lib.location.library_key in lib_dict
 
     def test_strip(self):
         """
@@ -172,10 +172,10 @@ class TestLibraries(MixedSplitTestCase):
         lib_key = LibraryFactory.create(modulestore=self.store).location.library_key
         # Re-load the library from the modulestore, explicitly including version information:
         lib = self.store.get_library(lib_key)
-        self.assertEqual(lib.location.version_guid, None)
-        self.assertEqual(lib.location.branch, None)
-        self.assertEqual(lib.location.library_key.version_guid, None)
-        self.assertEqual(lib.location.library_key.branch, None)
+        assert lib.location.version_guid is None
+        assert lib.location.branch is None
+        assert lib.location.library_key.version_guid is None
+        assert lib.location.library_key.branch is None
 
     def test_get_lib_version(self):
         """
@@ -186,7 +186,7 @@ class TestLibraries(MixedSplitTestCase):
         # Re-load the library from the modulestore, explicitly including version information:
         lib = self.store.get_library(lib_key, remove_version=False, remove_branch=False)
         version = lib.location.library_key.version_guid
-        self.assertIsInstance(version, ObjectId)
+        assert isinstance(version, ObjectId)
 
     def test_xblock_in_lib_have_published_version_returns_false(self):
         library = LibraryFactory.create(modulestore=self.store)
@@ -197,4 +197,4 @@ class TestLibraries(MixedSplitTestCase):
             publish_item=False,
             modulestore=self.store,
         )
-        self.assertFalse(self.store.has_published_version(block))
+        assert not self.store.has_published_version(block)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py
index 74c119b051d8a31a7c025fc36f7faedea89c86f8..78529957493551ac65697102542b31dee9ae9de5 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py
@@ -166,7 +166,7 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest):
             if isinstance(self.course.id, CourseLocator):
                 self.course_locations[self.MONGO_COURSEID] = self.course.location
             else:
-                self.assertEqual(self.course.id, course_key)
+                assert self.course.id == course_key
 
             # create chapter
             chapter = self.store.create_child(self.user_id, self.course.location, 'chapter',
@@ -283,7 +283,7 @@ class CommonMixedModuleStoreSetup(CourseComparisonTest):
         ).make_usage_key('vertical', 'fake')
         self._create_course(test_course_key)
 
-        self.assertEqual(default, self.store.get_modulestore_type(self.course.id))
+        assert default == self.store.get_modulestore_type(self.course.id)
 
 
 class AsideFoo(XBlockAside):
@@ -328,13 +328,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         Make sure we get back the store type we expect for given mappings
         """
         self.initdb(default_ms)
-        self.assertEqual(self.store.get_modulestore_type(
-            self._course_key_from_string(self.MONGO_COURSEID)), default_ms
-        )
+        assert self.store.get_modulestore_type(self._course_key_from_string(self.MONGO_COURSEID)) == default_ms
         # try an unknown mapping, it should be the 'default' store
-        self.assertEqual(self.store.get_modulestore_type(
-            CourseKey.from_string('foo/bar/2012_Fall')), default_ms
-        )
+        assert self.store.get_modulestore_type(CourseKey.from_string('foo/bar/2012_Fall')) == default_ms
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_get_modulestore_cache(self, default_ms):
@@ -346,9 +342,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.mappings = {}
         course_key = self.course_locations[self.MONGO_COURSEID].course_key
         with check_exact_number_of_calls(self.store.default_modulestore, 'has_course', 1):
-            self.assertEqual(self.store.default_modulestore, self.store._get_modulestore_for_courselike(course_key))  # pylint: disable=protected-access
-            self.assertIn(course_key, self.store.mappings)
-            self.assertEqual(self.store.default_modulestore, self.store._get_modulestore_for_courselike(course_key))  # pylint: disable=protected-access
+            assert self.store.default_modulestore == self.store._get_modulestore_for_courselike(course_key)  # pylint: disable=protected-access, line-too-long
+            assert course_key in self.store.mappings
+            assert self.store.default_modulestore == self.store._get_modulestore_for_courselike(course_key)  # pylint: disable=protected-access, line-too-long
 
     @ddt.data(*itertools.product(
         (ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split),
@@ -364,7 +360,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.store.create_course('org_x', 'course_y', 'run_z', self.user_id)
             if reset_mixed_mappings:
                 self.store.mappings = {}
-            with self.assertRaises(DuplicateCourseError):
+            with pytest.raises(DuplicateCourseError):
                 self.store.create_course('org_x', 'course_y', 'run_z', self.user_id)
 
     @ddt.data(ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.mongo)
@@ -376,7 +372,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         with self.store.default_store(default_store):
             self.store.create_course('org_x', 'course_y', 'run_z', self.user_id)
 
-            with self.assertRaises(DuplicateCourseError):
+            with pytest.raises(DuplicateCourseError):
                 self.store.create_course('ORG_X', 'COURSE_Y', 'RUN_Z', self.user_id)
 
     # Draft:
@@ -390,14 +386,14 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self._create_block_hierarchy()
 
         with check_mongo_calls(max_find.pop(0), max_send):
-            self.assertTrue(self.store.has_item(self.problem_x1a_1))  # lint-amnesty, pylint: disable=no-member
+            assert self.store.has_item(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
 
         # try negative cases
         with check_mongo_calls(max_find.pop(0), max_send):
-            self.assertFalse(self.store.has_item(self.fake_location))
+            assert not self.store.has_item(self.fake_location)
 
         # verify that an error is raised when the revision is not valid
-        with self.assertRaises(UnsupportedRevisionError):
+        with pytest.raises(UnsupportedRevisionError):
             self.store.has_item(self.fake_location, revision=ModuleStoreEnum.RevisionOption.draft_preferred)
 
     # draft queries:
@@ -413,15 +409,15 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self._create_block_hierarchy()
 
         with check_mongo_calls(max_find.pop(0), max_send):
-            self.assertIsNotNone(self.store.get_item(self.problem_x1a_1))  # lint-amnesty, pylint: disable=no-member
+            assert self.store.get_item(self.problem_x1a_1) is not None  # lint-amnesty, pylint: disable=no-member
 
         # try negative cases
         with check_mongo_calls(max_find.pop(0), max_send):
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 self.store.get_item(self.fake_location)
 
         # verify that an error is raised when the revision is not valid
-        with self.assertRaises(UnsupportedRevisionError):
+        with pytest.raises(UnsupportedRevisionError):
             self.store.get_item(self.fake_location, revision=ModuleStoreEnum.RevisionOption.draft_preferred)
 
     # Draft:
@@ -437,10 +433,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         course_locn = self.course_locations[self.MONGO_COURSEID]
         with check_mongo_calls(max_find, max_send):
             modules = self.store.get_items(course_locn.course_key, qualifiers={'category': 'problem'})
-        self.assertEqual(len(modules), 6)
+        assert len(modules) == 6
 
         # verify that an error is raised when the revision is not valid
-        with self.assertRaises(UnsupportedRevisionError):
+        with pytest.raises(UnsupportedRevisionError):
             self.store.get_items(
                 self.course_locations[self.MONGO_COURSEID].course_key,
                 revision=ModuleStoreEnum.RevisionOption.draft_preferred
@@ -455,19 +451,19 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         course_version = course.course_version
 
         if default_ms == ModuleStoreEnum.Type.split:
-            self.assertIsNotNone(course_version)
+            assert course_version is not None
         else:
-            self.assertIsNone(course_version)
+            assert course_version is None
 
         blocks = self.store.get_items(self.course.id, qualifiers={'category': 'problem'})
         blocks.append(self.store.get_item(self.problem_x1a_1))  # lint-amnesty, pylint: disable=no-member
-        self.assertEqual(len(blocks), 7)
+        assert len(blocks) == 7
         for block in blocks:
-            self.assertEqual(block.course_version, course_version)
+            assert block.course_version == course_version
             # ensure that when the block is retrieved from the runtime cache,
             # the course version is still present
             cached_block = course.runtime.load_item(block.location)
-            self.assertEqual(cached_block.course_version, block.course_version)
+            assert cached_block.course_version == block.course_version
 
     @ddt.data((ModuleStoreEnum.Type.split, 2, False), (ModuleStoreEnum.Type.mongo, 3, True))
     @ddt.unpack
@@ -496,17 +492,15 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         items = self.store.get_items(course_key)
         # Check items found are either course or about type
-        self.assertTrue(set(['course', 'about']).issubset(set([item.location.block_type for item in items])))  # lint-amnesty, pylint: disable=consider-using-set-comprehension
+        assert set(['course', 'about']).issubset(set([item.location.block_type for item in items]))  # pylint: disable=consider-using-set-comprehension, line-too-long
         # Assert that about is a detached category found in get_items
-        self.assertIn(
-            [item.location.block_type for item in items if item.location.block_type == 'about'][0],
-            DETACHED_XBLOCK_TYPES
-        )
-        self.assertEqual(len(items), 2)
+        assert [item.location.block_type for item in items if item.location.block_type == 'about'][0]\
+               in DETACHED_XBLOCK_TYPES
+        assert len(items) == 2
 
         # Check that orphans are not found
         orphans = self.store.get_orphans(course_key)
-        self.assertEqual(len(orphans), 0)
+        assert len(orphans) == 0
 
         # Add an orphan to test course
         orphan = course_key.make_usage_key('chapter', 'OrphanChapter')
@@ -514,22 +508,22 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Check that now an orphan is found
         orphans = self.store.get_orphans(course_key)
-        self.assertIn(orphan, orphans)
-        self.assertEqual(len(orphans), 1)
+        assert orphan in orphans
+        assert len(orphans) == 1
 
         # Check now `get_items` retrieves an extra item added above which is an orphan.
         items = self.store.get_items(course_key)
-        self.assertIn(orphan, [item.location for item in items])
-        self.assertEqual(len(items), 3)
+        assert orphan in [item.location for item in items]
+        assert len(items) == 3
 
         # Check now `get_items` with `include_orphans` kwarg does not retrieves an orphan block.
         items_in_tree = self.store.get_items(course_key, include_orphans=False)
 
         # Check that course and about blocks are found in get_items
-        self.assertTrue(set(['course', 'about']).issubset(set([item.location.block_type for item in items_in_tree])))  # lint-amnesty, pylint: disable=consider-using-set-comprehension
+        assert set(['course', 'about']).issubset({item.location.block_type for item in items_in_tree})
         # Check orphan is found or not - this is based on mongo/split modulestore. It should be found in mongo.
-        self.assertEqual(orphan in [item.location for item in items_in_tree], orphan_in_items)
-        self.assertEqual(len(items_in_tree), expected_items_in_tree)
+        assert (orphan in [item.location for item in items_in_tree]) == orphan_in_items
+        assert len(items_in_tree) == expected_items_in_tree
 
     # draft: get draft, get ancestors up to course (2-6), compute inheritance
     #    sends: update problem and then each ancestor up to course (edit info)
@@ -545,12 +539,12 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self._create_block_hierarchy()
         problem = self.store.get_item(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
         # if following raised, then the test is really a noop, change it
-        self.assertNotEqual(problem.max_attempts, 2, "Default changed making test meaningless")
+        assert problem.max_attempts != 2, 'Default changed making test meaningless'
         problem.max_attempts = 2
         with check_mongo_calls(max_find, max_send):
             problem = self.store.update_item(problem, self.user_id)
 
-        self.assertEqual(problem.max_attempts, 2, "Update didn't persist")
+        assert problem.max_attempts == 2, "Update didn't persist"
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_has_changes_direct_only(self, default_ms):
@@ -570,8 +564,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # Check that neither xblock has changes
-        self.assertFalse(self.store.has_changes(test_course))
-        self.assertFalse(self.store.has_changes(chapter))
+        assert not self.store.has_changes(test_course)
+        assert not self.store.has_changes(chapter)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_has_changes(self, default_ms):
@@ -591,22 +585,22 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # Not yet published, so changes are present
-        self.assertTrue(self.store.has_changes(xblock))
+        assert self.store.has_changes(xblock)
 
         # Publish and verify that there are no unpublished changes
         newXBlock = self.store.publish(xblock.location, self.user_id)
-        self.assertFalse(self.store.has_changes(newXBlock))
+        assert not self.store.has_changes(newXBlock)
 
         # Change the component, then check that there now are changes
         component = self.store.get_item(xblock.location)
         component.display_name = 'Changed Display Name'
 
         component = self.store.update_item(component, self.user_id)
-        self.assertTrue(self.store.has_changes(component))
+        assert self.store.has_changes(component)
 
         # Publish and verify again
         component = self.store.publish(component.location, self.user_id)
-        self.assertFalse(self.store.has_changes(component))
+        assert not self.store.has_changes(component)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_unit_stuck_in_draft_mode(self, default_ms):
@@ -626,19 +620,19 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # Not yet published, so changes are present
-        self.assertTrue(self.store.has_changes(xblock))
+        assert self.store.has_changes(xblock)
 
         # Publish and verify that there are no unpublished changes
         component = self.store.publish(xblock.location, self.user_id)
-        self.assertFalse(self.store.has_changes(component))
+        assert not self.store.has_changes(component)
 
         self.store.revert_to_published(component.location, self.user_id)
         component = self.store.get_item(component.location)
-        self.assertFalse(self.store.has_changes(component))
+        assert not self.store.has_changes(component)
 
         # Publish and verify again
         component = self.store.publish(component.location, self.user_id)
-        self.assertFalse(self.store.has_changes(component))
+        assert not self.store.has_changes(component)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_unit_stuck_in_published_mode(self, default_ms):
@@ -658,16 +652,16 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # Not yet published, so changes are present
-        self.assertTrue(self.store.has_changes(xblock))
+        assert self.store.has_changes(xblock)
 
         # Publish and verify that there are no unpublished changes
         component = self.store.publish(xblock.location, self.user_id)
-        self.assertFalse(self.store.has_changes(component))
+        assert not self.store.has_changes(component)
 
         # Discard changes and verify that there are no changes
         self.store.revert_to_published(component.location, self.user_id)
         component = self.store.get_item(component.location)
-        self.assertFalse(self.store.has_changes(component))
+        assert not self.store.has_changes(component)
 
         # Change the component, then check that there now are changes
         component = self.store.get_item(component.location)
@@ -675,7 +669,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(component, self.user_id)
 
         # Verify that changes are present
-        self.assertTrue(self.store.has_changes(component))
+        assert self.store.has_changes(component)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_unit_stuck_in_published_mode_after_delete(self, default_ms):
@@ -703,22 +697,22 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # publish vertical changes
         self.store.publish(vertical.location, self.user_id)
-        self.assertFalse(self._has_changes(vertical.location))
+        assert not self._has_changes(vertical.location)
 
         # Change a component, then check that there now are changes
         component = self.store.get_item(component.location)
         component.display_name = 'Changed Display Name'
         self.store.update_item(component, self.user_id)
-        self.assertTrue(self._has_changes(vertical.location))
+        assert self._has_changes(vertical.location)
 
         # Discard changes and verify that there are no changes
         self.store.revert_to_published(vertical.location, self.user_id)
-        self.assertFalse(self._has_changes(vertical.location))
+        assert not self._has_changes(vertical.location)
 
         # Delete the component and verify that the unit has changes
         self.store.delete_item(component.location, self.user_id)
         vertical = self.store.get_item(vertical.location)
-        self.assertTrue(self._has_changes(vertical.location))
+        assert self._has_changes(vertical.location)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_publish_automatically_after_delete_unit(self, default_ms):
@@ -735,11 +729,11 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # publish sequential changes
         self.store.publish(sequential.location, self.user_id)
-        self.assertFalse(self._has_changes(sequential.location))
+        assert not self._has_changes(sequential.location)
 
         # delete vertical and check sequential has no changes
         self.store.delete_item(vertical.location, self.user_id)
-        self.assertFalse(self._has_changes(sequential.location))
+        assert not self._has_changes(sequential.location)
 
     def setup_has_changes(self, default_ms):
         """
@@ -772,7 +766,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Verify that there are no unpublished changes
         for key in locations:
-            self.assertFalse(self._has_changes(locations[key]))
+            assert not self._has_changes(locations[key])
 
         # Change the child
         child = self.store.get_item(locations['child'])
@@ -780,18 +774,18 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(child, self.user_id)
 
         # All ancestors should have changes, but not siblings
-        self.assertTrue(self._has_changes(locations['grandparent']))
-        self.assertTrue(self._has_changes(locations['parent']))
-        self.assertTrue(self._has_changes(locations['child']))
-        self.assertFalse(self._has_changes(locations['parent_sibling']))
-        self.assertFalse(self._has_changes(locations['child_sibling']))
+        assert self._has_changes(locations['grandparent'])
+        assert self._has_changes(locations['parent'])
+        assert self._has_changes(locations['child'])
+        assert not self._has_changes(locations['parent_sibling'])
+        assert not self._has_changes(locations['child_sibling'])
 
         # Publish the unit with changes
         self.store.publish(locations['parent'], self.user_id)
 
         # Verify that there are no unpublished changes
         for key in locations:
-            self.assertFalse(self._has_changes(locations[key]))
+            assert not self._has_changes(locations[key])
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_has_changes_publish_ancestors(self, default_ms):
@@ -802,7 +796,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Verify that there are no unpublished changes
         for key in locations:
-            self.assertFalse(self._has_changes(locations[key]))
+            assert not self._has_changes(locations[key])
 
         # Change both children
         child = self.store.get_item(locations['child'])
@@ -813,22 +807,22 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(child_sibling, user_id=self.user_id)
 
         # Verify that ancestors have changes
-        self.assertTrue(self._has_changes(locations['grandparent']))
-        self.assertTrue(self._has_changes(locations['parent']))
+        assert self._has_changes(locations['grandparent'])
+        assert self._has_changes(locations['parent'])
 
         # Publish one child
         self.store.publish(locations['child_sibling'], self.user_id)
 
         # Verify that ancestors still have changes
-        self.assertTrue(self._has_changes(locations['grandparent']))
-        self.assertTrue(self._has_changes(locations['parent']))
+        assert self._has_changes(locations['grandparent'])
+        assert self._has_changes(locations['parent'])
 
         # Publish the other child
         self.store.publish(locations['child'], self.user_id)
 
         # Verify that ancestors now have no changes
-        self.assertFalse(self._has_changes(locations['grandparent']))
-        self.assertFalse(self._has_changes(locations['parent']))
+        assert not self._has_changes(locations['grandparent'])
+        assert not self._has_changes(locations['parent'])
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_has_changes_add_remove_child(self, default_ms):
@@ -839,8 +833,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         locations = self.setup_has_changes(default_ms)
 
         # Test that the ancestors don't have changes
-        self.assertFalse(self._has_changes(locations['grandparent']))
-        self.assertFalse(self._has_changes(locations['parent']))
+        assert not self._has_changes(locations['grandparent'])
+        assert not self._has_changes(locations['parent'])
 
         # Create a new child and attach it to parent
         self.store.create_child(
@@ -851,8 +845,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # Verify that the ancestors now have changes
-        self.assertTrue(self._has_changes(locations['grandparent']))
-        self.assertTrue(self._has_changes(locations['parent']))
+        assert self._has_changes(locations['grandparent'])
+        assert self._has_changes(locations['parent'])
 
         # Remove the child from the parent
         parent = self.store.get_item(locations['parent'])
@@ -860,8 +854,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(parent, user_id=self.user_id)
 
         # Verify that ancestors now have no changes
-        self.assertFalse(self._has_changes(locations['grandparent']))
-        self.assertFalse(self._has_changes(locations['parent']))
+        assert not self._has_changes(locations['grandparent'])
+        assert not self._has_changes(locations['parent'])
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_has_changes_non_direct_only_children(self, default_ms):
@@ -885,16 +879,16 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.publish(parent.location, self.user_id)
 
         # Verify that there are no changes
-        self.assertFalse(self._has_changes(parent.location))
-        self.assertFalse(self._has_changes(child.location))
+        assert not self._has_changes(parent.location)
+        assert not self._has_changes(child.location)
 
         # Change the child
         child.display_name = 'Changed Display Name'
         self.store.update_item(child, user_id=self.user_id)
 
         # Verify that both parent and child have changes
-        self.assertTrue(self._has_changes(parent.location))
-        self.assertTrue(self._has_changes(child.location))
+        assert self._has_changes(parent.location)
+        assert self._has_changes(child.location)
 
     @ddt.data(*itertools.product(
         (ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split),
@@ -919,7 +913,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             parent = self.store.update_item(parent, self.user_id)
 
             # Check the parent for changes should return True and not throw an exception
-            self.assertTrue(self.store.has_changes(parent))
+            assert self.store.has_changes(parent)
 
     # Draft
     #   Find: find parents (definition.children query), get parent, get course (fill in run?),
@@ -944,10 +938,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
                 self.store.delete_item(self.writable_chapter_location, self.user_id)
 
             # verify it's gone
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 self.store.get_item(self.writable_chapter_location)
         # verify it's gone from published too
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             self.store.get_item(self.writable_chapter_location, revision=ModuleStoreEnum.RevisionOption.published_only)
 
     # Draft:
@@ -984,10 +978,10 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             vert_loc = private_vert.location.for_version(private_leaf.location.version_guid)
         else:
             vert_loc = private_vert.location
-        self.assertTrue(self.store.has_item(vert_loc))
-        self.assertTrue(self.store.has_item(private_leaf.location))
+        assert self.store.has_item(vert_loc)
+        assert self.store.has_item(private_leaf.location)
         course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key, 0)
-        self.assertIn(vert_loc, course.children)
+        assert vert_loc in course.children
 
         # delete the vertical and ensure the course no longer points to it
         with check_mongo_calls(max_find, max_send):
@@ -1000,9 +994,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         else:
             vert_loc = private_vert.location
             leaf_loc = private_leaf.location
-        self.assertFalse(self.store.has_item(vert_loc))
-        self.assertFalse(self.store.has_item(leaf_loc))
-        self.assertNotIn(vert_loc, course.children)
+        assert not self.store.has_item(vert_loc)
+        assert not self.store.has_item(leaf_loc)
+        assert vert_loc not in course.children
 
     # Draft:
     #   find: find parent (definition.children) 2x, find draft item, get inheritance items
@@ -1029,7 +1023,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # verify that an error is raised when the revision is not valid
-        with self.assertRaises(UnsupportedRevisionError):
+        with pytest.raises(UnsupportedRevisionError):
             self.store.delete_item(
                 private_leaf.location,
                 self.user_id,
@@ -1061,14 +1055,14 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         with check_mongo_calls(max_find, max_send):
             courses = self.store.get_courses()
             course_ids = [course.location for course in courses]
-            self.assertEqual(len(courses), 1, "Not one course: {}".format(course_ids))
-            self.assertIn(self.course_locations[self.MONGO_COURSEID], course_ids)
+            assert len(courses) == 1, 'Not one course: {}'.format(course_ids)
+            assert self.course_locations[self.MONGO_COURSEID] in course_ids
 
         with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
             draft_courses = self.store.get_courses(remove_branch=True)
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
             published_courses = self.store.get_courses(remove_branch=True)
-        self.assertEqual([c.id for c in draft_courses], [c.id for c in published_courses])
+        assert [c.id for c in draft_courses] == [c.id for c in published_courses]
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_create_child_detached_tabs(self, default_ms):
@@ -1078,7 +1072,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         """
         self.initdb(default_ms)
         mongo_course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key)
-        self.assertEqual(len(mongo_course.children), 1)
+        assert len(mongo_course.children) == 1
 
         # create a static tab of the course
         self.store.create_child(
@@ -1089,7 +1083,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # now check that the course has same number of children
         mongo_course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key)
-        self.assertEqual(len(mongo_course.children), 1)
+        assert len(mongo_course.children) == 1
 
     # draft is 2: find out which ms owns course, get item
     # split: active_versions, structure, definition (to load course wiki string)
@@ -1103,7 +1097,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.initdb(default_ms)
         with check_mongo_calls(max_find, max_send):
             course = self.store.get_item(self.course_locations[self.MONGO_COURSEID])
-            self.assertEqual(course.id, self.course_locations[self.MONGO_COURSEID].course_key)
+            assert course.id == self.course_locations[self.MONGO_COURSEID].course_key
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_get_library(self, default_ms):
@@ -1116,15 +1110,15 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         with self.store.default_store(ModuleStoreEnum.Type.split):  # The CMS also wraps create_library like this
             library = self.store.create_library("org", "lib", self.user_id, {"display_name": "Test Library"})
         library_key = library.location.library_key
-        self.assertIsInstance(library_key, LibraryLocator)
+        assert isinstance(library_key, LibraryLocator)
         # Now load with get_library and make sure it works:
         library = self.store.get_library(library_key)
-        self.assertEqual(library.location.library_key, library_key)
+        assert library.location.library_key == library_key
 
         # Clear the mappings so we can test get_library code path without mapping set:
         self.store.mappings.clear()
         library = self.store.get_library(library_key)
-        self.assertEqual(library.location.library_key, library_key)
+        assert library.location.library_key == library_key
 
     # notice this doesn't test getting a public item via draft_preferred which draft would have 2 hits (split
     # still only 2)
@@ -1141,17 +1135,14 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         with check_mongo_calls(max_find, max_send):
             parent = self.store.get_parent_location(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-            self.assertEqual(parent, self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
+            assert parent == self.vertical_x1a  # lint-amnesty, pylint: disable=no-member
 
     def verify_get_parent_locations_results(self, expected_results):
         """
         Verifies the results of calling get_parent_locations matches expected_results.
         """
         for child_location, parent_location, revision in expected_results:
-            self.assertEqual(
-                parent_location,
-                self.store.get_parent_location(child_location, revision=revision)
-            )
+            assert parent_location == self.store.get_parent_location(child_location, revision=revision)
 
     def verify_item_parent(self, item_location, expected_parent_location, old_parent_location, is_reverted=False):
         """
@@ -1168,7 +1159,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             old_parent = self.store.get_item(old_parent_location)
             expected_parent = self.store.get_item(expected_parent_location)
 
-            self.assertEqual(expected_parent_location, source_item.get_parent().location)
+            assert expected_parent_location == source_item.get_parent().location
 
             # If an item is reverted, it means it's actual parent was the one that is the current parent now
             # i.e expected_parent_location otherwise old_parent_location.
@@ -1176,9 +1167,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
             # Check parent locations wrt branches
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
-                self.assertEqual(expected_parent_location, self.store.get_item(item_location).get_parent().location)
+                assert expected_parent_location == self.store.get_item(item_location).get_parent().location
             with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-                self.assertEqual(published_parent_location, self.store.get_item(item_location).get_parent().location)
+                assert published_parent_location == self.store.get_item(item_location).get_parent().location
 
             # Make location specific to published branch for verify_get_parent_locations_results call.
             published_parent_location = published_parent_location.for_branch(ModuleStoreEnum.BranchName.published)
@@ -1191,12 +1182,12 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             ])
 
             # Also verify item.parent has correct parent location set.
-            self.assertEqual(source_item.parent, expected_parent_location)
-            self.assertEqual(source_item.parent, self.store.get_parent_location(item_location))
+            assert source_item.parent == expected_parent_location
+            assert source_item.parent == self.store.get_parent_location(item_location)
 
             # Item should be present in new parent's children list but not in old parent's children list.
-            self.assertIn(item_location, expected_parent.children)
-            self.assertNotIn(item_location, old_parent.children)
+            assert item_location in expected_parent.children
+            assert item_location not in old_parent.children
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_update_item_parent(self, store_type):
@@ -1216,7 +1207,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1243,7 +1234,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1280,7 +1271,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1321,7 +1312,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1343,7 +1334,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1376,13 +1367,13 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(problem, self.user_id)
 
         updated_problem = self.store.get_item(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-        self.assertEqual(updated_problem.display_name, 'updated')
+        assert updated_problem.display_name == 'updated'
 
         # Now, move from x1 to y1.
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1395,7 +1386,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Check that problem has the original name back.
         reverted_problem = self.store.get_item(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-        self.assertEqual(orig_display_name, reverted_problem.display_name)
+        assert orig_display_name == reverted_problem.display_name
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_move_1_moved_1_unchanged(self, store_type):
@@ -1420,7 +1411,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1430,8 +1421,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Check that problem_item2 is still present in vertical_x1a
         problem_item2 = self.store.get_item(problem_item2.location)
-        self.assertEqual(problem_item2.parent, self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
-        self.assertIn(problem_item2.location, problem_item2.get_parent().children)
+        assert problem_item2.parent == self.vertical_x1a  # lint-amnesty, pylint: disable=no-member
+        assert problem_item2.location in problem_item2.get_parent().children
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_move_1_moved_1_edited(self, store_type):
@@ -1455,7 +1446,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(problem_item2, self.user_id)
 
         updated_problem2 = self.store.get_item(problem_item2.location)
-        self.assertEqual(updated_problem2.display_name, 'updated')
+        assert updated_problem2.display_name == 'updated'
 
         item_location = self.problem_x1a_1  # lint-amnesty, pylint: disable=no-member
         new_parent_location = self.vertical_y1a  # lint-amnesty, pylint: disable=no-member
@@ -1465,7 +1456,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1478,7 +1469,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Check that problem_item2 has the original name back.
         reverted_problem2 = self.store.get_item(problem_item2.location)
-        self.assertEqual(orig_display_name, reverted_problem2.display_name)
+        assert orig_display_name == reverted_problem2.display_name
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_move_1_moved_1_deleted(self, store_type):
@@ -1509,7 +1500,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_item_location = self.store.update_item_parent(
             item_location, new_parent_location, old_parent_location, self.user_id
         )
-        self.assertEqual(updated_item_location, item_location)
+        assert updated_item_location == item_location
 
         self.verify_item_parent(
             item_location=item_location,
@@ -1522,8 +1513,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # Check that problem_item2 is also back in vertical_x1a
         problem_item2 = self.store.get_item(problem_item2.location)
-        self.assertEqual(problem_item2.parent, self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
-        self.assertIn(problem_item2.location, problem_item2.get_parent().children)
+        assert problem_item2.parent == self.vertical_x1a  # lint-amnesty, pylint: disable=no-member
+        assert problem_item2.location in problem_item2.get_parent().children
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_get_parent_locations_moved_child(self, default_ms):
@@ -1546,7 +1537,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
                 old_parent = self.store.get_item(child_to_move_location).get_parent()
 
-            self.assertEqual(old_parent_location, old_parent.location)
+            assert old_parent_location == old_parent.location
 
             child_to_move_contextualized = child_to_move_location.map_into_course(old_parent.location.course_key)
             old_parent.children.remove(child_to_move_contextualized)
@@ -1557,9 +1548,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.store.update_item(new_parent, self.user_id)
 
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
-                self.assertEqual(new_parent_location, self.store.get_item(child_to_move_location).get_parent().location)
+                assert new_parent_location == self.store.get_item(child_to_move_location).get_parent().location
             with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-                self.assertEqual(old_parent_location, self.store.get_item(child_to_move_location).get_parent().location)
+                assert old_parent_location == self.store.get_item(child_to_move_location).get_parent().location
             old_parent_published_location = old_parent_location.for_branch(ModuleStoreEnum.BranchName.published)
             self.verify_get_parent_locations_results([
                 (child_to_move_location, new_parent_location, None),
@@ -1631,7 +1622,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         # convert first parent (unit) "vertical_x1a" of problem "problem_x1a_1" to draft
         self.store.convert_to_draft(self.vertical_x1a, self.user_id)  # lint-amnesty, pylint: disable=no-member
         item = self.store.get_item(self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
-        self.assertTrue(self.store.has_published_version(item))
+        assert self.store.has_published_version(item)
 
         # now problem "problem_x1a_1" has 3 parents [vertical_x1a (draft),
         # vertical_x1a (published), vertical_x1b (published)]
@@ -1640,7 +1631,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         # problem location revision
         with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred, course_id):
             parent = mongo_store.get_parent_location(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-            self.assertEqual(parent, self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
+            assert parent == self.vertical_x1a  # lint-amnesty, pylint: disable=no-member
 
     # Draft:
     #   Problem path:
@@ -1673,14 +1664,14 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
                 # each iteration has different find count, pop this iter's find count
                 with check_mongo_calls(num_finds.pop(0), num_sends):
                     path = path_to_location(self.store, location)
-                    self.assertEqual(path, expected)
+                    assert path == expected
 
         not_found = (
             course_key.make_usage_key('video', 'WelcomeX'),
             course_key.make_usage_key('course', 'NotHome'),
         )
         for location in not_found:
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 path_to_location(self.store, location)
 
         # Orphaned items should not be found.
@@ -1692,7 +1683,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             block_id=orphan.block_id
         )
 
-        with self.assertRaises(NoPathToItem):
+        with pytest.raises(NoPathToItem):
             path_to_location(self.store, orphan)
 
     def test_navigation_index(self):
@@ -1700,12 +1691,12 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         Make sure that navigation_index correctly parses the various position values that we might get from calls to
         path_to_location
         """
-        self.assertEqual(1, navigation_index("1"))
-        self.assertEqual(10, navigation_index("10"))
-        self.assertEqual(None, navigation_index(None))
-        self.assertEqual(1, navigation_index("1_2"))
-        self.assertEqual(5, navigation_index("5_2"))
-        self.assertEqual(7, navigation_index("7_3_5_6_"))
+        assert 1 == navigation_index('1')
+        assert 10 == navigation_index('10')
+        assert navigation_index(None) is None
+        assert 1 == navigation_index('1_2')
+        assert 5 == navigation_index('5_2')
+        assert 7 == navigation_index('7_3_5_6_')
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_revert_to_published_root_draft(self, default_ms):
@@ -1719,25 +1710,25 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         vertical_children_num = len(vertical.children)
 
         self.store.publish(self.course.location, self.user_id)
-        self.assertFalse(self._has_changes(self.vertical_x1a))  # lint-amnesty, pylint: disable=no-member
+        assert not self._has_changes(self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
 
         # delete leaf problem (will make parent vertical a draft)
         self.store.delete_item(self.problem_x1a_1, self.user_id)  # lint-amnesty, pylint: disable=no-member
-        self.assertTrue(self._has_changes(self.vertical_x1a))  # lint-amnesty, pylint: disable=no-member
+        assert self._has_changes(self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
 
         draft_parent = self.store.get_item(self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
-        self.assertEqual(vertical_children_num - 1, len(draft_parent.children))
+        assert (vertical_children_num - 1) == len(draft_parent.children)
         published_parent = self.store.get_item(
             self.vertical_x1a,  # lint-amnesty, pylint: disable=no-member
             revision=ModuleStoreEnum.RevisionOption.published_only
         )
-        self.assertEqual(vertical_children_num, len(published_parent.children))
+        assert vertical_children_num == len(published_parent.children)
 
         self.store.revert_to_published(self.vertical_x1a, self.user_id)  # lint-amnesty, pylint: disable=no-member
         reverted_parent = self.store.get_item(self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
-        self.assertEqual(vertical_children_num, len(published_parent.children))
+        assert vertical_children_num == len(published_parent.children)
         self.assertBlocksEqualByFields(reverted_parent, published_parent)
-        self.assertFalse(self._has_changes(self.vertical_x1a))  # lint-amnesty, pylint: disable=no-member
+        assert not self._has_changes(self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_revert_to_published_root_published(self, default_ms):
@@ -1757,7 +1748,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.revert_to_published(self.vertical_x1a, self.user_id)  # lint-amnesty, pylint: disable=no-member
 
         reverted_problem = self.store.get_item(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-        self.assertEqual(orig_display_name, reverted_problem.display_name)
+        assert orig_display_name == reverted_problem.display_name
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_revert_to_published_no_draft(self, default_ms):
@@ -1781,7 +1772,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         """
         self.initdb(default_ms)
         self._create_block_hierarchy()
-        with self.assertRaises(InvalidVersionError):
+        with pytest.raises(InvalidVersionError):
             self.store.revert_to_published(self.vertical_x1a, self.user_id)  # lint-amnesty, pylint: disable=no-member
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
@@ -1795,7 +1786,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.revert_to_published(self.sequential_x1, self.user_id)  # lint-amnesty, pylint: disable=no-member
         reverted_parent = self.store.get_item(self.sequential_x1)  # lint-amnesty, pylint: disable=no-member
         # It does not discard the child vertical, even though that child is a draft (with no published version)
-        self.assertEqual(num_children, len(reverted_parent.children))
+        assert num_children == len(reverted_parent.children)
 
     def test_reset_course_to_version(self):
         """
@@ -1943,7 +1934,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         mongo_store = self.store._get_modulestore_for_courselike(course_id)  # pylint: disable=protected-access
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, course_id):
             parent = mongo_store.get_parent_location(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-            self.assertEqual(parent, self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
+            assert parent == self.vertical_x1a  # lint-amnesty, pylint: disable=no-member
 
         # add some published orphans
         orphan_sequential = course_id.make_usage_key('sequential', 'OrphanSequential')
@@ -1959,8 +1950,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.store.publish(location, self.user_id)
 
         found_orphans = mongo_store.get_orphans(course_id)
-        self.assertEqual(set(found_orphans), set(orphan_locations))
-        self.assertEqual(len(set(found_orphans)), 2)
+        assert set(found_orphans) == set(orphan_locations)
+        assert len(set(found_orphans)) == 2
 
         # add orphan vertical and sequential as another parents of problem "problem_x1a_1"
         mongo_store.collection.update_one(
@@ -1975,18 +1966,15 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         # problem "problem_x1a_1" since the two other parents are orphans
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, course_id):
             parent = mongo_store.get_parent_location(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
-            self.assertEqual(parent, self.vertical_x1a)  # lint-amnesty, pylint: disable=no-member
+            assert parent == self.vertical_x1a  # lint-amnesty, pylint: disable=no-member
 
         # now add valid published vertical as another parent of problem
-        mongo_store.collection.update_one(
-            self.sequential_x1.to_deprecated_son('_id.'),  # lint-amnesty, pylint: disable=no-member
-            {'$push': {'definition.children': six.text_type(self.problem_x1a_1)}}  # lint-amnesty, pylint: disable=no-member
-        )
+        mongo_store.collection.update_one(self.sequential_x1.to_deprecated_son('_id.'), {'$push': {'definition.children': six.text_type(self.problem_x1a_1)}})  # lint-amnesty, pylint: disable=no-member, line-too-long
         # now check that "get_parent_location" method of published branch raises "ReferentialIntegrityError" for
         # problem "problem_x1a_1" since it has now 2 valid published parents
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, course_id):
-            self.assertTrue(self.store.has_item(self.problem_x1a_1))  # lint-amnesty, pylint: disable=no-member
-            with self.assertRaises(ReferentialIntegrityError):
+            assert self.store.has_item(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
+            with pytest.raises(ReferentialIntegrityError):
                 self.store.get_parent_location(self.problem_x1a_1)  # lint-amnesty, pylint: disable=no-member
 
     @ddt.data(ModuleStoreEnum.Type.mongo)
@@ -2003,7 +1991,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             block_id='orphan'
         )
         orphans = self.store.get_orphans(self.course_locations[self.MONGO_COURSEID].course_key)
-        self.assertEqual(len(orphans), 0, "unexpected orphans: {}".format(orphans))
+        assert len(orphans) == 0, 'unexpected orphans: {}'.format(orphans)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_create_item_populates_edited_info(self, default_ms):
@@ -2013,8 +2001,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.course.location.course_key,
             'problem'
         )
-        self.assertEqual(self.user_id, block.edited_by)
-        self.assertGreater(datetime.datetime.now(UTC), block.edited_on)
+        assert self.user_id == block.edited_by
+        assert datetime.datetime.now(UTC) > block.edited_on
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_create_item_populates_subtree_edited_info(self, default_ms):
@@ -2024,8 +2012,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.course.location.course_key,
             'problem'
         )
-        self.assertEqual(self.user_id, block.subtree_edited_by)
-        self.assertGreater(datetime.datetime.now(UTC), block.subtree_edited_on)
+        assert self.user_id == block.subtree_edited_by
+        assert datetime.datetime.now(UTC) > block.subtree_edited_on
 
     # Draft: wildcard search of draft and split
     # Split: wildcard search of draft and split
@@ -2039,14 +2027,11 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         # Test Mongo wiki
         with check_mongo_calls(max_find, max_send):
             wiki_courses = self.store.get_courses_for_wiki('999')
-        self.assertEqual(len(wiki_courses), 1)
-        self.assertIn(
-            self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None),  # Branch agnostic
-            wiki_courses
-        )
+        assert len(wiki_courses) == 1
+        assert self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None) in wiki_courses
 
-        self.assertEqual(len(self.store.get_courses_for_wiki('edX.simple.2012_Fall')), 0)
-        self.assertEqual(len(self.store.get_courses_for_wiki('no_such_wiki')), 0)
+        assert len(self.store.get_courses_for_wiki('edX.simple.2012_Fall')) == 0
+        assert len(self.store.get_courses_for_wiki('no_such_wiki')) == 0
 
     # Draft:
     #    Find: find vertical, find children
@@ -2075,13 +2060,13 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.vertical_x1a,  # lint-amnesty, pylint: disable=no-member
             revision=ModuleStoreEnum.RevisionOption.published_only
         )
-        self.assertIsNotNone(published_xblock)
+        assert published_xblock is not None
 
         # unpublish
         with check_mongo_calls(max_find, max_send):
             self.store.unpublish(self.vertical_x1a, self.user_id)  # lint-amnesty, pylint: disable=no-member
 
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             self.store.get_item(
                 self.vertical_x1a,  # lint-amnesty, pylint: disable=no-member
                 revision=ModuleStoreEnum.RevisionOption.published_only
@@ -2092,7 +2077,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.vertical_x1a,  # lint-amnesty, pylint: disable=no-member
             revision=ModuleStoreEnum.RevisionOption.draft_only
         )
-        self.assertIsNotNone(draft_xblock)
+        assert draft_xblock is not None
 
     # Draft: specific query for revision None
     # Split: active_versions, structure
@@ -2109,33 +2094,33 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         item = self.store.create_child(self.user_id, self.writable_chapter_location, 'problem', 'test_compute_publish_state')  # lint-amnesty, pylint: disable=line-too-long
         item_location = item.location
         with check_mongo_calls(max_find, max_send):
-            self.assertFalse(self.store.has_published_version(item))
+            assert not self.store.has_published_version(item)
 
         # Private -> Public
         self.store.publish(item_location, self.user_id)
         item = self.store.get_item(item_location)
-        self.assertTrue(self.store.has_published_version(item))
+        assert self.store.has_published_version(item)
 
         # Public -> Private
         self.store.unpublish(item_location, self.user_id)
         item = self.store.get_item(item_location)
-        self.assertFalse(self.store.has_published_version(item))
+        assert not self.store.has_published_version(item)
 
         # Private -> Public
         self.store.publish(item_location, self.user_id)
         item = self.store.get_item(item_location)
-        self.assertTrue(self.store.has_published_version(item))
+        assert self.store.has_published_version(item)
 
         # Public -> Draft with NO changes
         self.store.convert_to_draft(item_location, self.user_id)
         item = self.store.get_item(item_location)
-        self.assertTrue(self.store.has_published_version(item))
+        assert self.store.has_published_version(item)
 
         # Draft WITH changes
         item.display_name = 'new name'
         item = self.store.update_item(item, self.user_id)
-        self.assertTrue(self.store.has_changes(item))
-        self.assertTrue(self.store.has_published_version(item))
+        assert self.store.has_changes(item)
+        assert self.store.has_published_version(item)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_update_edit_info_ancestors(self, default_ms):
@@ -2152,13 +2137,13 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             """
             node = self.store.get_item(location_key)
             if after:
-                self.assertLess(after, node.edited_on)
-            self.assertLess(node.edited_on, before)
-            self.assertEqual(node.edited_by, edited_by)
+                assert after < node.edited_on
+            assert node.edited_on < before
+            assert node.edited_by == edited_by
             if subtree_after:
-                self.assertLess(subtree_after, node.subtree_edited_on)
-            self.assertLess(node.subtree_edited_on, subtree_before)
-            self.assertEqual(node.subtree_edited_by, subtree_by)
+                assert subtree_after < node.subtree_edited_on
+            assert node.subtree_edited_on < subtree_before
+            assert node.subtree_edited_by == subtree_by
 
         with self.store.bulk_operations(test_course.id):
             # Create a dummy vertical & html to test against
@@ -2230,7 +2215,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         # Store the current edit time and verify that user created the component
-        self.assertEqual(component.edited_by, self.user_id)
+        assert component.edited_by == self.user_id
         old_edited_on = component.edited_on
 
         edit_user = self.user_id - 2
@@ -2240,8 +2225,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_component = self.store.get_item(component.location)
 
         # Verify the ordering of edit times and that dummy_user made the edit
-        self.assertLess(old_edited_on, updated_component.edited_on)
-        self.assertEqual(updated_component.edited_by, edit_user)
+        assert old_edited_on < updated_component.edited_on
+        assert updated_component.edited_by == edit_user
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_update_published_info(self, default_ms):
@@ -2267,15 +2252,15 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         updated_component = self.store.get_item(component.location)
 
         # Verify the time order and that publish_user caused publication
-        self.assertLessEqual(old_time, updated_component.published_on)
-        self.assertEqual(updated_component.published_by, publish_user)
+        assert old_time <= updated_component.published_on
+        assert updated_component.published_by == publish_user
 
         # Verify that changing the item doesn't unset the published info
         updated_component.display_name = 'changed'
         self.store.update_item(updated_component, self.user_id)
         updated_component = self.store.get_item(updated_component.location)
-        self.assertLessEqual(old_time, updated_component.published_on)
-        self.assertEqual(updated_component.published_by, publish_user)
+        assert old_time <= updated_component.published_on
+        assert updated_component.published_by == publish_user
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_auto_publish(self, default_ms):
@@ -2290,62 +2275,53 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # test create_course to make sure we are autopublishing
         test_course = self.store.create_course('testx', 'GreekHero', 'test_run', self.user_id)
-        self.assertTrue(self.store.has_published_version(test_course))
+        assert self.store.has_published_version(test_course)
 
         test_course_key = test_course.id
 
         # test create_item of direct-only category to make sure we are autopublishing
         chapter = self.store.create_child(self.user_id, test_course.location, 'chapter', 'Overview')
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-            self.assertIn(
-                chapter.location,
-                self.store.get_item(test_course.location).children,
-            )
-        self.assertTrue(self.store.has_published_version(chapter))
+            assert chapter.location in self.store.get_item(test_course.location).children
+        assert self.store.has_published_version(chapter)
 
         chapter_location = chapter.location
 
         # test create_child of direct-only category to make sure we are autopublishing
         sequential = self.store.create_child(self.user_id, chapter_location, 'sequential', 'Sequence')
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-            self.assertIn(
-                sequential.location,
-                self.store.get_item(chapter_location).children,
-            )
-        self.assertTrue(self.store.has_published_version(sequential))
+            assert sequential.location in self.store.get_item(chapter_location).children
+        assert self.store.has_published_version(sequential)
 
         # test update_item of direct-only category to make sure we are autopublishing
         sequential.display_name = 'sequential1'
         sequential = self.store.update_item(sequential, self.user_id)
-        self.assertTrue(self.store.has_published_version(sequential))
+        assert self.store.has_published_version(sequential)
 
         # test delete_item of direct-only category to make sure we are autopublishing
         self.store.delete_item(sequential.location, self.user_id, revision=ModuleStoreEnum.RevisionOption.all)
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-            self.assertNotIn(
-                sequential.location,
-                self.store.get_item(chapter_location).children,
-            )
+            assert sequential.location not in self.store.get_item(chapter_location).children
         chapter = self.store.get_item(chapter.location.for_branch(None))
-        self.assertTrue(self.store.has_published_version(chapter))
+        assert self.store.has_published_version(chapter)
 
         # test create_child of NOT direct-only category to make sure we aren't autopublishing
         problem_child = self.store.create_child(self.user_id, chapter_location, 'problem', 'Problem_Child')
-        self.assertFalse(self.store.has_published_version(problem_child))
+        assert not self.store.has_published_version(problem_child)
 
         # test create_item of NOT direct-only category to make sure we aren't autopublishing
         problem_item = self.store.create_item(self.user_id, test_course_key, 'problem', 'Problem_Item')
-        self.assertFalse(self.store.has_published_version(problem_item))
+        assert not self.store.has_published_version(problem_item)
 
         # test update_item of NOT direct-only category to make sure we aren't autopublishing
         problem_item.display_name = 'Problem_Item1'
         problem_item = self.store.update_item(problem_item, self.user_id)
-        self.assertFalse(self.store.has_published_version(problem_item))
+        assert not self.store.has_published_version(problem_item)
 
         # test delete_item of NOT direct-only category to make sure we aren't autopublishing
         self.store.delete_item(problem_child.location, self.user_id)
         chapter = self.store.get_item(chapter.location.for_branch(None))
-        self.assertTrue(self.store.has_published_version(chapter))
+        assert self.store.has_published_version(chapter)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_get_courses_for_wiki_shared(self, default_ms):
@@ -2356,10 +2332,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # verify initial state - initially, we should have a wiki for the Mongo course
         wiki_courses = self.store.get_courses_for_wiki('999')
-        self.assertIn(
-            self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None),  # Branch agnostic
-            wiki_courses
-        )
+        assert self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None) in wiki_courses
 
         # set Mongo course to share the wiki with simple course
         mongo_course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key)
@@ -2368,15 +2341,12 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # now mongo_course should not be retrievable with old wiki_slug
         wiki_courses = self.store.get_courses_for_wiki('999')
-        self.assertEqual(len(wiki_courses), 0)
+        assert len(wiki_courses) == 0
 
         # but there should be one course with wiki_slug 'simple'
         wiki_courses = self.store.get_courses_for_wiki('simple')
-        self.assertEqual(len(wiki_courses), 1)
-        self.assertIn(
-            self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None),
-            wiki_courses
-        )
+        assert len(wiki_courses) == 1
+        assert self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None) in wiki_courses
 
         # configure mongo course to use unique wiki_slug.
         mongo_course = self.store.get_course(self.course_locations[self.MONGO_COURSEID].course_key)
@@ -2384,18 +2354,12 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         self.store.update_item(mongo_course, self.user_id)
         # it should be retrievable with its new wiki_slug
         wiki_courses = self.store.get_courses_for_wiki('MITx.999.2013_Spring')
-        self.assertEqual(len(wiki_courses), 1)
-        self.assertIn(
-            self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None),
-            wiki_courses
-        )
+        assert len(wiki_courses) == 1
+        assert self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None) in wiki_courses
         # and NOT retriveable with its old wiki_slug
         wiki_courses = self.store.get_courses_for_wiki('simple')
-        self.assertEqual(len(wiki_courses), 0)
-        self.assertNotIn(
-            self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None),
-            wiki_courses
-        )
+        assert len(wiki_courses) == 0
+        assert self.course_locations[self.MONGO_COURSEID].course_key.replace(branch=None) not in wiki_courses
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_branch_setting(self, default_ms):
@@ -2415,10 +2379,8 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             """
             Asserts the number of problems with the given display name is the given expected number.
             """
-            self.assertEqual(
-                len(self.store.get_items(course_key.for_branch(None), settings={'display_name': display_name})),
-                expected_number
-            )
+            assert len(self.store.get_items(course_key.for_branch(None), settings={'display_name': display_name})) ==\
+                   expected_number
 
         def assertProblemNameEquals(expected_display_name):
             """
@@ -2426,20 +2388,20 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             """
             # check the display_name of the problem
             problem = self.store.get_item(problem_location)
-            self.assertEqual(problem.display_name, expected_display_name)
+            assert problem.display_name == expected_display_name
 
             # there should be only 1 problem with the expected_display_name
             assertNumProblems(expected_display_name, 1)
 
         # verify Draft problem
         with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred, course_key):
-            self.assertTrue(self.store.has_item(problem_location))
+            assert self.store.has_item(problem_location)
             assertProblemNameEquals(problem_original_name)
 
         # verify Published problem doesn't exist
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, course_key):
-            self.assertFalse(self.store.has_item(problem_location))
-            with self.assertRaises(ItemNotFoundError):
+            assert not self.store.has_item(problem_location)
+            with pytest.raises(ItemNotFoundError):
                 self.store.get_item(problem_location)
 
         # PUBLISH the problem
@@ -2448,7 +2410,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # verify Published problem
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, course_key):
-            self.assertTrue(self.store.has_item(problem_location))
+            assert self.store.has_item(problem_location)
             assertProblemNameEquals(problem_original_name)
 
         # verify Draft-preferred
@@ -2481,25 +2443,25 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # verify branch setting is published-only in manager
         with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-            self.assertEqual(self.store.get_branch_setting(), ModuleStoreEnum.Branch.published_only)
+            assert self.store.get_branch_setting() == ModuleStoreEnum.Branch.published_only
 
         # verify branch setting is draft-preferred in manager
         with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
-            self.assertEqual(self.store.get_branch_setting(), ModuleStoreEnum.Branch.draft_preferred)
+            assert self.store.get_branch_setting() == ModuleStoreEnum.Branch.draft_preferred
 
     def verify_default_store(self, store_type):
         """
         Verifies the default_store property
         """
-        self.assertEqual(self.store.default_modulestore.get_modulestore_type(), store_type)
+        assert self.store.default_modulestore.get_modulestore_type() == store_type
 
         # verify internal helper method
         store = self.store._get_modulestore_for_courselike()  # pylint: disable=protected-access
-        self.assertEqual(store.get_modulestore_type(), store_type)
+        assert store.get_modulestore_type() == store_type
 
         # verify store used for creating a course
         course = self.store.create_course("org", "course{}".format(uuid4().hex[:5]), "run", self.user_id)
-        self.assertEqual(course.system.modulestore.get_modulestore_type(), store_type)
+        assert course.system.modulestore.get_modulestore_type() == store_type
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_default_store(self, default_ms):
@@ -2619,7 +2581,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
                             self.store.create_item(self.user_id, course_key, block_type)
                             signal_handler.send.assert_not_called()
 
-                    self.assertEqual(mock_clear_bulk_ops_record.call_count, 1)
+                    assert mock_clear_bulk_ops_record.call_count == 1
 
                 signal_handler.send.assert_called_with('course_published', course_key=course.id)
 
@@ -2637,7 +2599,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2678,7 +2640,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2709,7 +2671,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2742,7 +2704,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2798,7 +2760,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2840,7 +2802,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2909,7 +2871,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
             self.addCleanup(self.store.close_all_connections)
 
             with self.store.default_store(default):
-                self.assertIsNotNone(self.store.thread_cache.default_store.signal_handler)
+                assert self.store.thread_cache.default_store.signal_handler is not None
 
                 signal_handler.send.assert_not_called()
 
@@ -2949,23 +2911,23 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         self.store.publish(chapter.location, self.user_id)
         # Verify that there are no changes
-        self.assertFalse(self._has_changes(chapter.location))
-        self.assertFalse(self._has_changes(sequential.location))
-        self.assertFalse(self._has_changes(vertical.location))
-        self.assertFalse(self._has_changes(problem.location))
+        assert not self._has_changes(chapter.location)
+        assert not self._has_changes(sequential.location)
+        assert not self._has_changes(vertical.location)
+        assert not self._has_changes(problem.location)
 
         # No orphans in course
         course_orphans = self.store.get_orphans(course_locator)
-        self.assertEqual(len(course_orphans), 0)
+        assert len(course_orphans) == 0
         self.store.delete_item(vertical.location, self.user_id)
 
         # No orphans in course after delete, except
         # in old mongo, which still creates orphans
         course_orphans = self.store.get_orphans(course_locator)
         if default_store == ModuleStoreEnum.Type.mongo:
-            self.assertEqual(len(course_orphans), 1)
+            assert len(course_orphans) == 1
         else:
-            self.assertEqual(len(course_orphans), 0)
+            assert len(course_orphans) == 0
 
         course_locator_publish = course_locator.for_branch(ModuleStoreEnum.BranchName.published)
         # No published oprhans after delete, except
@@ -2973,9 +2935,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         course_publish_orphans = self.store.get_orphans(course_locator_publish)
 
         if default_store == ModuleStoreEnum.Type.mongo:
-            self.assertEqual(len(course_publish_orphans), 1)
+            assert len(course_publish_orphans) == 1
         else:
-            self.assertEqual(len(course_publish_orphans), 0)
+            assert len(course_publish_orphans) == 0
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_delete_draft_item_orphans(self, default_store):
@@ -3003,28 +2965,28 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
 
         self.store.publish(chapter.location, self.user_id)
         # Verify that there are no changes
-        self.assertFalse(self._has_changes(chapter.location))
-        self.assertFalse(self._has_changes(sequential.location))
-        self.assertFalse(self._has_changes(vertical.location))
-        self.assertFalse(self._has_changes(problem.location))
+        assert not self._has_changes(chapter.location)
+        assert not self._has_changes(sequential.location)
+        assert not self._has_changes(vertical.location)
+        assert not self._has_changes(problem.location)
 
         # No orphans in course
         course_orphans = self.store.get_orphans(course_locator)
-        self.assertEqual(len(course_orphans), 0)
+        assert len(course_orphans) == 0
 
         problem.display_name = 'changed'
         problem = self.store.update_item(problem, self.user_id)
-        self.assertTrue(self._has_changes(vertical.location))
-        self.assertTrue(self._has_changes(problem.location))
+        assert self._has_changes(vertical.location)
+        assert self._has_changes(problem.location)
 
         self.store.delete_item(vertical.location, self.user_id)
         # No orphans in course after delete, except
         # in old mongo, which still creates them
         course_orphans = self.store.get_orphans(course_locator)
         if default_store == ModuleStoreEnum.Type.mongo:
-            self.assertEqual(len(course_orphans), 1)
+            assert len(course_orphans) == 1
         else:
-            self.assertEqual(len(course_orphans), 0)
+            assert len(course_orphans) == 0
 
         course_locator_publish = course_locator.for_branch(ModuleStoreEnum.BranchName.published)
         # No published orphans after delete, except
@@ -3032,9 +2994,9 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup):
         course_publish_orphans = self.store.get_orphans(course_locator_publish)
 
         if default_store == ModuleStoreEnum.Type.mongo:
-            self.assertEqual(len(course_publish_orphans), 1)
+            assert len(course_publish_orphans) == 1
         else:
-            self.assertEqual(len(course_publish_orphans), 0)
+            assert len(course_publish_orphans) == 0
 
 
 @ddt.ddt
@@ -3106,14 +3068,14 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                 block_id='test_vertical'
             )
             # Not yet published, so changes are present
-            self.assertTrue(self._has_changes(draft_xblock.location))
+            assert self._has_changes(draft_xblock.location)
 
             self._export_import_course_round_trip(
                 self.store, contentstore, source_course_key, self.export_dir
             )
 
             # Verify that the imported block still is a draft, i.e. has changes.
-            self.assertTrue(self._has_changes(draft_xblock.location))
+            assert self._has_changes(draft_xblock.location)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_published_has_changes_before_export_and_after_import(self, default_ms):
@@ -3132,7 +3094,7 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
             self.store.publish(published_xblock.location, self.user_id)
 
             # Retrieve the published block and make sure it's published.
-            self.assertFalse(self._has_changes(published_xblock.location))
+            assert not self._has_changes(published_xblock.location)
 
             self._export_import_course_round_trip(
                 self.store, contentstore, source_course_key, self.export_dir
@@ -3140,7 +3102,7 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
             # Get the published xblock from the imported course.
             # Verify that it still is published, i.e. has no changes.
-            self.assertFalse(self._has_changes(published_xblock.location))
+            assert not self._has_changes(published_xblock.location)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_changed_published_has_changes_before_export_and_after_import(self, default_ms):
@@ -3159,13 +3121,13 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
             self.store.publish(published_xblock.location, self.user_id)
 
             # Retrieve the published block and make sure it's published.
-            self.assertFalse(self._has_changes(published_xblock.location))
+            assert not self._has_changes(published_xblock.location)
 
             updated_display_name = 'Changed Display Name'
             component = self.store.get_item(published_xblock.location)
             component.display_name = updated_display_name
             component = self.store.update_item(component, self.user_id)
-            self.assertTrue(self.store.has_changes(component))
+            assert self.store.has_changes(component)
 
             self._export_import_course_round_trip(
                 self.store, contentstore, source_course_key, self.export_dir
@@ -3173,12 +3135,12 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
             # Get the published xblock from the imported course.
             # Verify that the published block still has a draft block, i.e. has changes.
-            self.assertTrue(self._has_changes(published_xblock.location))
+            assert self._has_changes(published_xblock.location)
 
             # Verify that the changes in the draft vertical still exist.
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred, source_course_key):
                 component = self.store.get_item(published_xblock.location)
-                self.assertEqual(component.display_name, updated_display_name)
+                assert component.display_name == updated_display_name
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_seq_with_unpublished_vertical_has_changes_before_export_and_after_import(self, default_ms):
@@ -3206,11 +3168,11 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
             # Retrieve the published block and make sure it's published.
             # Chapter is published - but the changes in vertical below means it "has_changes".
-            self.assertTrue(self._has_changes(chapter.location))
+            assert self._has_changes(chapter.location)
             # Sequential is published - but the changes in vertical below means it "has_changes".
-            self.assertTrue(self._has_changes(sequential.location))
+            assert self._has_changes(sequential.location)
             # Vertical is unpublished - so it "has_changes".
-            self.assertTrue(self._has_changes(vertical.location))
+            assert self._has_changes(vertical.location)
 
             self._export_import_course_round_trip(
                 self.store, contentstore, source_course_key, self.export_dir
@@ -3218,9 +3180,9 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
             # Get the published xblock from the imported course.
             # Verify that the published block still has a draft block, i.e. has changes.
-            self.assertTrue(self._has_changes(chapter.location))
-            self.assertTrue(self._has_changes(sequential.location))
-            self.assertTrue(self._has_changes(vertical.location))
+            assert self._has_changes(chapter.location)
+            assert self._has_changes(sequential.location)
+            assert self._has_changes(vertical.location)
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_vertical_with_draft_and_published_unit_has_changes_before_export_and_after_import(self, default_ms):
@@ -3246,41 +3208,41 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                 self.user_id, sequential.location, 'vertical', block_id='moon_unit'
             )
             # Vertical has changes until it is actually published.
-            self.assertTrue(self._has_changes(vertical.location))
+            assert self._has_changes(vertical.location)
             self.store.publish(vertical.location, self.user_id)
-            self.assertFalse(self._has_changes(vertical.location))
+            assert not self._has_changes(vertical.location)
 
             # create unit
             unit = self.store.create_child(
                 self.user_id, vertical.location, 'html', block_id='html_unit'
             )
             # Vertical has a new child -and- unit is unpublished. So both have changes.
-            self.assertTrue(self._has_changes(vertical.location))
-            self.assertTrue(self._has_changes(unit.location))
+            assert self._has_changes(vertical.location)
+            assert self._has_changes(unit.location)
 
             # Publishing the vertical also publishes its unit child.
             self.store.publish(vertical.location, self.user_id)
-            self.assertFalse(self._has_changes(vertical.location))
-            self.assertFalse(self._has_changes(unit.location))
+            assert not self._has_changes(vertical.location)
+            assert not self._has_changes(unit.location)
 
             # Publishing the unit separately has no effect on whether it has changes - it's already published.
             self.store.publish(unit.location, self.user_id)
-            self.assertFalse(self._has_changes(vertical.location))
-            self.assertFalse(self._has_changes(unit.location))
+            assert not self._has_changes(vertical.location)
+            assert not self._has_changes(unit.location)
 
             # Retrieve the published block and make sure it's published.
             self.store.publish(chapter.location, self.user_id)
-            self.assertFalse(self._has_changes(chapter.location))
-            self.assertFalse(self._has_changes(sequential.location))
-            self.assertFalse(self._has_changes(vertical.location))
-            self.assertFalse(self._has_changes(unit.location))
+            assert not self._has_changes(chapter.location)
+            assert not self._has_changes(sequential.location)
+            assert not self._has_changes(vertical.location)
+            assert not self._has_changes(unit.location)
 
             # Now make changes to the unit - but don't publish them.
             component = self.store.get_item(unit.location)
             updated_display_name = 'Changed Display Name'
             component.display_name = updated_display_name
             component = self.store.update_item(component, self.user_id)
-            self.assertTrue(self._has_changes(component.location))
+            assert self._has_changes(component.location)
 
             # Export the course - then import the course export.
             self._export_import_course_round_trip(
@@ -3289,20 +3251,20 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
             # Get the published xblock from the imported course.
             # Verify that the published block still has a draft block, i.e. has changes.
-            self.assertTrue(self._has_changes(chapter.location))
-            self.assertTrue(self._has_changes(sequential.location))
-            self.assertTrue(self._has_changes(vertical.location))
-            self.assertTrue(self._has_changes(unit.location))
+            assert self._has_changes(chapter.location)
+            assert self._has_changes(sequential.location)
+            assert self._has_changes(vertical.location)
+            assert self._has_changes(unit.location)
 
             # Verify that the changes in the draft unit still exist.
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred, source_course_key):
                 component = self.store.get_item(unit.location)
-                self.assertEqual(component.display_name, updated_display_name)
+                assert component.display_name == updated_display_name
 
             # Verify that the draft changes don't exist in the published unit - it still uses the default name.
             with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, source_course_key):
                 component = self.store.get_item(unit.location)
-                self.assertEqual(component.display_name, 'Text')
+                assert component.display_name == 'Text'
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     def test_vertical_with_published_unit_remains_published_before_export_and_after_import(self, default_ms):
@@ -3328,9 +3290,9 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                 self.user_id, sequential.location, 'vertical', block_id='moon_unit'
             )
             # Vertical has changes until it is actually published.
-            self.assertTrue(self._has_changes(vertical.location))
+            assert self._has_changes(vertical.location)
             self.store.publish(vertical.location, self.user_id)
-            self.assertFalse(self._has_changes(vertical.location))
+            assert not self._has_changes(vertical.location)
 
             # create unit
             unit = self.store.create_child(
@@ -3340,12 +3302,12 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
             updated_display_name = 'Changed Display Name'
             unit.display_name = updated_display_name
             unit = self.store.update_item(unit, self.user_id)
-            self.assertTrue(self._has_changes(unit.location))
+            assert self._has_changes(unit.location)
 
             # Publishing the vertical also publishes its unit child.
             self.store.publish(vertical.location, self.user_id)
-            self.assertFalse(self._has_changes(vertical.location))
-            self.assertFalse(self._has_changes(unit.location))
+            assert not self._has_changes(vertical.location)
+            assert not self._has_changes(unit.location)
 
             # Export the course - then import the course export.
             self._export_import_course_round_trip(
@@ -3354,15 +3316,15 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
             # Get the published xblock from the imported course.
             # Verify that the published block still has a draft block, i.e. has changes.
-            self.assertFalse(self._has_changes(chapter.location))
-            self.assertFalse(self._has_changes(sequential.location))
-            self.assertFalse(self._has_changes(vertical.location))
-            self.assertFalse(self._has_changes(unit.location))
+            assert not self._has_changes(chapter.location)
+            assert not self._has_changes(sequential.location)
+            assert not self._has_changes(vertical.location)
+            assert not self._has_changes(unit.location)
 
             # Verify that the published changes exist in the published unit.
             with self.store.branch_setting(ModuleStoreEnum.Branch.published_only, source_course_key):
                 component = self.store.get_item(unit.location)
-                self.assertEqual(component.display_name, updated_display_name)
+                assert component.display_name == updated_display_name
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     @XBlockAside.register_temp_plugin(AsideTestType, 'test_aside')
@@ -3399,11 +3361,11 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                     """
                     asides = block.runtime.get_asides(block)
 
-                    self.assertEqual(len(asides), 1, "Found {} asides but expected only test_aside".format(asides))
-                    self.assertIsInstance(asides[0], AsideTestType)
+                    assert len(asides) == 1, 'Found {} asides but expected only test_aside'.format(asides)
+                    assert isinstance(asides[0], AsideTestType)
                     category = block.scope_ids.block_type
-                    self.assertEqual(asides[0].data_field, "{} aside data".format(category))
-                    self.assertEqual(asides[0].content, "{} Aside".format(category.capitalize()))
+                    assert asides[0].data_field == '{} aside data'.format(category)
+                    assert asides[0].content == '{} Aside'.format(category.capitalize())
 
                     for child in block.get_children():
                         check_block(child)
@@ -3414,17 +3376,13 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                 new_chapter = self.store.create_child(self.user_id, courses[0].location, 'chapter', 'new_chapter')
                 asides = new_chapter.runtime.get_asides(new_chapter)
 
-                self.assertEqual(len(asides), 1, "Found {} asides but expected only test_aside".format(asides))
+                assert len(asides) == 1, 'Found {} asides but expected only test_aside'.format(asides)
                 chapter_aside = asides[0]
-                self.assertIsInstance(chapter_aside, AsideTestType)
-                self.assertFalse(
-                    chapter_aside.fields['data_field'].is_set_on(chapter_aside),
-                    "data_field says it's assigned to {}".format(chapter_aside.data_field)
-                )
-                self.assertFalse(
-                    chapter_aside.fields['content'].is_set_on(chapter_aside),
-                    "content says it's assigned to {}".format(chapter_aside.content)
-                )
+                assert isinstance(chapter_aside, AsideTestType)
+                assert not chapter_aside.fields['data_field'].is_set_on(chapter_aside), \
+                    f"data_field says it's assigned to {chapter_aside.data_field}"
+                assert not chapter_aside.fields['content'].is_set_on(chapter_aside), \
+                    f"content says it's assigned to {chapter_aside.content}"
 
                 # now update the values
                 chapter_aside.data_field = 'new value'
@@ -3432,7 +3390,7 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
                 new_chapter = self.store.get_item(new_chapter.location)
                 chapter_aside = new_chapter.runtime.get_asides(new_chapter)[0]
-                self.assertEqual('new value', chapter_aside.data_field)
+                assert 'new value' == chapter_aside.data_field
 
                 # update the values the second time
                 chapter_aside.data_field = 'another one value'
@@ -3440,7 +3398,7 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
 
                 new_chapter2 = self.store.get_item(new_chapter.location)
                 chapter_aside2 = new_chapter2.runtime.get_asides(new_chapter2)[0]
-                self.assertEqual('another one value', chapter_aside2.data_field)
+                assert 'another one value' == chapter_aside2.data_field
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     @XBlockAside.register_temp_plugin(AsideTestType, 'test_aside')
@@ -3509,7 +3467,7 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                     raise_on_failure=True,
                 )
 
-                self.assertEqual(1, len(courses2))
+                assert 1 == len(courses2)
 
                 # check that the imported blocks have the right asides and values
                 def check_block(block):
@@ -3518,11 +3476,11 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                     """
                     asides = block.runtime.get_asides(block)
 
-                    self.assertEqual(len(asides), 1, "Found {} asides but expected only test_aside".format(asides))
-                    self.assertIsInstance(asides[0], AsideTestType)
+                    assert len(asides) == 1, 'Found {} asides but expected only test_aside'.format(asides)
+                    assert isinstance(asides[0], AsideTestType)
                     category = block.scope_ids.block_type
-                    self.assertEqual(asides[0].data_field, "Exported data_field {} aside data".format(category))
-                    self.assertEqual(asides[0].content, "Exported content {} Aside".format(category.capitalize()))
+                    assert asides[0].data_field == 'Exported data_field {} aside data'.format(category)
+                    assert asides[0].content == 'Exported content {} Aside'.format(category.capitalize())
 
                     for child in block.get_children():
                         check_block(child)
@@ -3565,9 +3523,9 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                 new_chapter.display_name = new_chapter_display_name
                 asides = new_chapter.runtime.get_asides(new_chapter)
 
-                self.assertEqual(len(asides), 1, "Found {} asides but expected only test_aside".format(asides))
+                assert len(asides) == 1, 'Found {} asides but expected only test_aside'.format(asides)
                 chapter_aside = asides[0]
-                self.assertIsInstance(chapter_aside, AsideTestType)
+                assert isinstance(chapter_aside, AsideTestType)
                 chapter_aside.data_field = 'new value'
                 self.store.update_item(new_chapter, self.user_id, asides=[chapter_aside])
 
@@ -3578,9 +3536,9 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                 new_problem.display_name = new_problem_display_name
                 asides = new_problem.runtime.get_asides(new_problem)
 
-                self.assertEqual(len(asides), 1, "Found {} asides but expected only test_aside".format(asides))
+                assert len(asides) == 1, 'Found {} asides but expected only test_aside'.format(asides)
                 problem_aside = asides[0]
-                self.assertIsInstance(problem_aside, AsideTestType)
+                assert isinstance(problem_aside, AsideTestType)
                 problem_aside.data_field = 'new problem value'
                 problem_aside.content = 'new content value'
                 self.store.update_item(new_problem, self.user_id, asides=[problem_aside])
@@ -3607,44 +3565,44 @@ class TestPublishOverExportImport(CommonMixedModuleStoreSetup):
                     raise_on_failure=True,
                 )
 
-                self.assertEqual(1, len(courses2))
+                assert 1 == len(courses2)
 
                 # check that aside for the new chapter was exported/imported properly
                 chapters = courses2[0].get_children()
-                self.assertEqual(2, len(chapters))
-                self.assertIn(new_chapter_display_name, [item.display_name for item in chapters])
+                assert 2 == len(chapters)
+                assert new_chapter_display_name in [item.display_name for item in chapters]
 
                 found = False
                 for child in chapters:
                     if new_chapter.display_name == child.display_name:
                         found = True
                         asides = child.runtime.get_asides(child)
-                        self.assertEqual(len(asides), 1)
+                        assert len(asides) == 1
                         child_aside = asides[0]
-                        self.assertIsInstance(child_aside, AsideTestType)
-                        self.assertEqual(child_aside.data_field, 'new value')
+                        assert isinstance(child_aside, AsideTestType)
+                        assert child_aside.data_field == 'new value'
                         break
 
-                self.assertTrue(found, "new_chapter not found")
+                assert found, 'new_chapter not found'
 
                 # check that aside for the new problem was exported/imported properly
                 sequence_children = courses2[0].get_children()[0].get_children()[0].get_children()
-                self.assertEqual(2, len(sequence_children))
-                self.assertIn(new_problem_display_name, [item.display_name for item in sequence_children])
+                assert 2 == len(sequence_children)
+                assert new_problem_display_name in [item.display_name for item in sequence_children]
 
                 found = False
                 for child in sequence_children:
                     if new_problem.display_name == child.display_name:
                         found = True
                         asides = child.runtime.get_asides(child)
-                        self.assertEqual(len(asides), 1)
+                        assert len(asides) == 1
                         child_aside = asides[0]
-                        self.assertIsInstance(child_aside, AsideTestType)
-                        self.assertEqual(child_aside.data_field, 'new problem value')
-                        self.assertEqual(child_aside.content, 'new content value')
+                        assert isinstance(child_aside, AsideTestType)
+                        assert child_aside.data_field == 'new problem value'
+                        assert child_aside.content == 'new content value'
                         break
 
-                self.assertTrue(found, "new_chapter not found")
+                assert found, 'new_chapter not found'
 
 
 @ddt.ddt
@@ -3704,12 +3662,12 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
 
         def _check_asides(asides, field11, field12, field21, field22):
             """ Helper function to check asides """
-            self.assertEqual(len(asides), 2)
-            self.assertEqual({type(asides[0]), type(asides[1])}, {AsideFoo, AsideBar})
-            self.assertEqual(asides[0].field11, field11)
-            self.assertEqual(asides[0].field12, field12)
-            self.assertEqual(asides[1].field21, field21)
-            self.assertEqual(asides[1].field22, field22)
+            assert len(asides) == 2
+            assert {type(asides[0]), type(asides[1])} == {AsideFoo, AsideBar}
+            assert asides[0].field11 == field11
+            assert asides[0].field12 == field12
+            assert asides[1].field21 == field21
+            assert asides[1].field22 == field22
 
         # get saved item and check asides
         component = self.store.get_item(published_xblock.location)
@@ -3767,13 +3725,13 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
             for block in actual_items:
                 if block.scope_ids.block_type == 'chapter':
                     asides = block.runtime.get_asides(block)
-                    self.assertEqual(len(asides), 1)
-                    self.assertEqual(asides[0].field11, 'test1')
-                    self.assertEqual(asides[0].field12, 'aside1_default_value2')
+                    assert len(asides) == 1
+                    assert asides[0].field11 == 'test1'
+                    assert asides[0].field12 == 'aside1_default_value2'
                     chapter_is_found = True
                     break
 
-            self.assertTrue(chapter_is_found)
+            assert chapter_is_found
 
     @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
     @XBlockAside.register_temp_plugin(AsideFoo, 'test_aside1')
@@ -3805,8 +3763,8 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
         )
 
         asides = published_xblock.runtime.get_asides(published_xblock)
-        self.assertEqual(asides[0].field11, 'new_value11')
-        self.assertEqual(asides[0].field12, 'new_value12')
+        assert asides[0].field11 == 'new_value11'
+        assert asides[0].field12 == 'new_value12'
 
         # remove item
         self.store.delete_item(published_xblock.location, self.user_id)
@@ -3821,8 +3779,8 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
 
         # check that aside has default values
         asides2 = published_xblock2.runtime.get_asides(published_xblock2)
-        self.assertEqual(asides2[0].field11, 'aside1_default_value1')
-        self.assertEqual(asides2[0].field12, 'aside1_default_value2')
+        assert asides2[0].field11 == 'aside1_default_value1'
+        assert asides2[0].field12 == 'aside1_default_value2'
 
     @ddt.data((ModuleStoreEnum.Type.mongo, 1, 0), (ModuleStoreEnum.Type.split, 2, 0))
     @XBlockAside.register_temp_plugin(AsideFoo, 'test_aside1')
@@ -3849,15 +3807,15 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
         def _check_asides(item):
             """ Helper function to check asides """
             asides = item.runtime.get_asides(item)
-            self.assertEqual(asides[0].field11, 'new_value11')
-            self.assertEqual(asides[0].field12, 'new_value12')
+            assert asides[0].field11 == 'new_value11'
+            assert asides[0].field12 == 'new_value12'
 
         # start off as Private
         item = self.store.create_child(self.user_id, self.writable_chapter_location, 'problem',
                                        'test_compute_publish_state', asides=[aside1])
         item_location = item.location
         with check_mongo_calls(max_find, max_send):
-            self.assertFalse(self.store.has_published_version(item))
+            assert not self.store.has_published_version(item)
         _check_asides(item)
 
         # Private -> Public
@@ -3865,7 +3823,7 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
         _check_asides(published_block)
 
         item = self.store.get_item(item_location)
-        self.assertTrue(self.store.has_published_version(item))
+        assert self.store.has_published_version(item)
         _check_asides(item)
 
         # Public -> Private
@@ -3873,5 +3831,5 @@ class TestAsidesWithMixedModuleStore(CommonMixedModuleStoreSetup):
         _check_asides(unpublished_block)
 
         item = self.store.get_item(item_location)
-        self.assertFalse(self.store.has_published_version(item))
+        assert not self.store.has_published_version(item)
         _check_asides(item)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore_settings.py b/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore_settings.py
index 79b25f12ce6cd399b4c28a180c039bb83aa02322..349c93b474c2105728a27cce26ad959d0b101c42 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore_settings.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore_settings.py
@@ -5,7 +5,7 @@ Tests for testing the modulestore settings migration code.
 
 import copy
 from unittest import TestCase
-
+import pytest
 import ddt
 
 from openedx.core.lib.tempdir import mkdtemp_clean
@@ -124,7 +124,7 @@ class ModuleStoreSettingsMigration(TestCase):
         """
         store_fields = ["OPTIONS", "DOC_STORE_CONFIG"]
         for field in store_fields:
-            self.assertEqual(store_setting1[field], store_setting2[field])
+            assert store_setting1[field] == store_setting2[field]
 
     def assertMigrated(self, old_setting):
         """
@@ -135,11 +135,11 @@ class ModuleStoreSettingsMigration(TestCase):
         new_mixed_setting = convert_module_store_setting_if_needed(copy.deepcopy(old_setting))
 
         # check whether the configuration is encapsulated within Mixed.
-        self.assertEqual(new_mixed_setting["default"]["ENGINE"], "xmodule.modulestore.mixed.MixedModuleStore")
+        assert new_mixed_setting['default']['ENGINE'] == 'xmodule.modulestore.mixed.MixedModuleStore'
 
         # check whether the stores are in an ordered list
         new_stores = get_mixed_stores(new_mixed_setting)
-        self.assertIsInstance(new_stores, list)
+        assert isinstance(new_stores, list)
 
         return new_mixed_setting, new_stores[0]
 
@@ -151,9 +151,9 @@ class ModuleStoreSettingsMigration(TestCase):
         split_settings = [store for store in stores if store['ENGINE'].endswith('.DraftVersioningModuleStore')]
         if len(split_settings):  # lint-amnesty, pylint: disable=len-as-condition
             # there should only be one setting for split
-            self.assertEqual(len(split_settings), 1)
+            assert len(split_settings) == 1
             # verify name
-            self.assertEqual(split_settings[0]['NAME'], 'split')
+            assert split_settings[0]['NAME'] == 'split'
             # verify split config settings equal those of mongo
             self.assertStoreValuesEqual(
                 split_settings[0],
@@ -165,28 +165,28 @@ class ModuleStoreSettingsMigration(TestCase):
         old_setting = self.OLD_CONFIG
         new_mixed_setting, new_default_store_setting = self.assertMigrated(old_setting)
         self.assertStoreValuesEqual(new_default_store_setting, old_setting["default"])
-        self.assertEqual(new_default_store_setting["ENGINE"], old_setting["default"]["ENGINE"])
-        self.assertFalse(self.is_split_configured(new_mixed_setting))
+        assert new_default_store_setting['ENGINE'] == old_setting['default']['ENGINE']
+        assert not self.is_split_configured(new_mixed_setting)
 
     def test_convert_from_old_mongo_to_draft_store(self):
         old_setting = self.OLD_CONFIG_WITH_DIRECT_MONGO
         new_mixed_setting, new_default_store_setting = self.assertMigrated(old_setting)
         self.assertStoreValuesEqual(new_default_store_setting, old_setting["default"])
-        self.assertEqual(new_default_store_setting["ENGINE"], "xmodule.modulestore.mongo.draft.DraftModuleStore")
-        self.assertTrue(self.is_split_configured(new_mixed_setting))
+        assert new_default_store_setting['ENGINE'] == 'xmodule.modulestore.mongo.draft.DraftModuleStore'
+        assert self.is_split_configured(new_mixed_setting)
 
     def test_convert_from_dict_to_list(self):
         old_mixed_setting = self.OLD_MIXED_CONFIG_WITH_DICT
         new_mixed_setting, new_default_store_setting = self.assertMigrated(old_mixed_setting)
-        self.assertEqual(new_default_store_setting["ENGINE"], "the_default_store")
-        self.assertTrue(self.is_split_configured(new_mixed_setting))
+        assert new_default_store_setting['ENGINE'] == 'the_default_store'
+        assert self.is_split_configured(new_mixed_setting)
 
         # exclude split when comparing old and new, since split was added as part of the migration
         new_stores = [store for store in get_mixed_stores(new_mixed_setting) if store['NAME'] != 'split']
         old_stores = get_mixed_stores(self.OLD_MIXED_CONFIG_WITH_DICT)
 
         # compare each store configured in mixed
-        self.assertEqual(len(new_stores), len(old_stores))
+        assert len(new_stores) == len(old_stores)
         for new_store in new_stores:
             self.assertStoreValuesEqual(new_store, old_stores[new_store['NAME']])
 
@@ -194,16 +194,16 @@ class ModuleStoreSettingsMigration(TestCase):
         # make sure there is no migration done on an already updated config
         old_mixed_setting = self.ALREADY_UPDATED_MIXED_CONFIG
         new_mixed_setting, new_default_store_setting = self.assertMigrated(old_mixed_setting)  # lint-amnesty, pylint: disable=unused-variable
-        self.assertTrue(self.is_split_configured(new_mixed_setting))
-        self.assertEqual(old_mixed_setting, new_mixed_setting)
+        assert self.is_split_configured(new_mixed_setting)
+        assert old_mixed_setting == new_mixed_setting
 
     @ddt.data('draft', 'split')
     def test_update_settings(self, default_store):
         mixed_setting = self.ALREADY_UPDATED_MIXED_CONFIG
         update_module_store_settings(mixed_setting, default_store=default_store)
-        self.assertEqual(get_mixed_stores(mixed_setting)[0]['NAME'], default_store)
+        assert get_mixed_stores(mixed_setting)[0]['NAME'] == default_store
 
     def test_update_settings_error(self):
         mixed_setting = self.ALREADY_UPDATED_MIXED_CONFIG
-        with self.assertRaises(Exception):
+        with pytest.raises(Exception):
             update_module_store_settings(mixed_setting, default_store='non-existent store')
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py
index e61303f6beeb2cb559dabd144127c026959656fd..7a9d88ba1bfc5eb960b70f5bcca3348f6c1b79de 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py
@@ -298,7 +298,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
         """
         course_key = CourseKey.from_string('course-v1:edX+simple+2012_Fall')
 
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             self.draft_store.get_course(course_key)
 
     def test_has_mongo_course_with_split_course_key(self):
@@ -307,7 +307,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
         """
         course_key = CourseKey.from_string('course-v1:edX+simple+2012_Fall')
 
-        self.assertFalse(self.draft_store.has_course(course_key))
+        assert not self.draft_store.has_course(course_key)
 
     def test_has_course_with_library(self):
         """
@@ -369,10 +369,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
     def test_get_courses_has_no_templates(self):
         courses = self.draft_store.get_courses()
         for course in courses:
-            self.assertFalse(
-                course.location.org == 'edx' and course.location.course == 'templates',
+            assert not ((course.location.org == 'edx') and (course.location.course == 'templates')),\
                 '{0} is a template course'.format(course)
-            )
 
     def test_contentstore_attrs(self):
         """
@@ -566,8 +564,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
         root_dir = path(mkdtemp())
         self.addCleanup(shutil.rmtree, root_dir)
         export_course_to_xml(self.draft_store, self.content_store, course_key, root_dir, u'test_export')
-        self.assertTrue(path(root_dir / 'test_export/static/images/course_image.jpg').isfile())
-        self.assertTrue(path(root_dir / 'test_export/static/images_course_image.jpg').isfile())
+        assert path((root_dir / 'test_export/static/images/course_image.jpg')).isfile()
+        assert path((root_dir / 'test_export/static/images_course_image.jpg')).isfile()
 
     @patch('xmodule.video_module.video_module.edxval_api', None)
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
@@ -582,8 +580,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
         root_dir = path(mkdtemp())
         self.addCleanup(shutil.rmtree, root_dir)
         export_course_to_xml(self.draft_store, self.content_store, course.id, root_dir, u'test_export')
-        self.assertTrue(path(root_dir / 'test_export/static/just_a_test.jpg').isfile())
-        self.assertFalse(path(root_dir / 'test_export/static/images/course_image.jpg').isfile())
+        assert path((root_dir / 'test_export/static/just_a_test.jpg')).isfile()
+        assert not path((root_dir / 'test_export/static/images/course_image.jpg')).isfile()
 
     @patch('xmodule.video_module.video_module.edxval_api', None)
     def test_course_without_image(self):
@@ -595,8 +593,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
         root_dir = path(mkdtemp())
         self.addCleanup(shutil.rmtree, root_dir)
         export_course_to_xml(self.draft_store, self.content_store, course.id, root_dir, u'test_export')
-        self.assertFalse(path(root_dir / 'test_export/static/images/course_image.jpg').isfile())
-        self.assertFalse(path(root_dir / 'test_export/static/images_course_image.jpg').isfile())
+        assert not path((root_dir / 'test_export/static/images/course_image.jpg')).isfile()
+        assert not path((root_dir / 'test_export/static/images_course_image.jpg')).isfile()
 
     def _create_test_tree(self, name, user_id=None):
         """
@@ -677,8 +675,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
 
         # Retrieve the block and verify its fields
         component = self.draft_store.get_item(location)
-        self.assertEqual(component.published_on, published_date)
-        self.assertEqual(component.published_by, published_by)
+        assert component.published_on == published_date
+        assert component.published_by == published_by
 
     def test_draft_modulestore_create_child_with_position(self):
         """
@@ -703,8 +701,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
 
         # First child should have been moved to second position, and better child takes the lead
         course = self.draft_store.get_course(course.id)
-        self.assertEqual(six.text_type(course.children[1]), six.text_type(first_child.location))
-        self.assertEqual(six.text_type(course.children[0]), six.text_type(second_child.location))
+        assert six.text_type(course.children[1]) == six.text_type(first_child.location)
+        assert six.text_type(course.children[0]) == six.text_type(second_child.location)
 
         # Clean up the data so we don't break other tests which apparently expect a particular state
         self.draft_store.delete_course(course.id, self.dummy_user)
@@ -713,8 +711,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase):
         """Test that we get back the appropriate usage key for the root of a course key."""
         course_key = CourseLocator(org="edX", course="101", run="2015")
         root_block_key = self.draft_store.make_course_usage_key(course_key)
-        self.assertEqual(root_block_key.block_type, "course")
-        self.assertEqual(root_block_key.block_id, "2015")
+        assert root_block_key.block_type == 'course'
+        assert root_block_key.block_id == '2015'
 
 
 class TestMongoModuleStoreWithNoAssetCollection(TestMongoModuleStore):  # lint-amnesty, pylint: disable=test-inherits-tests
@@ -741,12 +739,12 @@ class TestMongoModuleStoreWithNoAssetCollection(TestMongoModuleStore):  # lint-a
         courses = self.draft_store.get_courses()
         course = courses[0]
         # Confirm that no specified asset collection name means empty asset metadata.
-        self.assertEqual(self.draft_store.get_all_asset_metadata(course.id, 'asset'), [])
+        assert self.draft_store.get_all_asset_metadata(course.id, 'asset') == []
 
     def test_no_asset_invalid_key(self):
         course_key = CourseLocator(org="edx3", course="test_course", run=None, deprecated=True)
         # Confirm that invalid course key raises ItemNotFoundError
-        self.assertRaises(ItemNotFoundError, lambda: self.draft_store.get_all_asset_metadata(course_key, 'asset')[:1])
+        pytest.raises(ItemNotFoundError, (lambda: self.draft_store.get_all_asset_metadata(course_key, 'asset')[:1]))
 
 
 class TestMongoKeyValueStore(TestCase):
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_publish.py b/common/lib/xmodule/xmodule/modulestore/tests/test_publish.py
index 57e470932686c202a4080fcb5517d880da9eb079..5ab6ec70a6a0b6cfbe89940175155f032fbf731b 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_publish.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_publish.py
@@ -13,6 +13,7 @@ from contextlib import contextmanager
 from shutil import rmtree
 from tempfile import mkdtemp
 
+import pytest
 import ddt
 import six
 from six.moves import range
@@ -136,7 +137,7 @@ class TestPublish(SplitWMongoCourseBootstrapper):
 
         # verify status
         item = self.draft_mongo.get_item(vert_location, 0)
-        self.assertFalse(getattr(item, 'is_draft', False), "Item was published. Draft should not exist")
+        assert not getattr(item, 'is_draft', False), 'Item was published. Draft should not exist'
         # however, children are still draft, but I'm not sure that's by design
 
         # delete the draft version of the discussion
@@ -144,8 +145,8 @@ class TestPublish(SplitWMongoCourseBootstrapper):
         self.draft_mongo.delete_item(location, self.user_id)
 
         draft_vert = self.draft_mongo.get_item(vert_location, 0)
-        self.assertTrue(getattr(draft_vert, 'is_draft', False), "Deletion didn't convert parent to draft")
-        self.assertNotIn(location, draft_vert.children)
+        assert getattr(draft_vert, 'is_draft', False), "Deletion didn't convert parent to draft"
+        assert location not in draft_vert.children
         # move the other child
         other_child_loc = self.old_course_key.make_usage_key('html', block_id='Html2')
         draft_vert.children.remove(other_child_loc)
@@ -156,12 +157,12 @@ class TestPublish(SplitWMongoCourseBootstrapper):
         # publish
         self.draft_mongo.publish(vert_location, self.user_id)
         item = self.draft_mongo.get_item(draft_vert.location, revision=ModuleStoreEnum.RevisionOption.published_only)
-        self.assertNotIn(location, item.children)
-        self.assertIsNone(self.draft_mongo.get_parent_location(location))
-        with self.assertRaises(ItemNotFoundError):
+        assert location not in item.children
+        assert self.draft_mongo.get_parent_location(location) is None
+        with pytest.raises(ItemNotFoundError):
             self.draft_mongo.get_item(location)
-        self.assertNotIn(other_child_loc, item.children)
-        self.assertTrue(self.draft_mongo.has_item(other_child_loc), "Oops, lost moved item")
+        assert other_child_loc not in item.children
+        assert self.draft_mongo.has_item(other_child_loc), 'Oops, lost moved item'
 
 
 class DraftPublishedOpTestCourseSetup(unittest.TestCase):
@@ -305,10 +306,7 @@ class OLXFormatChecker(unittest.TestCase):
         self._ensure_exported()
 
         block_path = os.path.join(self.root_export_dir, self.export_dir)  # pylint: disable=no-member
-        self.assertTrue(
-            os.path.isdir(block_path),
-            msg='{} is not a dir.'.format(block_path)
-        )
+        assert os.path.isdir(block_path), '{} is not a dir.'.format(block_path)
         return block_path
 
     def _get_block_type_path(self, course_export_dir, block_type, draft):
@@ -335,10 +333,7 @@ class OLXFormatChecker(unittest.TestCase):
 
         block_file = self._get_block_filename(block_id)
         block_file_path = os.path.join(block_subdir_path, block_file)
-        self.assertTrue(
-            os.path.isfile(block_file_path),
-            msg='{} is not an existing file.'.format(block_file_path)
-        )
+        assert os.path.isfile(block_file_path), '{} is not an existing file.'.format(block_file_path)
         with open(block_file_path, "r") as file_handle:
             return file_handle.read()
 
@@ -350,7 +345,7 @@ class OLXFormatChecker(unittest.TestCase):
             element (ElementTree.Element): the element to check.
             tag (str): The tag to validate.
         """
-        self.assertEqual(element.tag, tag)
+        assert element.tag == tag
 
     def assertElementAttrsSubset(self, element, attrs):
         """
@@ -395,10 +390,7 @@ class OLXFormatChecker(unittest.TestCase):
         is_draft = kwargs.pop('draft', False)
         block_path = self._get_block_type_path(course_export_dir, block_type, is_draft)
         block_file_path = os.path.join(block_path, self._get_block_filename(block_id))
-        self.assertFalse(
-            os.path.exists(block_file_path),
-            msg='{} exists but should not!'.format(block_file_path)
-        )
+        assert not os.path.exists(block_file_path), '{} exists but should not!'.format(block_file_path)
 
     def assertParentReferences(self, element, course_key, parent_type, parent_id, index_in_children_list):
         """
@@ -458,7 +450,7 @@ class OLXFormatChecker(unittest.TestCase):
         """
         for block_data in block_list:
             block_params = self.course_db.get(block_data)
-            self.assertIsNotNone(block_params)
+            assert block_params is not None
             (block_type, block_id) = block_data
             if draft:
                 element = self.parse_olx(block_type, block_id, draft=True)
@@ -691,7 +683,7 @@ class ElementalPublishingTests(DraftPublishedOpBaseTestSetup):
             # In Split, you cannot publish an item whose parents are unpublished.
             # Split will raise an exception when the item's parent(s) aren't found
             # in the published branch.
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 self.publish((('html', 'html00'),))
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -839,7 +831,7 @@ class ElementalUnpublishingTests(DraftPublishedOpBaseTestSetup):
             # The unit is a draft.
             self.assertOLXIsDraftOnly(block_list_to_unpublish)
             # Since there's no published version, attempting an unpublish throws an exception.
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 self.unpublish(block_list_to_unpublish)
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -887,7 +879,7 @@ class ElementalUnpublishingTests(DraftPublishedOpBaseTestSetup):
             # The vertical is a draft.
             self.assertOLXIsDraftOnly(block_list_to_unpublish)
             # Since there's no published version, attempting an unpublish throws an exception.
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 self.unpublish(block_list_to_unpublish)
 
     @ddt.data(*MODULESTORE_SETUPS)
@@ -939,7 +931,7 @@ class ElementalUnpublishingTests(DraftPublishedOpBaseTestSetup):
             block_list_to_unpublish = (
                 ('sequential', 'sequential03'),
             )
-            with self.assertRaises(InvalidVersionError):
+            with pytest.raises(InvalidVersionError):
                 self.unpublish(block_list_to_unpublish)
 
 
@@ -983,7 +975,7 @@ class ElementalDeleteItemTests(DraftPublishedOpBaseTestSetup):
                 if revision in (ModuleStoreEnum.RevisionOption.published_only, ModuleStoreEnum.RevisionOption.all):
                     # Split throws an exception when trying to delete an item from the published branch
                     # that isn't yet published.
-                    with self.assertRaises(ValueError):
+                    with pytest.raises(ValueError):
                         self.delete_item(block_list_to_delete, revision=revision)
                 else:
                     self.delete_item(block_list_to_delete, revision=revision)
@@ -1060,7 +1052,7 @@ class ElementalDeleteItemTests(DraftPublishedOpBaseTestSetup):
                 # MODULESTORE_DIFFERENCE:
                 # Split throws an exception when trying to delete an item from the published branch
                 # that isn't yet published.
-                with self.assertRaises(ValueError):
+                with pytest.raises(ValueError):
                     self.delete_item(block_list_to_delete, revision=revision)
             else:
                 self.delete_item(block_list_to_delete, revision=revision)
@@ -1190,7 +1182,7 @@ class ElementalConvertToDraftTests(DraftPublishedOpBaseTestSetup):
             elif self.is_old_mongo_modulestore:
                 # Old Mongo:
                 # Direct-only categories are never allowed to be converted to draft.
-                with self.assertRaises(InvalidVersionError):
+                with pytest.raises(InvalidVersionError):
                     self.convert_to_draft(block_list_to_convert)
             else:
                 raise Exception("Must test either Old Mongo or Split modulestore!")
@@ -1212,7 +1204,7 @@ class ElementalRevertToPublishedTests(DraftPublishedOpBaseTestSetup):
             self.assertOLXIsDraftOnly(block_list_to_revert)
             # Now, without publishing anything first, revert the same vertical to published.
             # Since no published version exists, an exception is raised.
-            with self.assertRaises(InvalidVersionError):
+            with pytest.raises(InvalidVersionError):
                 self.revert_to_published(block_list_to_revert)
 
     @ddt.data(*MODULESTORE_SETUPS)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_semantics.py b/common/lib/xmodule/xmodule/modulestore/tests/test_semantics.py
index e432aef030b5973c0d1784b30d663a470cc6737c..0dcb2c90497e4d4273e6411d29dc4dc60ad41943 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_semantics.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_semantics.py
@@ -6,6 +6,7 @@ Tests of modulestore semantics: How do the interfaces methods of ModuleStore rel
 import itertools
 from collections import namedtuple
 
+import pytest
 import ddt
 from mock import patch
 from xblock.core import XBlock, XBlockAside
@@ -79,12 +80,12 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
         """
         if draft is None or draft:
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
-                with self.assertRaises(ItemNotFoundError):
+                with pytest.raises(ItemNotFoundError):
                     self.store.get_item(block_usage_key)
 
         if draft is None or not draft:
             with self.store.branch_setting(ModuleStoreEnum.Branch.published_only):
-                with self.assertRaises(ItemNotFoundError):
+                with pytest.raises(ItemNotFoundError):
                     self.store.get_item(block_usage_key)
 
     def assertBlockHasContent(self, block_usage_key, field_name, content,
@@ -108,22 +109,22 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
                 target_block = self.store.get_item(
                     block_usage_key,
                 )
-                self.assertEqual(content, target_block.fields[field_name].read_from(target_block))
+                assert content == target_block.fields[field_name].read_from(target_block)
                 if aside_field_name and aside_content:
                     aside = self._get_aside(target_block)
-                    self.assertIsNotNone(aside)
-                    self.assertEqual(aside_content, aside.fields[aside_field_name].read_from(aside))
+                    assert aside is not None
+                    assert aside_content == aside.fields[aside_field_name].read_from(aside)
 
         if draft is None or draft:
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
                 target_block = self.store.get_item(
                     block_usage_key,
                 )
-                self.assertEqual(content, target_block.fields[field_name].read_from(target_block))
+                assert content == target_block.fields[field_name].read_from(target_block)
                 if aside_field_name and aside_content:
                     aside = self._get_aside(target_block)
-                    self.assertIsNotNone(aside)
-                    self.assertEqual(aside_content, aside.fields[aside_field_name].read_from(aside))
+                    assert aside is not None
+                    assert aside_content == aside.fields[aside_field_name].read_from(aside)
 
     def assertParentOf(self, parent_usage_key, child_usage_key, draft=None):
         """
@@ -142,14 +143,14 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
                 parent_block = self.store.get_item(
                     parent_usage_key,
                 )
-                self.assertIn(child_usage_key, parent_block.children)
+                assert child_usage_key in parent_block.children
 
         if draft is None or draft:
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
                 parent_block = self.store.get_item(
                     parent_usage_key,
                 )
-                self.assertIn(child_usage_key, parent_block.children)
+                assert child_usage_key in parent_block.children
 
     def assertNotParentOf(self, parent_usage_key, child_usage_key, draft=None):
         """
@@ -168,14 +169,14 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
                 parent_block = self.store.get_item(
                     parent_usage_key,
                 )
-                self.assertNotIn(child_usage_key, parent_block.children)
+                assert child_usage_key not in parent_block.children
 
         if draft is None or draft:
             with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
                 parent_block = self.store.get_item(
                     parent_usage_key,
                 )
-                self.assertNotIn(child_usage_key, parent_block.children)
+                assert child_usage_key not in parent_block.children
 
     def assertCoursePointsToBlock(self, block_usage_key, draft=None):
         """
@@ -215,7 +216,7 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
             expected_fields = CourseSummary.course_info_fields + ['id', 'location', 'has_ended']
             return all([hasattr(course_summary, field) for field in expected_fields])
 
-        self.assertTrue(all(verify_course_summery_fields(course_summary) for course_summary in course_summaries))
+        assert all((verify_course_summery_fields(course_summary) for course_summary in course_summaries))
 
     def is_detached(self, block_type):
         """
@@ -313,7 +314,7 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
             test_data = self.DATA_FIELDS[block_type]
 
             updated_field_value = test_data.updated
-            self.assertNotEqual(updated_field_value, block.fields[test_data.field_name].read_from(block))
+            assert updated_field_value != block.fields[test_data.field_name].read_from(block)
 
             block.fields[test_data.field_name].write_to(block, updated_field_value)
 
@@ -338,13 +339,13 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
             course_summaries = self.store.get_course_summaries()
 
             # Verify course summaries
-            self.assertEqual(len(course_summaries), 1)
+            assert len(course_summaries) == 1
 
             # Verify that all course summary objects have the required attributes.
             self.assertCourseSummaryFields(course_summaries)
 
             # Verify fetched accessible courses list is a list of CourseSummery instances
-            self.assertTrue(all(isinstance(course, CourseSummary) for course in course_summaries))
+            assert all((isinstance(course, CourseSummary) for course in course_summaries))
 
     @ddt.data(*itertools.product(['chapter', 'sequential'], [True, False]))
     @ddt.unpack
@@ -437,7 +438,7 @@ class TestSplitDirectOnlyCategorySemantics(DirectOnlyCategorySemantics):
         with self.store.branch_setting(ModuleStoreEnum.Branch.draft_preferred):
             block = self.store.get_item(block_usage_key)
             aside = self._get_aside(block)
-            self.assertIsNotNone(aside)
+            assert aside is not None
             aside.fields[self.ASIDE_DATA_FIELD.field_name].write_to(aside, self.ASIDE_DATA_FIELD.updated)
 
             self.store.update_item(block, ModuleStoreEnum.UserID.test, allow_not_found=True, asides=[aside])
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_split_copy_from_template.py b/common/lib/xmodule/xmodule/modulestore/tests/test_split_copy_from_template.py
index 099b17e5641fbcab33ab8a2669dbdd5f042b4cc8..86eb5e0f312d37ad8490ac160a4c586ce841fa4b 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_split_copy_from_template.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_split_copy_from_template.py
@@ -7,6 +7,7 @@ However for these tests, we make sure it also works when copying from course to
 
 import ddt
 from six.moves import range
+import pytest
 
 from xmodule.modulestore import ModuleStoreEnum
 from xmodule.modulestore.exceptions import ItemNotFoundError
@@ -49,20 +50,20 @@ class TestSplitCopyTemplate(MixedSplitTestCase):
         # Inherit the vertical and the problem from the library into the course:
         source_keys = [source_container.children[0]]
         new_blocks = self.store.copy_from_template(source_keys, dest_key=course.location, user_id=self.user_id)
-        self.assertEqual(len(new_blocks), 1)
+        assert len(new_blocks) == 1
 
         course = self.store.get_course(course.location.course_key)  # Reload from modulestore
 
-        self.assertEqual(len(course.children), 1)
+        assert len(course.children) == 1
         vertical_block_course = self.store.get_item(course.children[0])
-        self.assertEqual(new_blocks[0], vertical_block_course.location)
+        assert new_blocks[0] == vertical_block_course.location
         problem_block_course = self.store.get_item(vertical_block_course.children[0])
-        self.assertEqual(problem_block_course.display_name, problem_library_display_name)
+        assert problem_block_course.display_name == problem_library_display_name
 
         # Check that when capa modules are copied, their "markdown" fields (Scope.settings) are removed.
         # (See note in split.py:copy_from_template())
-        self.assertIsNotNone(problem_block.markdown)
-        self.assertIsNone(problem_block_course.markdown)
+        assert problem_block.markdown is not None
+        assert problem_block_course.markdown is None
 
         # Override the display_name and weight:
         new_display_name = "The Trouble with Tribbles"
@@ -77,16 +78,16 @@ class TestSplitCopyTemplate(MixedSplitTestCase):
 
         # Repeat the copy_from_template():
         new_blocks2 = self.store.copy_from_template(source_keys, dest_key=course.location, user_id=self.user_id)
-        self.assertEqual(new_blocks, new_blocks2)
+        assert new_blocks == new_blocks2
         # Reload problem_block_course:
         problem_block_course = self.store.get_item(problem_block_course.location)
-        self.assertEqual(problem_block_course.display_name, new_display_name)
-        self.assertEqual(problem_block_course.weight, new_weight)
+        assert problem_block_course.display_name == new_display_name
+        assert problem_block_course.weight == new_weight
 
         # Ensure that extra_block was deleted:
         vertical_block_course = self.store.get_item(new_blocks2[0])
-        self.assertEqual(len(vertical_block_course.children), 1)
-        with self.assertRaises(ItemNotFoundError):
+        assert len(vertical_block_course.children) == 1
+        with pytest.raises(ItemNotFoundError):
             self.store.get_item(extra_block.location)
 
     def test_copy_from_template_publish(self):
@@ -119,7 +120,7 @@ class TestSplitCopyTemplate(MixedSplitTestCase):
             problem_published = self.store.get_item(
                 problem_key_in_course.for_branch(ModuleStoreEnum.BranchName.published)
             )
-            self.assertEqual(problem_published.display_name, display_name_expected)
+            assert problem_published.display_name == display_name_expected
 
     def test_copy_from_template_auto_publish(self):
         """
@@ -146,7 +147,7 @@ class TestSplitCopyTemplate(MixedSplitTestCase):
         # Inherit the vertical and the problem from the library into the course:
         source_keys = [block.location for block in [about, chapter, html]]
         block_keys = self.store.copy_from_template(source_keys, dest_key=course.location, user_id=self.user_id)
-        self.assertEqual(len(block_keys), len(source_keys))
+        assert len(block_keys) == len(source_keys)
 
         # Build dict of the new blocks in 'course', keyed by category (which is a unique key in our case)
         new_blocks = {}
@@ -167,14 +168,15 @@ class TestSplitCopyTemplate(MixedSplitTestCase):
                 return False
 
         # Check that the auto-publish blocks have been published:
-        self.assertFalse(self.store.has_changes(new_blocks["about"]))
+        assert not self.store.has_changes(new_blocks['about'])
         # We can't use has_changes because it includes descendants
-        self.assertTrue(published_version_exists(new_blocks["chapter"]))
-        self.assertTrue(published_version_exists(new_blocks["sequential"]))  # Ditto
+        assert published_version_exists(new_blocks['chapter'])
+        assert published_version_exists(new_blocks['sequential'])
+        # Ditto
         # Check that non-auto-publish blocks and blocks with non-auto-publish descendants show changes:
-        self.assertTrue(self.store.has_changes(new_blocks["html"]))
-        self.assertTrue(self.store.has_changes(new_blocks["problem"]))
+        assert self.store.has_changes(new_blocks['html'])
+        assert self.store.has_changes(new_blocks['problem'])
         # Will have changes since a child block has changes.
-        self.assertTrue(self.store.has_changes(new_blocks["chapter"]))
+        assert self.store.has_changes(new_blocks['chapter'])
         # Verify that our published_version_exists works
-        self.assertFalse(published_version_exists(new_blocks["vertical"]))
+        assert not published_version_exists(new_blocks['vertical'])
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_split_migrator.py b/common/lib/xmodule/xmodule/modulestore/tests/test_split_migrator.py
index 89d1e0c2f939d32e3412e7f461d125916985b31c..60600ff79872507354a4302ea94c5a7773503dfb 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_split_migrator.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_split_migrator.py
@@ -165,7 +165,7 @@ class TestMigration(SplitWMongoCourseBootstrapper):
 
     def compare_dags(self, presplit, presplit_dag_root, split_dag_root, published):  # lint-amnesty, pylint: disable=missing-function-docstring
         if split_dag_root.category != 'course':
-            self.assertEqual(presplit_dag_root.location.block_id, split_dag_root.location.block_id)
+            assert presplit_dag_root.location.block_id == split_dag_root.location.block_id
         # compare all fields but references
         for name, field in six.iteritems(presplit_dag_root.fields):
             # fields generated from UNIQUE_IDs are unique to an XBlock's scope,
@@ -176,23 +176,11 @@ class TestMigration(SplitWMongoCourseBootstrapper):
                 field_generated_from_unique_id or isinstance(field, (Reference, ReferenceList, ReferenceValueDict))
             )
             if should_check_field:
-                self.assertEqual(
-                    getattr(presplit_dag_root, name),
-                    getattr(split_dag_root, name),
-                    u"{}/{}: {} != {}".format(
-                        split_dag_root.location, name, getattr(presplit_dag_root, name), getattr(split_dag_root, name)
-                    )
-                )
+                assert getattr(presplit_dag_root, name) == getattr(split_dag_root, name), f'{split_dag_root.location}/{name}: {getattr(presplit_dag_root, name)} != {getattr(split_dag_root, name)}'  # pylint: disable=line-too-long
 
         # compare children
         if presplit_dag_root.has_children:
-            self.assertEqual(
-                # need get_children to filter out drafts
-                len(presplit_dag_root.get_children()), len(split_dag_root.children),
-                u"{0.category} '{0.display_name}': children  {1} != {2}".format(
-                    presplit_dag_root, presplit_dag_root.children, split_dag_root.children
-                )
-            )
+            assert len(presplit_dag_root.get_children()) == len(split_dag_root.children), f"{presplit_dag_root.category} '{presplit_dag_root.display_name}': children  {presplit_dag_root.children} != {split_dag_root.children}"  # pylint: disable=line-too-long
             for pre_child, split_child in zip(presplit_dag_root.get_children(), split_dag_root.get_children()):
                 self.compare_dags(presplit, pre_child, split_child, published)
 
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py
index 14856a3c00ed1384ddb320767df2e436b7907226..7391e8f7632f04863370754788a06e72d1f9a72d 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py
@@ -10,6 +10,7 @@ import re
 import unittest
 from importlib import import_module
 
+import pytest
 import ddt
 import six
 from ccx_keys.locator import CCXBlockUsageLocator
@@ -589,25 +590,25 @@ class TestHasChildrenAtDepth(SplitModuleTest):
         self.assertRaises(
             ValueError, block.has_children_at_depth, -1,
         )
-        self.assertTrue(block.has_children_at_depth(0))
-        self.assertTrue(block.has_children_at_depth(1))
-        self.assertFalse(block.has_children_at_depth(2))
+        assert block.has_children_at_depth(0)
+        assert block.has_children_at_depth(1)
+        assert not block.has_children_at_depth(2)
 
         ch1 = modulestore().get_item(
             BlockUsageLocator(course_locator, 'chapter', block_id='chapter1')
         )
-        self.assertFalse(ch1.has_children_at_depth(0))
+        assert not ch1.has_children_at_depth(0)
 
         ch2 = modulestore().get_item(
             BlockUsageLocator(course_locator, 'chapter', block_id='chapter2')
         )
-        self.assertFalse(ch2.has_children_at_depth(0))
+        assert not ch2.has_children_at_depth(0)
 
         ch3 = modulestore().get_item(
             BlockUsageLocator(course_locator, 'chapter', block_id='chapter3')
         )
-        self.assertTrue(ch3.has_children_at_depth(0))
-        self.assertFalse(ch3.has_children_at_depth(1))
+        assert ch3.has_children_at_depth(0)
+        assert not ch3.has_children_at_depth(1)
 
 
 @ddt.ddt
@@ -620,23 +621,17 @@ class SplitModuleCourseTests(SplitModuleTest):
     def test_get_courses(self, _from_json):
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT)
         # should have gotten 3 draft courses
-        self.assertEqual(len(courses), 3, "Wrong number of courses")
+        assert len(courses) == 3, 'Wrong number of courses'
         # check metadata -- NOTE no promised order
         course = self.findByIdInResult(courses, "head12345")
-        self.assertEqual(course.location.org, "testx")
-        self.assertEqual(course.category, 'course', 'wrong category')
-        self.assertEqual(len(course.tabs), 6, "wrong number of tabs")
-        self.assertEqual(
-            course.display_name, "The Ancient Greek Hero",
-            "wrong display name"
-        )
-        self.assertEqual(
-            course.advertised_start, "Fall 2013",
-            "advertised_start"
-        )
-        self.assertEqual(len(course.children), 4, "children")
+        assert course.location.org == 'testx'
+        assert course.category == 'course', 'wrong category'
+        assert len(course.tabs) == 6, 'wrong number of tabs'
+        assert course.display_name == 'The Ancient Greek Hero', 'wrong display name'
+        assert course.advertised_start == 'Fall 2013', 'advertised_start'
+        assert len(course.children) == 4, 'children'
         # check dates and graders--forces loading of descriptor
-        self.assertEqual(course.edited_by, "testassist@edx.org")
+        assert course.edited_by == 'testassist@edx.org'
         self.assertDictEqual(course.grade_cutoffs, {"Pass": 0.45})
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
@@ -647,7 +642,7 @@ class SplitModuleCourseTests(SplitModuleTest):
         """
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT)
         # Should have gotten 3 draft courses.
-        self.assertEqual(len(courses), 3)
+        assert len(courses) == 3
 
         course_index = modulestore().get_course_index_info(courses[0].id)
         # Creating a new course with same course index of another course.
@@ -656,44 +651,42 @@ class SplitModuleCourseTests(SplitModuleTest):
         )
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT)
         # Should have gotten 4 draft courses.
-        self.assertEqual(len(courses), 4)
-        self.assertIn(new_draft_course.id.version_agnostic(), [c.id for c in courses])
+        assert len(courses) == 4
+        assert new_draft_course.id.version_agnostic() in [c.id for c in courses]
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_get_org_courses(self, _from_json):
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT, org='guestx')
 
         # should have gotten 1 draft courses
-        self.assertEqual(len(courses), 1)
+        assert len(courses) == 1
 
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT, org='testx')
 
         # should have gotten 2 draft courses
-        self.assertEqual(len(courses), 2)
+        assert len(courses) == 2
 
         # although this is already covered in other tests, let's
         # also not pass in org= parameter to make sure we get back
         # 3 courses
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT)
-        self.assertEqual(len(courses), 3)
+        assert len(courses) == 3
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_branch_requests(self, _from_json):
         # query w/ branch qualifier (both draft and published)
         def _verify_published_course(courses_published):
             """ Helper function for verifying published course. """
-            self.assertEqual(len(courses_published), 1, len(courses_published))
+            assert len(courses_published) == 1, len(courses_published)
             course = self.findByIdInResult(courses_published, "head23456")
-            self.assertIsNotNone(course, "published courses")
-            self.assertEqual(course.location.course_key.org, "testx")
-            self.assertEqual(course.location.course_key.course, "wonderful")
-            self.assertEqual(course.category, 'course', 'wrong category')
-            self.assertEqual(len(course.tabs), 4, "wrong number of tabs")
-            self.assertEqual(course.display_name, "The most wonderful course",
-                             course.display_name)
-            self.assertIsNone(course.advertised_start)
-            self.assertEqual(len(course.children), 0,
-                             "children")
+            assert course is not None, 'published courses'
+            assert course.location.course_key.org == 'testx'
+            assert course.location.course_key.course == 'wonderful'
+            assert course.category == 'course', 'wrong category'
+            assert len(course.tabs) == 4, 'wrong number of tabs'
+            assert course.display_name == 'The most wonderful course', course.display_name
+            assert course.advertised_start is None
+            assert len(course.children) == 0, 'children'
 
         _verify_published_course(modulestore().get_courses(branch=BRANCH_NAME_PUBLISHED))
 
@@ -715,34 +708,34 @@ class SplitModuleCourseTests(SplitModuleTest):
         '''
         locator = CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT)
         head_course = modulestore().get_course(locator)
-        self.assertNotEqual(head_course.location.version_guid, head_course.previous_version)
+        assert head_course.location.version_guid != head_course.previous_version
         locator = CourseLocator(version_guid=head_course.previous_version)
         course = modulestore().get_course(locator)
-        self.assertIsNone(course.location.course_key.org)
-        self.assertEqual(course.location.version_guid, head_course.previous_version)
-        self.assertEqual(course.category, 'course')
-        self.assertEqual(len(course.tabs), 6)
-        self.assertEqual(course.display_name, "The Ancient Greek Hero")
-        self.assertEqual(course.graceperiod, datetime.timedelta(hours=2))
-        self.assertIsNone(course.advertised_start)
-        self.assertEqual(len(course.children), 0)
-        self.assertNotEqual(course.definition_locator.definition_id, head_course.definition_locator.definition_id)
+        assert course.location.course_key.org is None
+        assert course.location.version_guid == head_course.previous_version
+        assert course.category == 'course'
+        assert len(course.tabs) == 6
+        assert course.display_name == 'The Ancient Greek Hero'
+        assert course.graceperiod == datetime.timedelta(hours=2)
+        assert course.advertised_start is None
+        assert len(course.children) == 0
+        assert course.definition_locator.definition_id != head_course.definition_locator.definition_id
         # check dates and graders--forces loading of descriptor
-        self.assertEqual(course.edited_by, "testassist@edx.org")
+        assert course.edited_by == 'testassist@edx.org'
         self.assertDictEqual(course.grade_cutoffs, {"Pass": 0.55})
 
         locator = CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT)
         course = modulestore().get_course(locator)
-        self.assertEqual(course.location.course_key.org, "testx")
-        self.assertEqual(course.location.course_key.course, "GreekHero")
-        self.assertEqual(course.location.course_key.run, "run")
-        self.assertEqual(course.category, 'course')
-        self.assertEqual(len(course.tabs), 6)
-        self.assertEqual(course.display_name, "The Ancient Greek Hero")
-        self.assertEqual(course.advertised_start, "Fall 2013")
-        self.assertEqual(len(course.children), 4)
+        assert course.location.course_key.org == 'testx'
+        assert course.location.course_key.course == 'GreekHero'
+        assert course.location.course_key.run == 'run'
+        assert course.category == 'course'
+        assert len(course.tabs) == 6
+        assert course.display_name == 'The Ancient Greek Hero'
+        assert course.advertised_start == 'Fall 2013'
+        assert len(course.children) == 4
         # check dates and graders--forces loading of descriptor
-        self.assertEqual(course.edited_by, "testassist@edx.org")
+        assert course.edited_by == 'testassist@edx.org'
         self.assertDictEqual(course.grade_cutoffs, {"Pass": 0.45})
 
         locator = CourseLocator(org='testx', course='wonderful', run="run", branch=BRANCH_NAME_PUBLISHED)
@@ -751,15 +744,15 @@ class SplitModuleCourseTests(SplitModuleTest):
 
         locator = CourseLocator(org='testx', course='wonderful', run="run", branch=BRANCH_NAME_DRAFT)
         course = modulestore().get_course(locator)
-        self.assertNotEqual(course.location.version_guid, published_version)
+        assert course.location.version_guid != published_version
 
     def test_get_course_negative(self):
         # Now negative testing
-        with self.assertRaises(InsufficientSpecificationError):
+        with pytest.raises(InsufficientSpecificationError):
             modulestore().get_course(CourseLocator(org='edu', course='meh', run='blah'))
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_course(CourseLocator(org='edu', course='nosuchthing', run="run", branch=BRANCH_NAME_DRAFT))  # lint-amnesty, pylint: disable=line-too-long
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_course(CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_PUBLISHED))  # lint-amnesty, pylint: disable=line-too-long
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
@@ -772,8 +765,8 @@ class SplitModuleCourseTests(SplitModuleTest):
         block_map = modulestore().cache_items(
             course.system, [BlockKey.from_usage_key(child) for child in course.children], course.id, depth=3
         )
-        self.assertIn(BlockKey('chapter', 'chapter1'), block_map)
-        self.assertIn(BlockKey('problem', 'problem3_2'), block_map)
+        assert BlockKey('chapter', 'chapter1') in block_map
+        assert BlockKey('problem', 'problem3_2') in block_map
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_course_successors(self, _from_json):
@@ -789,23 +782,23 @@ class SplitModuleCourseTests(SplitModuleTest):
 
         locator = CourseLocator(version_guid=course.previous_version)
         result = modulestore().get_course_successors(locator)
-        self.assertIsInstance(result, VersionTree)
-        self.assertIsNone(result.locator.org)
-        self.assertEqual(result.locator.version_guid, versions[-1])
-        self.assertEqual(len(result.children), 1)
-        self.assertEqual(result.children[0].locator.version_guid, versions[-2])
-        self.assertEqual(len(result.children[0].children), 0, "descended more than one level")
+        assert isinstance(result, VersionTree)
+        assert result.locator.org is None
+        assert result.locator.version_guid == versions[(- 1)]
+        assert len(result.children) == 1
+        assert result.children[0].locator.version_guid == versions[(- 2)]
+        assert len(result.children[0].children) == 0, 'descended more than one level'
 
         result = modulestore().get_course_successors(locator, version_history_depth=2)
-        self.assertEqual(len(result.children), 1)
-        self.assertEqual(result.children[0].locator.version_guid, versions[-2])
-        self.assertEqual(len(result.children[0].children), 1)
+        assert len(result.children) == 1
+        assert result.children[0].locator.version_guid == versions[(- 2)]
+        assert len(result.children[0].children) == 1
 
         result = modulestore().get_course_successors(locator, version_history_depth=99)
-        self.assertEqual(len(result.children), 1)
-        self.assertEqual(result.children[0].locator.version_guid, versions[-2])
-        self.assertEqual(len(result.children[0].children), 1)
-        self.assertEqual(result.children[0].children[0].locator.version_guid, versions[0])
+        assert len(result.children) == 1
+        assert result.children[0].locator.version_guid == versions[(- 2)]
+        assert len(result.children[0].children) == 1
+        assert result.children[0].children[0].locator.version_guid == versions[0]
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_persist_dag(self, _from_json):
@@ -821,7 +814,7 @@ class SplitModuleCourseTests(SplitModuleTest):
             test_course.system, test_course.id, 'chapter', fields={'display_name': 'chapter n'},
             parent_xblock=test_course
         )
-        self.assertEqual(test_chapter.display_name, 'chapter n')
+        assert test_chapter.display_name == 'chapter n'
         test_def_content = '<problem>boo</problem>'
         # create child
         new_block = modulestore().create_xblock(
@@ -833,24 +826,24 @@ class SplitModuleCourseTests(SplitModuleTest):
             },
             parent_xblock=test_chapter
         )
-        self.assertIsNotNone(new_block.definition_locator)
-        self.assertTrue(isinstance(new_block.definition_locator.definition_id, LocalId))
+        assert new_block.definition_locator is not None
+        assert isinstance(new_block.definition_locator.definition_id, LocalId)
         # better to pass in persisted parent over the subdag so
         # subdag gets the parent pointer (otherwise 2 ops, persist dag, update parent children,
         # persist parent
         persisted_course = modulestore().persist_xblock_dag(test_course, 'testbot')
-        self.assertEqual(len(persisted_course.children), 1)
+        assert len(persisted_course.children) == 1
         persisted_chapter = persisted_course.get_children()[0]
-        self.assertEqual(persisted_chapter.category, 'chapter')
-        self.assertEqual(persisted_chapter.display_name, 'chapter n')
-        self.assertEqual(len(persisted_chapter.children), 1)
+        assert persisted_chapter.category == 'chapter'
+        assert persisted_chapter.display_name == 'chapter n'
+        assert len(persisted_chapter.children) == 1
         persisted_problem = persisted_chapter.get_children()[0]
-        self.assertEqual(persisted_problem.category, 'problem')
-        self.assertEqual(persisted_problem.data, test_def_content)
+        assert persisted_problem.category == 'problem'
+        assert persisted_problem.data == test_def_content
         # update it
         persisted_problem.display_name = 'altered problem'
         persisted_problem = modulestore().update_item(persisted_problem, 'testbot')
-        self.assertEqual(persisted_problem.display_name, 'altered problem')
+        assert persisted_problem.display_name == 'altered problem'
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_block_generations(self, _from_json):
@@ -886,9 +879,9 @@ class SplitModuleCourseTests(SplitModuleTest):
         first_problem.max_attempts = 3
         first_problem.save()  # decache the above into the kvs
         updated_problem = modulestore().update_item(first_problem, 'testbot')
-        self.assertIsNotNone(updated_problem.previous_version)
-        self.assertEqual(updated_problem.previous_version, first_problem.update_version)
-        self.assertNotEqual(updated_problem.update_version, first_problem.update_version)
+        assert updated_problem.previous_version is not None
+        assert updated_problem.previous_version == first_problem.update_version
+        assert updated_problem.update_version != first_problem.update_version
         modulestore().delete_item(updated_problem.location, 'testbot')
 
         second_problem = modulestore().create_child(
@@ -901,27 +894,28 @@ class SplitModuleCourseTests(SplitModuleTest):
         # The draft course root has 2 revisions: the published revision, and then the subsequent
         # changes to the draft revision
         version_history = modulestore().get_block_generations(test_course.location)
-        self.assertIsNotNone(version_history)
-        self.assertEqual(version_history.locator.version_guid, test_course.location.version_guid)
-        self.assertEqual(len(version_history.children), 1)
-        self.assertEqual(version_history.children[0].children, [])
-        self.assertEqual(version_history.children[0].locator.version_guid, chapter.location.version_guid)
+        assert version_history is not None
+        assert version_history.locator.version_guid == test_course.location.version_guid
+        assert len(version_history.children) == 1
+        assert version_history.children[0].children == []
+        assert version_history.children[0].locator.version_guid == chapter.location.version_guid
 
         # sub changed on add, add problem, delete problem, add problem in strict linear seq
         version_history = modulestore().get_block_generations(sub.location)
-        self.assertEqual(len(version_history.children), 1)
-        self.assertEqual(len(version_history.children[0].children), 1)
-        self.assertEqual(len(version_history.children[0].children[0].children), 1)
-        self.assertEqual(len(version_history.children[0].children[0].children[0].children), 0)
+        assert len(version_history.children) == 1
+        assert len(version_history.children[0].children) == 1
+        assert len(version_history.children[0].children[0].children) == 1
+        assert len(version_history.children[0].children[0].children[0].children) == 0
 
         # first and second problem may show as same usage_id; so, need to ensure their histories are right
         version_history = modulestore().get_block_generations(updated_problem.location)
-        self.assertEqual(version_history.locator.version_guid, first_problem.location.version_guid)
-        self.assertEqual(len(version_history.children), 1)  # updated max_attempts
-        self.assertEqual(len(version_history.children[0].children), 0)
+        assert version_history.locator.version_guid == first_problem.location.version_guid
+        assert len(version_history.children) == 1
+        # updated max_attempts
+        assert len(version_history.children[0].children) == 0
 
         version_history = modulestore().get_block_generations(second_problem.location)
-        self.assertNotEqual(version_history.locator.version_guid, first_problem.location.version_guid)
+        assert version_history.locator.version_guid != first_problem.location.version_guid
 
     @ddt.data(
         ("course-v1:edx+test_course+test_run", BlockUsageLocator),
@@ -935,9 +929,9 @@ class SplitModuleCourseTests(SplitModuleTest):
         """
         course_key = CourseKey.from_string(course_id)
         root_block_key = modulestore().make_course_usage_key(course_key)
-        self.assertIsInstance(root_block_key, root_block_cls)
-        self.assertEqual(root_block_key.block_type, "course")
-        self.assertEqual(root_block_key.block_id, "course")
+        assert isinstance(root_block_key, root_block_cls)
+        assert root_block_key.block_type == 'course'
+        assert root_block_key.block_id == 'course'
 
 
 class TestCourseStructureCache(SplitModuleTest):
@@ -975,7 +969,7 @@ class TestCourseStructureCache(SplitModuleTest):
             cached_structure = self._get_structure(self.new_course)
 
         # now make sure that you get the same structure
-        self.assertEqual(cached_structure, not_cached_structure)
+        assert cached_structure == not_cached_structure
 
         # If data is corrupted, get it from mongo again.
         cache_key = self.new_course.id.version_guid
@@ -984,7 +978,7 @@ class TestCourseStructureCache(SplitModuleTest):
             not_corrupt_structure = self._get_structure(self.new_course)
 
         # now make sure that you get the same structure
-        self.assertEqual(not_corrupt_structure, not_cached_structure)
+        assert not_corrupt_structure == not_cached_structure
 
     @patch('xmodule.modulestore.split_mongo.mongo_connection.get_cache')
     def test_course_structure_cache_no_cache_configured(self, mock_get_cache):
@@ -999,7 +993,7 @@ class TestCourseStructureCache(SplitModuleTest):
             cached_structure = self._get_structure(self.new_course)
 
         # now make sure that you get the same structure
-        self.assertEqual(cached_structure, not_cached_structure)
+        assert cached_structure == not_cached_structure
 
     def test_dummy_cache(self):
         with check_mongo_calls(1):
@@ -1011,7 +1005,7 @@ class TestCourseStructureCache(SplitModuleTest):
             cached_structure = self._get_structure(self.new_course)
 
         # now make sure that you get the same structure
-        self.assertEqual(cached_structure, not_cached_structure)
+        assert cached_structure == not_cached_structure
 
     def _get_structure(self, course):
         """
@@ -1040,31 +1034,18 @@ class SplitModuleItemTests(SplitModuleTest):
         previous_version = course.previous_version
         # positive tests of various forms
         locator = course.location.map_into_course(CourseLocator(version_guid=previous_version))
-        self.assertTrue(
-            modulestore().has_item(locator), "couldn't find in %s" % previous_version
-        )
+        assert modulestore().has_item(locator), ("couldn't find in %s" % previous_version)
 
         locator = course.location.version_agnostic()
-        self.assertTrue(
-            modulestore().has_item(locator),
-        )
-        self.assertFalse(
-            modulestore().has_item(
-                BlockUsageLocator(
-                    locator.course_key.for_branch(BRANCH_NAME_PUBLISHED),
-                    block_type=locator.block_type,
-                    block_id=locator.block_id
-                )
-            ),
-            "found in published head"
-        )
+        assert modulestore().has_item(locator)
+        assert not modulestore()\
+            .has_item(BlockUsageLocator(locator.course_key.for_branch(BRANCH_NAME_PUBLISHED),
+                                        block_type=locator.block_type,
+                                        block_id=locator.block_id)), 'found in published head'
 
         # not a course obj
         locator = BlockUsageLocator(course_locator, block_type='chapter', block_id='chapter1')
-        self.assertTrue(
-            modulestore().has_item(locator),
-            "couldn't find chapter1"
-        )
+        assert modulestore().has_item(locator), "couldn't find chapter1"
 
         # in published course
         locator = BlockUsageLocator(
@@ -1072,9 +1053,7 @@ class SplitModuleItemTests(SplitModuleTest):
             block_type="course",
             block_id="head23456"
         )
-        self.assertTrue(
-            modulestore().has_item(locator.for_branch(BRANCH_NAME_PUBLISHED))
-        )
+        assert modulestore().has_item(locator.for_branch(BRANCH_NAME_PUBLISHED))
 
     def test_negative_has_item(self):
         # negative tests--not found
@@ -1084,13 +1063,13 @@ class SplitModuleItemTests(SplitModuleTest):
             block_type="course",
             block_id="head23456"
         )
-        self.assertFalse(modulestore().has_item(locator))
+        assert not modulestore().has_item(locator)
         locator = BlockUsageLocator(
             CourseLocator(org="testx", course="wonderful", run="run", branch=BRANCH_NAME_DRAFT),
             block_type="vertical",
             block_id="doesnotexist"
         )
-        self.assertFalse(modulestore().has_item(locator))
+        assert not modulestore().has_item(locator)
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_get_item(self, _from_json):
@@ -1104,22 +1083,22 @@ class SplitModuleItemTests(SplitModuleTest):
         # positive tests of various forms
         locator = course.location.map_into_course(CourseLocator(version_guid=previous_version))
         block = modulestore().get_item(locator)
-        self.assertIsInstance(block, CourseDescriptor)
-        self.assertIsInstance(modulestore().get_item(locator), CourseDescriptor)
+        assert isinstance(block, CourseDescriptor)
+        assert isinstance(modulestore().get_item(locator), CourseDescriptor)
 
         def verify_greek_hero(block):
             """
             Check contents of block
             """
-            self.assertEqual(block.location.org, "testx")
-            self.assertEqual(block.location.course, "GreekHero")
-            self.assertEqual(block.location.run, "run")
-            self.assertEqual(len(block.tabs), 6, "wrong number of tabs")
-            self.assertEqual(block.display_name, "The Ancient Greek Hero")
-            self.assertEqual(block.advertised_start, "Fall 2013")
-            self.assertEqual(len(block.children), 4)
+            assert block.location.org == 'testx'
+            assert block.location.course == 'GreekHero'
+            assert block.location.run == 'run'
+            assert len(block.tabs) == 6, 'wrong number of tabs'
+            assert block.display_name == 'The Ancient Greek Hero'
+            assert block.advertised_start == 'Fall 2013'
+            assert len(block.children) == 4
             # check dates and graders--forces loading of descriptor
-            self.assertEqual(block.edited_by, "testassist@edx.org")
+            assert block.edited_by == 'testassist@edx.org'
             self.assertDictEqual(
                 block.grade_cutoffs, {"Pass": 0.45},
             )
@@ -1127,7 +1106,7 @@ class SplitModuleItemTests(SplitModuleTest):
         verify_greek_hero(modulestore().get_item(course.location))
 
         # try to look up other branches
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_item(course.location.for_branch(BRANCH_NAME_PUBLISHED))
 
     def test_get_non_root(self):
@@ -1136,32 +1115,29 @@ class SplitModuleItemTests(SplitModuleTest):
             CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT), 'chapter', 'chapter1'
         )
         block = modulestore().get_item(locator)
-        self.assertEqual(block.location.org, "testx")
-        self.assertEqual(block.location.course, "GreekHero")
-        self.assertEqual(block.category, 'chapter')
-        self.assertEqual(block.display_name, "Hercules")
-        self.assertEqual(block.edited_by, "testassist@edx.org")
+        assert block.location.org == 'testx'
+        assert block.location.course == 'GreekHero'
+        assert block.category == 'chapter'
+        assert block.display_name == 'Hercules'
+        assert block.edited_by == 'testassist@edx.org'
 
         # in published course
         locator = BlockUsageLocator(
             CourseLocator(org='testx', course='wonderful', run="run", branch=BRANCH_NAME_PUBLISHED), 'course', 'head23456'  # lint-amnesty, pylint: disable=line-too-long
         )
-        self.assertIsInstance(
-            modulestore().get_item(locator),
-            CourseDescriptor
-        )
+        assert isinstance(modulestore().get_item(locator), CourseDescriptor)
 
         # negative tests--not found
         # no such course or block
         locator = BlockUsageLocator(
             CourseLocator(org='doesnotexist', course='doesnotexist', run="run", branch=BRANCH_NAME_DRAFT), 'course', 'head23456'  # lint-amnesty, pylint: disable=line-too-long
         )
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_item(locator)
         locator = BlockUsageLocator(
             CourseLocator(org='testx', course='wonderful', run="run", branch=BRANCH_NAME_DRAFT), 'html', 'doesnotexist'
         )
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_item(locator)
 
     # pylint: disable=protected-access
@@ -1169,41 +1145,37 @@ class SplitModuleItemTests(SplitModuleTest):
         '''
         test the block and value matches help functions
         '''
-        self.assertTrue(modulestore()._value_matches('help', 'help'))
-        self.assertFalse(modulestore()._value_matches('help', 'Help'))
-        self.assertTrue(modulestore()._value_matches(['distract', 'help', 'notme'], 'help'))
-        self.assertFalse(modulestore()._value_matches(['distract', 'Help', 'notme'], 'help'))
-        self.assertFalse(modulestore()._block_matches({'field': ['distract', 'Help', 'notme']}, {'field': 'help'}))
-        self.assertTrue(modulestore()._block_matches(
-            {'field': ['distract', 'help', 'notme'],
-                'irrelevant': 2},
-            {'field': 'help'}))
-        self.assertTrue(modulestore()._value_matches('I need some help', re.compile(r'help')))
-        self.assertTrue(modulestore()._value_matches(['I need some help', 'today'], re.compile(r'help')))
-        self.assertFalse(modulestore()._value_matches('I need some help', re.compile(r'Help')))
-        self.assertTrue(modulestore()._value_matches(['I need some help', 'today'], re.compile(r'Help', re.IGNORECASE)))
-
-        self.assertTrue(modulestore()._value_matches('gotcha', {'$in': ['a', 'bunch', 'of', 'gotcha']}))
-        self.assertFalse(modulestore()._value_matches('gotcha', {'$in': ['a', 'bunch', 'of', 'gotchas']}))
-        self.assertFalse(modulestore()._value_matches('gotcha', {'$nin': ['a', 'bunch', 'of', 'gotcha']}))
-        self.assertTrue(modulestore()._value_matches('gotcha', {'$nin': ['a', 'bunch', 'of', 'gotchas']}))
-
-        self.assertTrue(modulestore()._block_matches({'group_access': {'1': [1]}}, {'group_access': {'$exists': True}}))
-        self.assertTrue(modulestore()._block_matches({'a': 1, 'b': 2}, {'group_access': {'$exists': False}}))
-        self.assertTrue(modulestore()._block_matches(
-            {'a': 1, 'group_access': {'1': [1]}},
-            {'a': 1, 'group_access': {'$exists': True}}))
-        self.assertFalse(modulestore()._block_matches(
-            {'a': 1, 'group_access': {'1': [1]}},
-            {'a': 111, 'group_access': {'$exists': True}}))
-        self.assertTrue(modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 1, 'group_access': {'$exists': False}}))
-        self.assertFalse(modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 9, 'group_access': {'$exists': False}}))
-
-        self.assertTrue(modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 1}))
-        self.assertFalse(modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 2}))
-        self.assertFalse(modulestore()._block_matches({'a': 1, 'b': 2}, {'c': 1}))
-        self.assertFalse(modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 1, 'c': 1}))
-        self.assertTrue(modulestore()._block_matches({'a': 1, 'b': 2}, {'a': lambda i: 0 < i < 2}))
+        assert modulestore()._value_matches('help', 'help')
+        assert not modulestore()._value_matches('help', 'Help')
+        assert modulestore()._value_matches(['distract', 'help', 'notme'], 'help')
+        assert not modulestore()._value_matches(['distract', 'Help', 'notme'], 'help')
+        assert not modulestore()._block_matches({'field': ['distract', 'Help', 'notme']}, {'field': 'help'})
+        assert modulestore()._block_matches({'field': ['distract', 'help', 'notme'], 'irrelevant': 2},
+                                            {'field': 'help'})
+        assert modulestore()._value_matches('I need some help', re.compile('help'))
+        assert modulestore()._value_matches(['I need some help', 'today'], re.compile('help'))
+        assert not modulestore()._value_matches('I need some help', re.compile('Help'))
+        assert modulestore()._value_matches(['I need some help', 'today'], re.compile('Help', re.IGNORECASE))
+
+        assert modulestore()._value_matches('gotcha', {'$in': ['a', 'bunch', 'of', 'gotcha']})
+        assert not modulestore()._value_matches('gotcha', {'$in': ['a', 'bunch', 'of', 'gotchas']})
+        assert not modulestore()._value_matches('gotcha', {'$nin': ['a', 'bunch', 'of', 'gotcha']})
+        assert modulestore()._value_matches('gotcha', {'$nin': ['a', 'bunch', 'of', 'gotchas']})
+
+        assert modulestore()._block_matches({'group_access': {'1': [1]}}, {'group_access': {'$exists': True}})
+        assert modulestore()._block_matches({'a': 1, 'b': 2}, {'group_access': {'$exists': False}})
+        assert modulestore()._block_matches({'a': 1, 'group_access': {'1': [1]}},
+                                            {'a': 1, 'group_access': {'$exists': True}})
+        assert not modulestore()._block_matches({'a': 1, 'group_access': {'1': [1]}},
+                                                {'a': 111, 'group_access': {'$exists': True}})
+        assert modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 1, 'group_access': {'$exists': False}})
+        assert not modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 9, 'group_access': {'$exists': False}})
+
+        assert modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 1})
+        assert not modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 2})
+        assert not modulestore()._block_matches({'a': 1, 'b': 2}, {'c': 1})
+        assert not modulestore()._block_matches({'a': 1, 'b': 2}, {'a': 1, 'c': 1})
+        assert modulestore()._block_matches({'a': 1, 'b': 2}, {'a': (lambda i: (0 < i < 2))})
 
     def test_get_items(self):
         '''
@@ -1212,28 +1184,28 @@ class SplitModuleItemTests(SplitModuleTest):
         locator = CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT)
         # get all modules
         matches = modulestore().get_items(locator)
-        self.assertEqual(len(matches), 8)
+        assert len(matches) == 8
         matches = modulestore().get_items(locator)
-        self.assertEqual(len(matches), 8)
+        assert len(matches) == 8
         matches = modulestore().get_items(locator, qualifiers={'category': 'chapter'})
-        self.assertEqual(len(matches), 4)
+        assert len(matches) == 4
         matches = modulestore().get_items(locator, qualifiers={'category': 'garbage'})
-        self.assertEqual(len(matches), 0)
+        assert len(matches) == 0
         # Test that we don't accidentally get an item with a similar name.
         matches = modulestore().get_items(locator, qualifiers={'name': 'chapter1'})
-        self.assertEqual(len(matches), 1)
+        assert len(matches) == 1
         matches = modulestore().get_items(locator, qualifiers={'name': ['chapter1', 'chapter2']})
-        self.assertEqual(len(matches), 2)
+        assert len(matches) == 2
         matches = modulestore().get_items(
             locator,
             qualifiers={'category': 'chapter'},
             settings={'display_name': re.compile(r'Hera')},
         )
-        self.assertEqual(len(matches), 2)
+        assert len(matches) == 2
         matches = modulestore().get_items(locator, settings={'group_access': {'$exists': True}})
-        self.assertEqual(len(matches), 1)
+        assert len(matches) == 1
         matches = modulestore().get_items(locator, settings={'group_access': {'$exists': False}})
-        self.assertEqual(len(matches), 7)
+        assert len(matches) == 7
 
     def test_get_parents(self):
         '''
@@ -1244,17 +1216,17 @@ class SplitModuleItemTests(SplitModuleTest):
             'chapter', block_id='chapter1'
         )
         parent = modulestore().get_parent_location(locator)
-        self.assertIsNotNone(parent)
-        self.assertEqual(parent.block_id, 'head12345')
-        self.assertEqual(parent.org, "testx")
-        self.assertEqual(parent.course, "GreekHero")
+        assert parent is not None
+        assert parent.block_id == 'head12345'
+        assert parent.org == 'testx'
+        assert parent.course == 'GreekHero'
         locator = locator.course_key.make_usage_key('chapter', 'chapter2')
         parent = modulestore().get_parent_location(locator)
-        self.assertIsNotNone(parent)
-        self.assertEqual(parent.block_id, 'head12345')
+        assert parent is not None
+        assert parent.block_id == 'head12345'
         locator = locator.course_key.make_usage_key('garbage', 'nosuchblock')
         parent = modulestore().get_parent_location(locator)
-        self.assertIsNone(parent)
+        assert parent is None
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_get_children(self, _from_json):
@@ -1270,10 +1242,10 @@ class SplitModuleItemTests(SplitModuleTest):
             "chapter1", "chap", "chapter2", "chapter3"
         ]
         for child in children:
-            self.assertEqual(child.category, "chapter")
-            self.assertIn(child.location.block_id, expected_ids)
+            assert child.category == 'chapter'
+            assert child.location.block_id in expected_ids
             expected_ids.remove(child.location.block_id)
-        self.assertEqual(len(expected_ids), 0)
+        assert len(expected_ids) == 0
 
 
 def version_agnostic(children):
@@ -1323,25 +1295,26 @@ class TestItemCrud(SplitModuleTest):
             fields={'display_name': 'new sequential'}
         )
         # check that course version changed and course's previous is the other one
-        self.assertEqual(new_module.location.course, "GreekHero")
-        self.assertNotEqual(new_module.location.version_guid, premod_course.location.version_guid)
-        self.assertIsNone(locator.version_guid, "Version inadvertently filled in")  # lint-amnesty, pylint: disable=no-member
+        assert new_module.location.course == 'GreekHero'
+        assert new_module.location.version_guid != premod_course.location.version_guid
+        assert locator.version_guid is None,\
+            'Version inadvertently filled in'  # lint-amnesty, pylint: disable=no-member
         current_course = modulestore().get_course(locator)
-        self.assertEqual(new_module.location.version_guid, current_course.location.version_guid)
+        assert new_module.location.version_guid == current_course.location.version_guid
 
         history_info = modulestore().get_course_history_info(current_course.location.course_key)
-        self.assertEqual(history_info['previous_version'], premod_course.location.version_guid)
-        self.assertEqual(history_info['original_version'], premod_history['original_version'])
-        self.assertEqual(history_info['edited_by'], "user123")
+        assert history_info['previous_version'] == premod_course.location.version_guid
+        assert history_info['original_version'] == premod_history['original_version']
+        assert history_info['edited_by'] == 'user123'
         # check block's info: category, definition_locator, and display_name
-        self.assertEqual(new_module.category, 'sequential')
-        self.assertIsNotNone(new_module.definition_locator)
-        self.assertEqual(new_module.display_name, 'new sequential')
+        assert new_module.category == 'sequential'
+        assert new_module.definition_locator is not None
+        assert new_module.display_name == 'new sequential'
         # check that block does not exist in previous version
         locator = new_module.location.map_into_course(
             CourseLocator(version_guid=premod_course.location.version_guid)
         )
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_item(locator)
 
     def test_create_parented_item(self):
@@ -1365,10 +1338,10 @@ class TestItemCrud(SplitModuleTest):
             definition_locator=original.definition_locator
         )
         # check that course version changed and course's previous is the other one
-        self.assertNotEqual(new_module.location.version_guid, premod_course.location.version_guid)
+        assert new_module.location.version_guid != premod_course.location.version_guid
         parent = modulestore().get_item(locator)
-        self.assertIn(new_module.location.version_agnostic(), version_agnostic(parent.children))
-        self.assertEqual(new_module.definition_locator.definition_id, original.definition_locator.definition_id)
+        assert new_module.location.version_agnostic() in version_agnostic(parent.children)
+        assert new_module.definition_locator.definition_id == original.definition_locator.definition_id
 
     def test_unique_naming(self):
         """
@@ -1399,18 +1372,18 @@ class TestItemCrud(SplitModuleTest):
         )
         # check that course version changed and course's previous is the other one
         parent = modulestore().get_item(locator)
-        self.assertNotEqual(new_module.location.block_id, another_module.location.block_id)
-        self.assertIn(new_module.location.version_agnostic(), version_agnostic(parent.children))
-        self.assertIn(another_module.location.version_agnostic(), version_agnostic(parent.children))
-        self.assertEqual(new_module.data, new_payload)
-        self.assertEqual(another_module.data, another_payload)
+        assert new_module.location.block_id != another_module.location.block_id
+        assert new_module.location.version_agnostic() in version_agnostic(parent.children)
+        assert another_module.location.version_agnostic() in version_agnostic(parent.children)
+        assert new_module.data == new_payload
+        assert another_module.data == another_payload
         # check definition histories
         new_history = modulestore().get_definition_history_info(new_module.definition_locator)
-        self.assertIsNone(new_history['previous_version'])
-        self.assertEqual(new_history['original_version'], new_module.definition_locator.definition_id)
-        self.assertEqual(new_history['edited_by'], "anotheruser")
+        assert new_history['previous_version'] is None
+        assert new_history['original_version'] == new_module.definition_locator.definition_id
+        assert new_history['edited_by'] == 'anotheruser'
         another_history = modulestore().get_definition_history_info(another_module.definition_locator)
-        self.assertEqual(another_history['previous_version'], original.definition_locator.definition_id)
+        assert another_history['previous_version'] == original.definition_locator.definition_id
 
     def test_encoded_naming(self):
         """
@@ -1426,7 +1399,8 @@ class TestItemCrud(SplitModuleTest):
         )
         # check that course version changed and course's previous is the other one
         new_module = modulestore().get_item(chapter_locator)
-        self.assertEqual(new_module.location.block_id, "foo.bar_-~:0")  # hardcode to ensure BUL init didn't change
+        assert new_module.location.block_id == 'foo.bar_-~:0'
+        # hardcode to ensure BUL init didn't change
         # now try making that a parent of something
         new_payload = "<problem>empty</problem>"
         problem_locator = BlockUsageLocator(course_key, 'problem', block_id="prob.bar_-~:99a")
@@ -1437,9 +1411,9 @@ class TestItemCrud(SplitModuleTest):
         )
         # check that course version changed and course's previous is the other one
         new_module = modulestore().get_item(problem_locator)
-        self.assertEqual(new_module.location.block_id, problem_locator.block_id)
+        assert new_module.location.block_id == problem_locator.block_id
         chapter = modulestore().get_item(chapter_locator)
-        self.assertIn(problem_locator, version_agnostic(chapter.children))
+        assert problem_locator in version_agnostic(chapter.children)
 
     def test_create_bulk_operations(self):
         """
@@ -1454,7 +1428,7 @@ class TestItemCrud(SplitModuleTest):
             index_history_info = modulestore().get_course_history_info(new_course.location.course_key)
             course_block_prev_version = new_course.previous_version
             course_block_update_version = new_course.update_version
-            self.assertIsNotNone(new_course_locator.version_guid, "Want to test a definite version")
+            assert new_course_locator.version_guid is not None, 'Want to test a definite version'
             versionless_course_locator = new_course_locator.version_agnostic()
 
             # positive simple case: no force, add chapter
@@ -1463,18 +1437,18 @@ class TestItemCrud(SplitModuleTest):
                 fields={'display_name': 'chapter 1'},
             )
             # version info shouldn't change
-            self.assertEqual(new_ele.update_version, course_block_update_version)
-            self.assertEqual(new_ele.update_version, new_ele.location.version_guid)
+            assert new_ele.update_version == course_block_update_version
+            assert new_ele.update_version == new_ele.location.version_guid
             refetch_course = modulestore().get_course(versionless_course_locator)
-            self.assertEqual(refetch_course.location.version_guid, new_course.location.version_guid)
-            self.assertEqual(refetch_course.previous_version, course_block_prev_version)
-            self.assertEqual(refetch_course.update_version, course_block_update_version)
+            assert refetch_course.location.version_guid == new_course.location.version_guid
+            assert refetch_course.previous_version == course_block_prev_version
+            assert refetch_course.update_version == course_block_update_version
             refetch_index_history_info = modulestore().get_course_history_info(refetch_course.location.course_key)
-            self.assertEqual(refetch_index_history_info, index_history_info)
-            self.assertIn(new_ele.location.version_agnostic(), version_agnostic(refetch_course.children))
+            assert refetch_index_history_info == index_history_info
+            assert new_ele.location.version_agnostic() in version_agnostic(refetch_course.children)
 
             # try to create existing item
-            with self.assertRaises(DuplicateItemError):
+            with pytest.raises(DuplicateItemError):
                 _fail = modulestore().create_child(
                     user, new_course.location, 'chapter',
                     block_id=new_ele.location.block_id,
@@ -1489,7 +1463,7 @@ class TestItemCrud(SplitModuleTest):
             )
             transaction_guid = new_ele.location.version_guid
             # ensure force w/ continue gives exception
-            with self.assertRaises(VersionConflictError):
+            with pytest.raises(VersionConflictError):
                 _fail = modulestore().create_child(
                     user, new_course.location, 'chapter',
                     fields={'display_name': 'chapter 2'},
@@ -1497,7 +1471,7 @@ class TestItemCrud(SplitModuleTest):
                 )
 
             # ensure trying to continue the old one gives exception
-            with self.assertRaises(VersionConflictError):
+            with pytest.raises(VersionConflictError):
                 _fail = modulestore().create_child(
                     user, new_course.location, 'chapter',
                     fields={'display_name': 'chapter 3'},
@@ -1509,14 +1483,14 @@ class TestItemCrud(SplitModuleTest):
                 user, course_module_locator, 'chapter',
                 fields={'display_name': 'chapter 4'},
             )
-            self.assertNotEqual(new_ele.update_version, course_block_update_version)
-            self.assertEqual(new_ele.location.version_guid, transaction_guid)
+            assert new_ele.update_version != course_block_update_version
+            assert new_ele.location.version_guid == transaction_guid
 
             # check children, previous_version
             refetch_course = modulestore().get_course(versionless_course_locator)
-            self.assertIn(new_ele.location.version_agnostic(), version_agnostic(refetch_course.children))
-            self.assertEqual(refetch_course.previous_version, course_block_update_version)
-            self.assertEqual(refetch_course.update_version, transaction_guid)
+            assert new_ele.location.version_agnostic() in version_agnostic(refetch_course.children)
+            assert refetch_course.previous_version == course_block_update_version
+            assert refetch_course.update_version == transaction_guid
 
     def test_bulk_ops_org_filtering(self):
         """
@@ -1531,23 +1505,23 @@ class TestItemCrud(SplitModuleTest):
             modulestore().create_course('test_org', 'test_transaction', 'test_run', user, BRANCH_NAME_DRAFT)
 
             courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT, org='test_org')
-            self.assertEqual(len(courses), 1)
-            self.assertEqual(courses[0].id.org, course_key.org)
-            self.assertEqual(courses[0].id.course, course_key.course)
-            self.assertEqual(courses[0].id.run, course_key.run)
+            assert len(courses) == 1
+            assert courses[0].id.org == course_key.org
+            assert courses[0].id.course == course_key.course
+            assert courses[0].id.run == course_key.run
 
             courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT, org='other_org')
-            self.assertEqual(len(courses), 0)
+            assert len(courses) == 0
 
         # re-assert after the end of the with scope
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT, org='test_org')
-        self.assertEqual(len(courses), 1)
-        self.assertEqual(courses[0].id.org, course_key.org)
-        self.assertEqual(courses[0].id.course, course_key.course)
-        self.assertEqual(courses[0].id.run, course_key.run)
+        assert len(courses) == 1
+        assert courses[0].id.org == course_key.org
+        assert courses[0].id.course == course_key.course
+        assert courses[0].id.run == course_key.run
 
         courses = modulestore().get_courses(branch=BRANCH_NAME_DRAFT, org='other_org')
-        self.assertEqual(len(courses), 0)
+        assert len(courses) == 0
 
     def test_update_metadata(self):
         """
@@ -1560,28 +1534,28 @@ class TestItemCrud(SplitModuleTest):
         problem = modulestore().get_item(locator)
         pre_def_id = problem.definition_locator.definition_id
         pre_version_guid = problem.location.version_guid
-        self.assertIsNotNone(pre_def_id)
-        self.assertIsNotNone(pre_version_guid)
-        self.assertNotEqual(problem.max_attempts, 4, "Invalidates rest of test")
+        assert pre_def_id is not None
+        assert pre_version_guid is not None
+        assert problem.max_attempts != 4, 'Invalidates rest of test'
 
         problem.max_attempts = 4
         problem.save()  # decache above setting into the kvs
         updated_problem = modulestore().update_item(problem, self.user_id)
         # check that course version changed and course's previous is the other one
-        self.assertEqual(updated_problem.definition_locator.definition_id, pre_def_id)
-        self.assertNotEqual(updated_problem.location.version_guid, pre_version_guid)
-        self.assertEqual(updated_problem.max_attempts, 4)
+        assert updated_problem.definition_locator.definition_id == pre_def_id
+        assert updated_problem.location.version_guid != pre_version_guid
+        assert updated_problem.max_attempts == 4
         # refetch to ensure original didn't change
         original_location = problem.location.map_into_course(CourseLocator(version_guid=pre_version_guid))
         problem = modulestore().get_item(original_location)
-        self.assertNotEqual(problem.max_attempts, 4, "original changed")
+        assert problem.max_attempts != 4, 'original changed'
 
         current_course = modulestore().get_course(locator.course_key)
-        self.assertEqual(updated_problem.location.version_guid, current_course.location.version_guid)
+        assert updated_problem.location.version_guid == current_course.location.version_guid
 
         history_info = modulestore().get_course_history_info(current_course.location.course_key)
-        self.assertEqual(history_info['previous_version'], pre_version_guid)
-        self.assertEqual(history_info['edited_by'], self.user_id)
+        assert history_info['previous_version'] == pre_version_guid
+        assert history_info['edited_by'] == self.user_id
 
     def test_update_children(self):
         """
@@ -1595,20 +1569,20 @@ class TestItemCrud(SplitModuleTest):
         pre_version_guid = block.location.version_guid
 
         # reorder children
-        self.assertGreater(len(block.children), 0, "meaningless test")
+        assert len(block.children) > 0, 'meaningless test'
         moved_child = block.children.pop()
         block.save()  # decache model changes
         updated_problem = modulestore().update_item(block, self.user_id)
         # check that course version changed and course's previous is the other one
-        self.assertEqual(updated_problem.definition_locator.definition_id, pre_def_id)
-        self.assertNotEqual(updated_problem.location.version_guid, pre_version_guid)
-        self.assertEqual(version_agnostic(updated_problem.children), version_agnostic(block.children))
-        self.assertNotIn(moved_child, version_agnostic(updated_problem.children))
+        assert updated_problem.definition_locator.definition_id == pre_def_id
+        assert updated_problem.location.version_guid != pre_version_guid
+        assert version_agnostic(updated_problem.children) == version_agnostic(block.children)
+        assert moved_child not in version_agnostic(updated_problem.children)
         locator = locator.course_key.make_usage_key('chapter', "chapter1")
         other_block = modulestore().get_item(locator)
         other_block.children.append(moved_child)
         other_updated = modulestore().update_item(other_block, self.user_id)
-        self.assertIn(moved_child.version_agnostic(), version_agnostic(other_updated.children))
+        assert moved_child.version_agnostic() in version_agnostic(other_updated.children)
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
     def test_update_definition(self, _from_json):
@@ -1626,9 +1600,9 @@ class TestItemCrud(SplitModuleTest):
         block.save()  # decache model changes
         updated_block = modulestore().update_item(block, self.user_id)
 
-        self.assertNotEqual(updated_block.definition_locator.definition_id, pre_def_id)
-        self.assertNotEqual(updated_block.location.version_guid, pre_version_guid)
-        self.assertEqual(updated_block.grading_policy['GRADER'][0]['min_count'], 13)
+        assert updated_block.definition_locator.definition_id != pre_def_id
+        assert updated_block.location.version_guid != pre_version_guid
+        assert updated_block.grading_policy['GRADER'][0]['min_count'] == 13
 
     def test_update_manifold(self):
         """
@@ -1664,22 +1638,22 @@ class TestItemCrud(SplitModuleTest):
         pre_def_id = block.definition_locator.definition_id
         pre_version_guid = block.location.version_guid
 
-        self.assertNotEqual(block.grading_policy['GRADER'][0]['min_count'], 13)
+        assert block.grading_policy['GRADER'][0]['min_count'] != 13
         block.grading_policy['GRADER'][0]['min_count'] = 13
         block.children = block.children[1:] + [block.children[0]]
         block.advertised_start = "Soon"
 
         block.save()  # decache model changes
         updated_block = modulestore().update_item(block, self.user_id)
-        self.assertNotEqual(updated_block.definition_locator.definition_id, pre_def_id)
-        self.assertNotEqual(updated_block.location.version_guid, pre_version_guid)
-        self.assertEqual(updated_block.grading_policy['GRADER'][0]['min_count'], 13)
-        self.assertEqual(updated_block.children[0].version_agnostic(), block.children[0].version_agnostic())
-        self.assertEqual(updated_block.advertised_start, "Soon")
+        assert updated_block.definition_locator.definition_id != pre_def_id
+        assert updated_block.location.version_guid != pre_version_guid
+        assert updated_block.grading_policy['GRADER'][0]['min_count'] == 13
+        assert updated_block.children[0].version_agnostic() == block.children[0].version_agnostic()
+        assert updated_block.advertised_start == 'Soon'
 
     def test_delete_item(self):
         course = self.create_course_for_deletion()
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             modulestore().delete_item(course.location, self.user_id)
         reusable_location = course.id.version_agnostic().for_branch(BRANCH_NAME_DRAFT)
 
@@ -1688,14 +1662,14 @@ class TestItemCrud(SplitModuleTest):
         locn_to_del = problems[0].location
         new_course_loc = modulestore().delete_item(locn_to_del, self.user_id)
         deleted = locn_to_del.version_agnostic()
-        self.assertFalse(modulestore().has_item(deleted))
-        with self.assertRaises(VersionConflictError):
+        assert not modulestore().has_item(deleted)
+        with pytest.raises(VersionConflictError):
             modulestore().has_item(locn_to_del)
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             modulestore().delete_item(deleted, self.user_id)
 
-        self.assertTrue(modulestore().has_item(locn_to_del.course_agnostic()))
-        self.assertNotEqual(new_course_loc.version_guid, course.location.version_guid)
+        assert modulestore().has_item(locn_to_del.course_agnostic())
+        assert new_course_loc.version_guid != course.location.version_guid
 
         # delete a subtree
         nodes = modulestore().get_items(reusable_location, qualifiers={'category': 'chapter'})
@@ -1708,10 +1682,8 @@ class TestItemCrud(SplitModuleTest):
             """
             if node:
                 node_loc = node.location
-                self.assertFalse(
-                    modulestore().has_item(node_loc.version_agnostic())
-                )
-                self.assertTrue(modulestore().has_item(node_loc.course_agnostic()))
+                assert not modulestore().has_item(node_loc.version_agnostic())
+                assert modulestore().has_item(node_loc.course_agnostic())
                 if node.has_children:
                     for sub in node.get_children():
                         check_subtree(sub)
@@ -1769,8 +1741,8 @@ class TestItemCrud(SplitModuleTest):
             # First child should have been moved to second position, and better child takes the lead
             refetch_course = store.get_course(versionless_course_locator)
             children = refetch_course.get_children()
-            self.assertEqual(six.text_type(children[1].location), six.text_type(first_child.location))
-            self.assertEqual(six.text_type(children[0].location), six.text_type(second_child.location))
+            assert six.text_type(children[1].location) == six.text_type(first_child.location)
+            assert six.text_type(children[0].location) == six.text_type(second_child.location)
 
             # Clean up the data so we don't break other tests which apparently expect a particular state
             store.delete_course(refetch_course.id, user)
@@ -1791,22 +1763,22 @@ class TestCourseCreation(SplitModuleTest):
         new_locator = new_course.location
         # check index entry
         index_info = modulestore().get_course_index_info(new_locator.course_key)
-        self.assertEqual(index_info['org'], 'test_org')
-        self.assertEqual(index_info['edited_by'], 'create_user')
+        assert index_info['org'] == 'test_org'
+        assert index_info['edited_by'] == 'create_user'
         # check structure info
         structure_info = modulestore().get_course_history_info(new_locator.course_key)
-        self.assertEqual(structure_info['original_version'], index_info['versions'][BRANCH_NAME_DRAFT])
-        self.assertIsNone(structure_info['previous_version'])
+        assert structure_info['original_version'] == index_info['versions'][BRANCH_NAME_DRAFT]
+        assert structure_info['previous_version'] is None
 
-        self.assertEqual(structure_info['edited_by'], 'create_user')
+        assert structure_info['edited_by'] == 'create_user'
         # check the returned course object
-        self.assertIsInstance(new_course, CourseDescriptor)
-        self.assertEqual(new_course.category, 'course')
-        self.assertFalse(new_course.show_calculator)
-        self.assertTrue(new_course.allow_anonymous)
-        self.assertEqual(len(new_course.children), 0)
-        self.assertEqual(new_course.edited_by, "create_user")
-        self.assertEqual(len(new_course.grading_policy['GRADER']), 4)
+        assert isinstance(new_course, CourseDescriptor)
+        assert new_course.category == 'course'
+        assert not new_course.show_calculator
+        assert new_course.allow_anonymous
+        assert len(new_course.children) == 0
+        assert new_course.edited_by == 'create_user'
+        assert len(new_course.grading_policy['GRADER']) == 4
         self.assertDictEqual(new_course.grade_cutoffs, {"Pass": 0.5})
 
     def test_cloned_course(self):
@@ -1821,16 +1793,16 @@ class TestCourseCreation(SplitModuleTest):
         new_draft_locator = new_draft.location
         self.assertRegex(new_draft_locator.org, 'best')
         # the edited_by and other meta fields on the new course will be the original author not this one
-        self.assertEqual(new_draft.edited_by, 'test@edx.org')
-        self.assertEqual(new_draft_locator.version_guid, original_index['versions'][BRANCH_NAME_DRAFT])
+        assert new_draft.edited_by == 'test@edx.org'
+        assert new_draft_locator.version_guid == original_index['versions'][BRANCH_NAME_DRAFT]
         # however the edited_by and other meta fields on course_index will be this one
         new_index = modulestore().get_course_index_info(new_draft_locator.course_key)
-        self.assertEqual(new_index['edited_by'], 'leech_master')
+        assert new_index['edited_by'] == 'leech_master'
 
         new_published_locator = new_draft_locator.course_key.for_branch(BRANCH_NAME_PUBLISHED)
         new_published = modulestore().get_course(new_published_locator)
-        self.assertEqual(new_published.edited_by, 'test@edx.org')
-        self.assertEqual(new_published.location.version_guid, original_index['versions'][BRANCH_NAME_PUBLISHED])
+        assert new_published.edited_by == 'test@edx.org'
+        assert new_published.location.version_guid == original_index['versions'][BRANCH_NAME_PUBLISHED]
 
         # changing this course will not change the original course
         # using new_draft.location will insert the chapter under the course root
@@ -1840,16 +1812,16 @@ class TestCourseCreation(SplitModuleTest):
         )
         new_draft_locator = new_draft_locator.course_key.version_agnostic()
         new_index = modulestore().get_course_index_info(new_draft_locator)
-        self.assertNotEqual(new_index['versions'][BRANCH_NAME_DRAFT], original_index['versions'][BRANCH_NAME_DRAFT])
+        assert new_index['versions'][BRANCH_NAME_DRAFT] != original_index['versions'][BRANCH_NAME_DRAFT]
         new_draft = modulestore().get_course(new_draft_locator)
-        self.assertEqual(new_item.edited_by, 'leech_master')
-        self.assertNotEqual(new_item.location.version_guid, original_index['versions'][BRANCH_NAME_DRAFT])
-        self.assertNotEqual(new_draft.location.version_guid, original_index['versions'][BRANCH_NAME_DRAFT])
+        assert new_item.edited_by == 'leech_master'
+        assert new_item.location.version_guid != original_index['versions'][BRANCH_NAME_DRAFT]
+        assert new_draft.location.version_guid != original_index['versions'][BRANCH_NAME_DRAFT]
         structure_info = modulestore().get_course_history_info(new_draft_locator)
-        self.assertEqual(structure_info['edited_by'], 'leech_master')
+        assert structure_info['edited_by'] == 'leech_master'
 
         original_course = modulestore().get_course(original_locator)
-        self.assertEqual(original_course.location.version_guid, original_index['versions'][BRANCH_NAME_DRAFT])
+        assert original_course.location.version_guid == original_index['versions'][BRANCH_NAME_DRAFT]
 
     def test_derived_course(self):
         """
@@ -1871,12 +1843,12 @@ class TestCourseCreation(SplitModuleTest):
         new_draft_locator = new_draft.location
         self.assertRegex(new_draft_locator.org, 'counter')
         # the edited_by and other meta fields on the new course will be the original author not this one
-        self.assertEqual(new_draft.edited_by, 'leech_master')
-        self.assertNotEqual(new_draft_locator.version_guid, original_index['versions'][BRANCH_NAME_DRAFT])
+        assert new_draft.edited_by == 'leech_master'
+        assert new_draft_locator.version_guid != original_index['versions'][BRANCH_NAME_DRAFT]
         # however the edited_by and other meta fields on course_index will be this one
         new_index = modulestore().get_course_index_info(new_draft_locator.course_key)
-        self.assertEqual(new_index['edited_by'], 'leech_master')
-        self.assertEqual(new_draft.display_name, fields['display_name'])
+        assert new_index['edited_by'] == 'leech_master'
+        assert new_draft.display_name == fields['display_name']
         self.assertDictEqual(
             new_draft.grading_policy['GRADE_CUTOFFS'],
             fields['grading_policy']['GRADE_CUTOFFS']
@@ -1898,13 +1870,13 @@ class TestCourseCreation(SplitModuleTest):
         versions[BRANCH_NAME_DRAFT] = head_course.previous_version
         modulestore().update_course_index(None, course_info)
         course = modulestore().get_course(locator)
-        self.assertEqual(course.location.version_guid, versions[BRANCH_NAME_DRAFT])
+        assert course.location.version_guid == versions[BRANCH_NAME_DRAFT]
 
         # an allowed but not recommended way to publish a course
         versions[BRANCH_NAME_PUBLISHED] = versions[BRANCH_NAME_DRAFT]
         modulestore().update_course_index(None, course_info)
         course = modulestore().get_course(locator.for_branch(BRANCH_NAME_PUBLISHED))
-        self.assertEqual(course.location.version_guid, versions[BRANCH_NAME_DRAFT])
+        assert course.location.version_guid == versions[BRANCH_NAME_DRAFT]
 
     def test_create_with_root(self):
         """
@@ -1915,16 +1887,16 @@ class TestCourseCreation(SplitModuleTest):
             'test_org', 'test_transaction', 'test_run', user, BRANCH_NAME_DRAFT,
             root_block_id='top', root_category='chapter'
         )
-        self.assertEqual(new_course.location.block_id, 'top')
-        self.assertEqual(new_course.category, 'chapter')
+        assert new_course.location.block_id == 'top'
+        assert new_course.category == 'chapter'
         # look at db to verify
         db_structure = modulestore().db_connection.get_structure(
             new_course.location.as_object_id(new_course.location.version_guid)
         )
-        self.assertIsNotNone(db_structure, "Didn't find course")
-        self.assertNotIn(BlockKey('course', 'course'), db_structure['blocks'])
-        self.assertIn(BlockKey('chapter', 'top'), db_structure['blocks'])
-        self.assertEqual(db_structure['blocks'][BlockKey('chapter', 'top')].block_type, 'chapter')
+        assert db_structure is not None, "Didn't find course"
+        assert BlockKey('course', 'course') not in db_structure['blocks']
+        assert BlockKey('chapter', 'top') in db_structure['blocks']
+        assert db_structure['blocks'][BlockKey('chapter', 'top')].block_type == 'chapter'
 
     def test_create_id_dupe(self):
         """
@@ -1932,7 +1904,7 @@ class TestCourseCreation(SplitModuleTest):
         """
         user = random.getrandbits(32)
         courses = modulestore().get_courses(BRANCH_NAME_DRAFT)
-        with self.assertRaises(DuplicateCourseError):
+        with pytest.raises(DuplicateCourseError):
             dupe_course_key = courses[0].location.course_key
             modulestore().create_course(
                 dupe_course_key.org, dupe_course_key.course, dupe_course_key.run, user, BRANCH_NAME_DRAFT
@@ -1966,12 +1938,12 @@ class TestCourseCreation(SplitModuleTest):
                     # now get_courses
                     courses = split_store.get_courses(BRANCH_NAME_DRAFT)
 
-                    self.assertEqual(len(courses), 3)
+                    assert len(courses) == 3
                     course_ids = [course.id.for_branch(None) for course in courses]
-                    self.assertNotIn(to_be_deleted, course_ids)
-                    self.assertIn(to_be_created, course_ids)
+                    assert to_be_deleted not in course_ids
+                    assert to_be_created in course_ids
                     fetched_modified = [course for course in courses if course.id == modified_course_loc][0]
-                    self.assertEqual(fetched_modified.advertised_start, modified_course.advertised_start)
+                    assert fetched_modified.advertised_start == modified_course.advertised_start
 
 
 class TestInheritance(SplitModuleTest):
@@ -1990,13 +1962,13 @@ class TestInheritance(SplitModuleTest):
         )
         node = modulestore().get_item(locator)
         # inherited
-        self.assertEqual(node.graceperiod, datetime.timedelta(hours=2))
+        assert node.graceperiod == datetime.timedelta(hours=2)
         locator = BlockUsageLocator(
             CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT), 'problem', 'problem1'
         )
         node = modulestore().get_item(locator)
         # overridden
-        self.assertEqual(node.graceperiod, datetime.timedelta(hours=4))
+        assert node.graceperiod == datetime.timedelta(hours=4)
 
     def test_inheritance_not_saved(self):
         """
@@ -2013,12 +1985,12 @@ class TestInheritance(SplitModuleTest):
                 CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT), 'problem', 'problem3_2'  # lint-amnesty, pylint: disable=line-too-long
             )
         )
-        self.assertFalse(problem.visible_to_staff_only)
+        assert not problem.visible_to_staff_only
 
         chapter.visible_to_staff_only = True
         modulestore().update_item(chapter, self.user_id)
         problem = modulestore().get_item(problem.location.version_agnostic())
-        self.assertTrue(problem.visible_to_staff_only)
+        assert problem.visible_to_staff_only
 
         # unset on parent, retrieve child, verify unset
         chapter = modulestore().get_item(chapter.location.version_agnostic())
@@ -2026,7 +1998,7 @@ class TestInheritance(SplitModuleTest):
         modulestore().update_item(chapter, self.user_id)
 
         problem = modulestore().get_item(problem.location.version_agnostic())
-        self.assertFalse(problem.visible_to_staff_only)
+        assert not problem.visible_to_staff_only
 
     def test_dynamic_inheritance(self):
         """
@@ -2037,13 +2009,13 @@ class TestInheritance(SplitModuleTest):
 
         chapter.visible_to_staff_only = True
         orphan_problem = modulestore().create_item(self.user_id, course_key, 'problem')
-        self.assertFalse(orphan_problem.visible_to_staff_only)
+        assert not orphan_problem.visible_to_staff_only
         parented_problem = modulestore().create_child(self.user_id, chapter.location.version_agnostic(), 'problem')  # lint-amnesty, pylint: disable=unused-variable
         # FIXME LMS-11376
 #         self.assertTrue(parented_problem.visible_to_staff_only)
 
         orphan_problem = modulestore().create_xblock(chapter.runtime, course_key, 'problem')
-        self.assertFalse(orphan_problem.visible_to_staff_only)
+        assert not orphan_problem.visible_to_staff_only
         parented_problem = modulestore().create_xblock(chapter.runtime, course_key, 'problem', parent_xblock=chapter)
         # FIXME LMS-11376
 #         self.assertTrue(parented_problem.visible_to_staff_only)
@@ -2081,16 +2053,14 @@ class TestPublish(SplitModuleTest):
         # remove chapter1 from expected b/c its pub'd version != the source anymore since source changed
         expected.remove(BlockKey.from_usage_key(chapter1))
         # check that it's not in published course
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().get_item(new_module.location.map_into_course(dest_course))
         # publish it
         modulestore().copy(self.user_id, source_course, dest_course, [new_module.location], None)
         expected.append(BlockKey.from_usage_key(new_module.location))
         # check that it is in the published course and that its parent is the chapter
         pub_module = modulestore().get_item(new_module.location.map_into_course(dest_course))
-        self.assertEqual(
-            modulestore().get_parent_location(pub_module.location).block_id, chapter1.block_id
-        )
+        assert modulestore().get_parent_location(pub_module.location).block_id == chapter1.block_id
         # ensure intentionally orphaned blocks work (e.g., course_info)
         new_module = modulestore().create_item(
             self.user_id, source_course, "course_info", block_id="handouts"
@@ -2112,15 +2082,15 @@ class TestPublish(SplitModuleTest):
         head = source_course.make_usage_key('course', "head12345")
         chapter3 = source_course.make_usage_key('chapter', 'chapter3')
         problem1 = source_course.make_usage_key('problem', 'problem1')
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().copy(self.user_id, source_course, destination_course, [chapter3], None)
         # publishing into a new branch w/o publishing the root
         destination_course = CourseLocator(org='testx', course='GreekHero', run='run', branch=BRANCH_NAME_PUBLISHED)
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().copy(self.user_id, source_course, destination_course, [chapter3], None)
         # publishing a subdag w/o the parent already in course
         modulestore().copy(self.user_id, source_course, destination_course, [head], [chapter3])
-        with self.assertRaises(ItemNotFoundError):
+        with pytest.raises(ItemNotFoundError):
             modulestore().copy(self.user_id, source_course, destination_course, [problem1], [])
 
     @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json)
@@ -2163,31 +2133,25 @@ class TestPublish(SplitModuleTest):
         Check that the course has the expected blocks and does not have the unexpected blocks
         """
         history_info = modulestore().get_course_history_info(dest_course_loc)
-        self.assertEqual(history_info['edited_by'], self.user_id)
+        assert history_info['edited_by'] == self.user_id
         for expected in expected_blocks:
             source = modulestore().get_item(source_course_loc.make_usage_key(expected.type, expected.id))
             pub_copy = modulestore().get_item(dest_course_loc.make_usage_key(expected.type, expected.id))
             # everything except previous_version & children should be the same
-            self.assertEqual(source.category, pub_copy.category)
-            self.assertEqual(
-                source.update_version, pub_copy.source_version,
-                u"Versions don't match for {}: {} != {}".format(
-                    expected, source.update_version, pub_copy.update_version
-                )
-            )
-            self.assertEqual(
-                self.user_id, pub_copy.edited_by,
-                "{} edited_by {} not {}".format(pub_copy.location, pub_copy.edited_by, self.user_id)
-            )
+            assert source.category == pub_copy.category
+            assert source.update_version == pub_copy.source_version,\
+                f"Versions don't match for {expected}: {source.update_version} != {pub_copy.update_version}"
+            assert self.user_id == pub_copy.edited_by,\
+                f'{pub_copy.location} edited_by {pub_copy.edited_by} not {self.user_id}'
             for field in source.fields.values():
                 if field.name == 'children':
                     self._compare_children(field.read_from(source), field.read_from(pub_copy), unexpected_blocks)
                 elif isinstance(field, (Reference, ReferenceList, ReferenceValueDict)):
                     self.assertReferenceEqual(field.read_from(source), field.read_from(pub_copy))
                 else:
-                    self.assertEqual(field.read_from(source), field.read_from(pub_copy))
+                    assert field.read_from(source) == field.read_from(pub_copy)
         for unexp in unexpected_blocks:
-            with self.assertRaises(ItemNotFoundError):
+            with pytest.raises(ItemNotFoundError):
                 modulestore().get_item(dest_course_loc.make_usage_key(unexp.type, unexp.id))
 
     def assertReferenceEqual(self, expected, actual):  # lint-amnesty, pylint: disable=missing-function-docstring
@@ -2200,7 +2164,7 @@ class TestPublish(SplitModuleTest):
         elif isinstance(expected, dict):
             expected = {key: BlockKey.from_usage_key(val) for (key, val) in expected}
             actual = {key: BlockKey.from_usage_key(val) for (key, val) in actual}
-        self.assertEqual(expected, actual)
+        assert expected == actual
 
     @contract(
         source_children="list(BlockUsageLocator)",
@@ -2219,9 +2183,9 @@ class TestPublish(SplitModuleTest):
         ]
         dest_block_keys = [BlockKey.from_usage_key(dest) for dest in dest_children]
         for unexp in unexpected:
-            self.assertNotIn(unexp, dest_block_keys)
+            assert unexp not in dest_block_keys
 
-        self.assertEqual(source_block_keys, dest_block_keys)
+        assert source_block_keys == dest_block_keys
 
 
 class TestSchema(SplitModuleTest):
@@ -2234,16 +2198,10 @@ class TestSchema(SplitModuleTest):
         """
         db_connection = modulestore().db_connection
         for collection in [db_connection.course_index, db_connection.structures, db_connection.definitions]:
-            self.assertEqual(
-                collection.count_documents({'schema_version': {'$exists': False}}),
-                0,
-                "{0.name} has records without schema_version".format(collection)
-            )
-            self.assertEqual(
-                collection.count_documents({'schema_version': {'$ne': SplitMongoModuleStore.SCHEMA_VERSION}}),
-                0,
-                "{0.name} has records with wrong schema_version".format(collection)
-            )
+            assert collection.count_documents({'schema_version': {'$exists': False}}) == 0, \
+                f'{collection.name} has records without schema_version'
+            assert collection.count_documents({'schema_version': {'$ne': SplitMongoModuleStore.SCHEMA_VERSION}}) == 0, \
+                f'{collection.name} has records with wrong schema_version'
 
 
 # ===========================================
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore_bulk_operations.py b/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore_bulk_operations.py
index 128b9324bc973298c082efd1e5899faf5ef3c81d..d577876aa196159ac640c10547aee450a5987edc 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore_bulk_operations.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore_bulk_operations.py
@@ -42,10 +42,10 @@ class TestBulkWriteMixin(unittest.TestCase):  # lint-amnesty, pylint: disable=mi
         self.index_entry = {'this': 'is', 'an': 'index'}
 
     def assertConnCalls(self, *calls):
-        self.assertEqual(list(calls), self.conn.mock_calls)
+        assert list(calls) == self.conn.mock_calls
 
     def assertCacheNotCleared(self):
-        self.assertFalse(self.clear_cache.called)
+        assert not self.clear_cache.called
 
 
 class TestBulkWriteMixinPreviousTransaction(TestBulkWriteMixin):
@@ -77,7 +77,7 @@ class TestBulkWriteMixinClosed(TestBulkWriteMixin):
         self.assertConnCalls(
             call.get_structure(self.course_key.as_object_id(version_guid), self.course_key)
         )
-        self.assertEqual(result, self.conn.get_structure.return_value)
+        assert result == self.conn.get_structure.return_value
         self.assertCacheNotCleared()
 
     def test_no_bulk_write_structure(self):
@@ -100,7 +100,7 @@ class TestBulkWriteMixinClosed(TestBulkWriteMixin):
                 self.course_key
             )
         )
-        self.assertEqual(result, self.conn.get_definition.return_value)
+        assert result == self.conn.get_definition.return_value
 
     def test_no_bulk_write_definition(self):
         # Writing a definition when no bulk operation is active should just
@@ -114,7 +114,7 @@ class TestBulkWriteMixinClosed(TestBulkWriteMixin):
         # through to the db_connection
         result = self.bulk.get_course_index(self.course_key, ignore_case=ignore_case)
         self.assertConnCalls(call.get_course_index(self.course_key, ignore_case))
-        self.assertEqual(result, self.conn.get_course_index.return_value)
+        assert result == self.conn.get_course_index.return_value
         self.assertCacheNotCleared()
 
     def test_no_bulk_write_index(self):
@@ -291,17 +291,14 @@ class TestBulkWriteMixinClosed(TestBulkWriteMixin):
         )
 
     def test_version_structure_creates_new_version(self):
-        self.assertNotEqual(
-            self.bulk.version_structure(self.course_key, self.structure, 'user_id')['_id'],
-            self.structure['_id']
-        )
+        assert self.bulk.version_structure(self.course_key, self.structure, 'user_id')['_id'] != self.structure['_id']
 
     def test_version_structure_new_course(self):
         self.conn.get_course_index.return_value = None
         self.bulk._begin_bulk_operation(self.course_key)
         version_result = self.bulk.version_structure(self.course_key, self.structure, 'user_id')
         get_result = self.bulk.get_structure(self.course_key, version_result['_id'])
-        self.assertEqual(version_result, get_result)
+        assert version_result == get_result
 
 
 class TestBulkWriteMixinClosedAfterPrevTransaction(TestBulkWriteMixinClosed, TestBulkWriteMixinPreviousTransaction):  # lint-amnesty, pylint: disable=test-inherits-tests
@@ -330,7 +327,7 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
             course_keys=None
         )
         )
-        self.assertEqual(result, self.conn.find_matching_course_indexes.return_value)
+        assert result == self.conn.find_matching_course_indexes.return_value
         self.assertCacheNotCleared()
 
     @ddt.data(
@@ -399,14 +396,14 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
         result = self.bulk.find_matching_course_indexes(branch, search_targets)
         six.assertCountEqual(self, result, expected)
         for item in unmatching:
-            self.assertNotIn(item, result)
+            assert item not in result
 
     def test_no_bulk_find_structures_by_id(self):
         ids = [Mock(name='id')]
         self.conn.find_structures_by_id.return_value = [MagicMock(name='result')]
         result = self.bulk.find_structures_by_id(ids)
         self.assertConnCalls(call.find_structures_by_id(ids))
-        self.assertEqual(result, self.conn.find_structures_by_id.return_value)
+        assert result == self.conn.find_structures_by_id.return_value
         self.assertCacheNotCleared()
 
     @ddt.data(
@@ -431,14 +428,14 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
         self.conn.find_structures_by_id.assert_called_once_with(list(set(search_ids) - set(active_ids)))
         for _id in active_ids:
             if _id in search_ids:
-                self.assertIn(active_structure(_id), results)
+                assert active_structure(_id) in results
             else:
-                self.assertNotIn(active_structure(_id), results)
+                assert active_structure(_id) not in results
         for _id in db_ids:
             if _id in search_ids and _id not in active_ids:
-                self.assertIn(db_structure(_id), results)
+                assert db_structure(_id) in results
             else:
-                self.assertNotIn(db_structure(_id), results)
+                assert db_structure(_id) not in results
 
     @ddt.data(
         ([], [], []),
@@ -463,17 +460,17 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
             self.conn.get_definitions.assert_called_once_with(definitions_gotten, self.course_key)
         else:
             # If no definitions to get, then get_definitions() should *not* have been called.
-            self.assertEqual(self.conn.get_definitions.call_count, 0)
+            assert self.conn.get_definitions.call_count == 0
         for _id in active_ids:
             if _id in search_ids:
-                self.assertIn(active_definition(_id), results)
+                assert active_definition(_id) in results
             else:
-                self.assertNotIn(active_definition(_id), results)
+                assert active_definition(_id) not in results
         for _id in db_ids:
             if _id in search_ids and _id not in active_ids:
-                self.assertIn(db_definition(_id), results)
+                assert db_definition(_id) in results
             else:
-                self.assertNotIn(db_definition(_id), results)
+                assert db_definition(_id) not in results
 
     def test_get_definitions_doesnt_update_db(self):
         test_ids = [1, 2]
@@ -484,14 +481,14 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
         self.bulk._begin_bulk_operation(self.course_key)
         self.bulk.get_definitions(self.course_key, test_ids)
         self.bulk._end_bulk_operation(self.course_key)
-        self.assertFalse(self.conn.insert_definition.called)
+        assert not self.conn.insert_definition.called
 
     def test_no_bulk_find_structures_derived_from(self):
         ids = [Mock(name='id')]
         self.conn.find_structures_derived_from.return_value = [MagicMock(name='result')]
         result = self.bulk.find_structures_derived_from(ids)
         self.assertConnCalls(call.find_structures_derived_from(ids))
-        self.assertEqual(result, self.conn.find_structures_derived_from.return_value)
+        assert result == self.conn.find_structures_derived_from.return_value
         self.assertCacheNotCleared()
 
     @ddt.data(
@@ -529,17 +526,17 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
         self.conn.find_structures_derived_from.assert_called_once_with(search_ids)
         for structure in active_structures:
             if structure['previous_version'] in search_ids:
-                self.assertIn(structure, results)
+                assert structure in results
             else:
-                self.assertNotIn(structure, results)
+                assert structure not in results
         for structure in db_structures:
             if (
                 structure['previous_version'] in search_ids and  # We're searching for this document
                 not any(active.endswith(structure['_id']) for active in active_ids)  # This document doesn't match any active _ids  # lint-amnesty, pylint: disable=line-too-long
             ):
-                self.assertIn(structure, results)
+                assert structure in results
             else:
-                self.assertNotIn(structure, results)
+                assert structure not in results
 
     def test_no_bulk_find_ancestor_structures(self):
         original_version = Mock(name='original_version')
@@ -547,7 +544,7 @@ class TestBulkWriteMixinFindMethods(TestBulkWriteMixin):
         self.conn.find_ancestor_structures.return_value = [MagicMock(name='result')]
         result = self.bulk.find_ancestor_structures(original_version, block_id)
         self.assertConnCalls(call.find_ancestor_structures(original_version, block_id))
-        self.assertEqual(result, self.conn.find_ancestor_structures.return_value)
+        assert result == self.conn.find_ancestor_structures.return_value
         self.assertCacheNotCleared()
 
     @ddt.data(
@@ -604,8 +601,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         # returns the structure from the database
         version_guid = VERSION_GUID_DICT[version_guid_name]
         result = self.bulk.get_structure(self.course_key, version_guid)
-        self.assertEqual(self.conn.get_structure.call_count, 1)
-        self.assertEqual(result, self.conn.get_structure.return_value)
+        assert self.conn.get_structure.call_count == 1
+        assert result == self.conn.get_structure.return_value
         self.assertCacheNotCleared()
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
@@ -615,8 +612,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         version_guid = VERSION_GUID_DICT[version_guid_name]
         for _ in range(2):
             result = self.bulk.get_structure(self.course_key, version_guid)
-            self.assertEqual(self.conn.get_structure.call_count, 1)
-            self.assertEqual(result, self.conn.get_structure.return_value)
+            assert self.conn.get_structure.call_count == 1
+            assert result == self.conn.get_structure.return_value
             self.assertCacheNotCleared()
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
@@ -626,8 +623,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         self.structure['_id'] = version_guid
         self.bulk.update_structure(self.course_key, self.structure)
         result = self.bulk.get_structure(self.course_key, version_guid)
-        self.assertEqual(self.conn.get_structure.call_count, 0)
-        self.assertEqual(result, self.structure)
+        assert self.conn.get_structure.call_count == 0
+        assert result == self.structure
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
     def test_read_structure_after_write_after_read(self, version_guid_name):
@@ -638,8 +635,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         self.bulk.get_structure(self.course_key, version_guid)
         self.bulk.update_structure(self.course_key, self.structure)
         result = self.bulk.get_structure(self.course_key, version_guid)
-        self.assertEqual(self.conn.get_structure.call_count, 1)
-        self.assertEqual(result, self.structure)
+        assert self.conn.get_structure.call_count == 1
+        assert result == self.structure
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
     def test_read_definition_without_write_from_db(self, version_guid_name):
@@ -647,8 +644,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         # returns the definition from the database
         version_guid = VERSION_GUID_DICT[version_guid_name]
         result = self.bulk.get_definition(self.course_key, version_guid)
-        self.assertEqual(self.conn.get_definition.call_count, 1)
-        self.assertEqual(result, self.conn.get_definition.return_value)
+        assert self.conn.get_definition.call_count == 1
+        assert result == self.conn.get_definition.return_value
         self.assertCacheNotCleared()
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
@@ -658,8 +655,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         version_guid = VERSION_GUID_DICT[version_guid_name]
         for _ in range(2):
             result = self.bulk.get_definition(self.course_key, version_guid)
-            self.assertEqual(self.conn.get_definition.call_count, 1)
-            self.assertEqual(result, self.conn.get_definition.return_value)
+            assert self.conn.get_definition.call_count == 1
+            assert result == self.conn.get_definition.return_value
             self.assertCacheNotCleared()
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
@@ -669,8 +666,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         self.definition['_id'] = version_guid
         self.bulk.update_definition(self.course_key, self.definition)
         result = self.bulk.get_definition(self.course_key, version_guid)
-        self.assertEqual(self.conn.get_definition.call_count, 0)
-        self.assertEqual(result, self.definition)
+        assert self.conn.get_definition.call_count == 0
+        assert result == self.definition
 
     @ddt.data(*SAMPLE_GUIDS_LIST)
     def test_read_definition_after_write_after_read(self, version_guid_name):
@@ -681,15 +678,15 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         self.bulk.get_definition(self.course_key, version_guid)
         self.bulk.update_definition(self.course_key, self.definition)
         result = self.bulk.get_definition(self.course_key, version_guid)
-        self.assertEqual(self.conn.get_definition.call_count, 1)
-        self.assertEqual(result, self.definition)
+        assert self.conn.get_definition.call_count == 1
+        assert result == self.definition
 
     @ddt.data(True, False)
     def test_read_index_without_write_from_db(self, ignore_case):
         # Reading the index without writing to it should pull from the database
         result = self.bulk.get_course_index(self.course_key, ignore_case=ignore_case)
-        self.assertEqual(self.conn.get_course_index.call_count, 1)
-        self.assertEqual(self.conn.get_course_index.return_value, result)
+        assert self.conn.get_course_index.call_count == 1
+        assert self.conn.get_course_index.return_value == result
 
     @ddt.data(True, False)
     def test_read_index_without_write_only_reads_once(self, ignore_case):
@@ -697,8 +694,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         # the database
         for _ in range(2):
             result = self.bulk.get_course_index(self.course_key, ignore_case=ignore_case)
-            self.assertEqual(self.conn.get_course_index.call_count, 1)
-            self.assertEqual(self.conn.get_course_index.return_value, result)
+            assert self.conn.get_course_index.call_count == 1
+            assert self.conn.get_course_index.return_value == result
 
     @ddt.data(True, False)
     def test_read_index_after_write(self, ignore_case):
@@ -706,8 +703,8 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
         # initial index, and should return the written index_entry
         self.bulk.insert_course_index(self.course_key, self.index_entry)
         result = self.bulk.get_course_index(self.course_key, ignore_case=ignore_case)
-        self.assertEqual(self.conn.get_course_index.call_count, 1)
-        self.assertEqual(self.index_entry, result)
+        assert self.conn.get_course_index.call_count == 1
+        assert self.index_entry == result
 
     def test_read_index_ignore_case(self):
         # Reading using ignore case should find an already written entry with a different case
@@ -720,22 +717,16 @@ class TestBulkWriteMixinOpen(TestBulkWriteMixin):
             ),
             ignore_case=True
         )
-        self.assertEqual(self.conn.get_course_index.call_count, 1)
-        self.assertEqual(self.index_entry, result)
+        assert self.conn.get_course_index.call_count == 1
+        assert self.index_entry == result
 
     def test_version_structure_creates_new_version_before_read(self):
-        self.assertNotEqual(
-            self.bulk.version_structure(self.course_key, self.structure, 'user_id')['_id'],
-            self.structure['_id']
-        )
+        assert self.bulk.version_structure(self.course_key, self.structure, 'user_id')['_id'] != self.structure['_id']
 
     def test_version_structure_creates_new_version_after_read(self):
         self.conn.get_structure.return_value = copy.deepcopy(self.structure)
         self.bulk.get_structure(self.course_key, self.structure['_id'])
-        self.assertNotEqual(
-            self.bulk.version_structure(self.course_key, self.structure, 'user_id')['_id'],
-            self.structure['_id']
-        )
+        assert self.bulk.version_structure(self.course_key, self.structure, 'user_id')['_id'] != self.structure['_id']
 
     def test_copy_branch_versions(self):
         # Directly updating an index so that the draft branch points to the published index
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_split_mongo_mongo_connection.py b/common/lib/xmodule/xmodule/modulestore/tests/test_split_mongo_mongo_connection.py
index e6932a2724a5273639525be6a04b210fc4171e1d..7512c3da004cbdaa354c140c35c2a0dc8a4c5638 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_split_mongo_mongo_connection.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_split_mongo_mongo_connection.py
@@ -2,7 +2,7 @@
 
 
 import unittest
-
+import pytest
 from mock import patch
 from pymongo.errors import ConnectionFailure
 
@@ -21,5 +21,5 @@ class TestHeartbeatFailureException(unittest.TestCase):
             mock_proxy.return_value.admin.command.side_effect = ConnectionFailure('Test')
             useless_conn = MongoConnection('useless', 'useless', 'useless')
 
-            with self.assertRaises(HeartbeatFailure):
+            with pytest.raises(HeartbeatFailure):
                 useless_conn.heartbeat()
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_store_utilities.py b/common/lib/xmodule/xmodule/modulestore/tests/test_store_utilities.py
index 98e9c8e54b12086d2c17d27e50cfb415d22f1801..166c633e6223f2d1dba1abe204637a841e0eab2f 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_store_utilities.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_store_utilities.py
@@ -81,4 +81,4 @@ class TestUtils(unittest.TestCase):
             module_nodes.append(draft_node_constructor(Mock(), node_args[0], node_args[1]))
         subtree_roots_urls = [root.url for root in get_draft_subtree_roots(module_nodes)]
         # check that we return the expected urls
-        self.assertEqual(set(subtree_roots_urls), set(expected_roots_urls))
+        assert set(subtree_roots_urls) == set(expected_roots_urls)
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py b/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py
index d20f9e419413e52ece28e69dee1d6302016619a8..bbd47227c565f89dc69a0f0d6171e98cfa39d5bd 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_xml.py
@@ -6,7 +6,7 @@ well-formed and not-well-formed XML.
 
 import os.path
 from glob import glob
-
+import pytest
 from django.test import TestCase
 from mock import Mock, patch
 from opaque_keys.edx.keys import CourseKey
@@ -44,7 +44,7 @@ class TestXMLModuleStore(TestCase):
         # Ensure that there really is a non-ASCII character in the course.
         with open(os.path.join(DATA_DIR, "toy/sequential/vertical_sequential.xml"), 'rb') as xmlf:
             xml = xmlf.read()
-            with self.assertRaises(UnicodeDecodeError):
+            with pytest.raises(UnicodeDecodeError):
                 xml.decode('ascii')
 
         # Load the course, but don't make error modules.  This will succeed,
@@ -66,23 +66,23 @@ class TestXMLModuleStore(TestCase):
         store = XMLModuleStore(DATA_DIR, source_dirs=['toy', 'simple'])
         for course in store.get_courses():
             course_locations = store.get_courses_for_wiki(course.wiki_slug)
-            self.assertEqual(len(course_locations), 1)
-            self.assertIn(course.location.course_key, course_locations)
+            assert len(course_locations) == 1
+            assert course.location.course_key in course_locations
 
         course_locations = store.get_courses_for_wiki('no_such_wiki')
-        self.assertEqual(len(course_locations), 0)
+        assert len(course_locations) == 0
 
         # now set toy course to share the wiki with simple course
         toy_course = store.get_course(CourseKey.from_string('edX/toy/2012_Fall'))
         toy_course.wiki_slug = 'simple'
 
         course_locations = store.get_courses_for_wiki('toy')
-        self.assertEqual(len(course_locations), 0)
+        assert len(course_locations) == 0
 
         course_locations = store.get_courses_for_wiki('simple')
-        self.assertEqual(len(course_locations), 2)
+        assert len(course_locations) == 2
         for course_number in ['toy', 'simple']:
-            self.assertIn(CourseKey.from_string('/'.join(['edX', course_number, '2012_Fall'])), course_locations)
+            assert CourseKey.from_string('/'.join(['edX', course_number, '2012_Fall'])) in course_locations
 
     def test_has_course(self):
         """
@@ -106,7 +106,7 @@ class TestXMLModuleStore(TestCase):
             store.get_item(course.location)
 
         # XML store does NOT allow draft_preferred branch setting
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             with store.branch_setting(ModuleStoreEnum.Branch.draft_preferred, course.id):
                 # verify that the above context manager raises a ValueError
                 pass  # pragma: no cover
@@ -130,15 +130,15 @@ class TestXMLModuleStore(TestCase):
         shared_item_loc = course_key.make_usage_key('html', 'toyhtml')
         shared_item = store.get_item(shared_item_loc)
         parent = shared_item.get_parent()
-        self.assertIsNotNone(parent, "get_parent failed to return a value")
+        assert parent is not None, 'get_parent failed to return a value'
         parent_loc = course_key.make_usage_key('vertical', 'vertical_test')
-        self.assertEqual(parent.location, parent_loc)
-        self.assertIn(shared_item.location, [x.location for x in parent.get_children()])
+        assert parent.location == parent_loc
+        assert shared_item.location in [x.location for x in parent.get_children()]
         # ensure it's still a child of the other parent even tho it doesn't claim the other parent as its parent
         other_parent_loc = course_key.make_usage_key('vertical', 'zeta')
         other_parent = store.get_item(other_parent_loc)
         # children rather than get_children b/c the instance returned by get_children != shared_item
-        self.assertIn(shared_item_loc, other_parent.children)
+        assert shared_item_loc in other_parent.children
 
 
 class TestModuleStoreIgnore(TestXMLModuleStore):  # lint-amnesty, pylint: disable=missing-class-docstring, test-inherits-tests
@@ -156,5 +156,5 @@ class TestModuleStoreIgnore(TestXMLModuleStore):  # lint-amnesty, pylint: disabl
             'about', 'index',
         )
         about_module = modulestore.get_item(about_location)
-        self.assertIn("GREEN", about_module.data)
-        self.assertNotIn("RED", about_module.data)
+        assert 'GREEN' in about_module.data
+        assert 'RED' not in about_module.data
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_xml_importer.py b/common/lib/xmodule/xmodule/modulestore/tests/test_xml_importer.py
index 042c8010d1eabcc0ab763f822c82d5cba5fc6bd1..b702a574b1e7426f41c62f391d2a97058610f91d 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_xml_importer.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_xml_importer.py
@@ -7,7 +7,7 @@ import importlib
 import os
 import unittest
 from uuid import uuid4
-
+import pytest
 import mock
 import six
 from opaque_keys.edx.keys import CourseKey
@@ -165,22 +165,16 @@ class RemapNamespaceTest(ModuleStoreNoSettings):
         )
 
         # Check the XBlock's location
-        self.assertEqual(new_version.location.course_key, target_location_namespace)
+        assert new_version.location.course_key == target_location_namespace
 
         # Check the values of the fields.
         # The content and settings fields should be preserved
-        self.assertEqual(new_version.test_content_field, 'Explicitly set')
-        self.assertEqual(new_version.test_settings_field, 'Explicitly set')
+        assert new_version.test_content_field == 'Explicitly set'
+        assert new_version.test_settings_field == 'Explicitly set'
 
         # Expect that these fields are marked explicitly set
-        self.assertIn(
-            'test_content_field',
-            new_version.get_explicitly_set_fields_by_scope(scope=Scope.content)
-        )
-        self.assertIn(
-            'test_settings_field',
-            new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
-        )
+        assert 'test_content_field' in new_version.get_explicitly_set_fields_by_scope(scope=Scope.content)
+        assert 'test_settings_field' in new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
 
     def test_remap_namespace_native_xblock_default_values(self):
 
@@ -203,18 +197,12 @@ class RemapNamespaceTest(ModuleStoreNoSettings):
 
         # Check the values of the fields.
         # The content and settings fields should be the default values
-        self.assertEqual(new_version.test_content_field, 'default value')
-        self.assertEqual(new_version.test_settings_field, 'default value')
+        assert new_version.test_content_field == 'default value'
+        assert new_version.test_settings_field == 'default value'
 
         # The fields should NOT appear in the explicitly set fields
-        self.assertNotIn(
-            'test_content_field',
-            new_version.get_explicitly_set_fields_by_scope(scope=Scope.content)
-        )
-        self.assertNotIn(
-            'test_settings_field',
-            new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
-        )
+        assert 'test_content_field' not in new_version.get_explicitly_set_fields_by_scope(scope=Scope.content)
+        assert 'test_settings_field' not in new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
 
     def test_remap_namespace_native_xblock_inherited_values(self):
 
@@ -234,12 +222,8 @@ class RemapNamespaceTest(ModuleStoreNoSettings):
         )
 
         # Inherited fields should NOT be explicitly set
-        self.assertNotIn(
-            'start', new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
-        )
-        self.assertNotIn(
-            'graded', new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
-        )
+        assert 'start' not in new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
+        assert 'graded' not in new_version.get_explicitly_set_fields_by_scope(scope=Scope.settings)
 
     def test_xblock_invalid_field_value_type(self):
         # Setting the wrong field-value in Xblock-field will raise TypeError.
@@ -255,7 +239,7 @@ class RemapNamespaceTest(ModuleStoreNoSettings):
         # clearing the dirty fields and removing value from cache will fetch the value from field-data.
         self.xblock._dirty_fields = {}  # pylint: disable=protected-access
         self.xblock.fields['test_content_field']._del_cached_value(self.xblock)  # lint-amnesty, pylint: disable=protected-access, unsubscriptable-object
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             self.xblock.get_explicitly_set_fields_by_scope(scope=Scope.content)
 
 
@@ -326,15 +310,15 @@ class UpdateLocationTest(ModuleStoreNoSettings):
         new_version = self.xblock  # _update_module_location updates in-place
 
         # Check the XBlock's location
-        self.assertEqual(new_version.location, target_location)
+        assert new_version.location == target_location
 
         # Check the values of the fields.
         # The content, settings and children fields should be preserved
-        self.assertEqual(new_version.test_content_field, 'Explicitly set')
-        self.assertEqual(new_version.test_settings_field, 'Explicitly set')
-        self.assertEqual(new_version.test_mutable_content_field, [1, 2, 3])
-        self.assertEqual(new_version.test_mutable_settings_field, ["a", "s", "d"])
-        self.assertEqual(new_version.children, self.fake_children_locations)
+        assert new_version.test_content_field == 'Explicitly set'
+        assert new_version.test_settings_field == 'Explicitly set'
+        assert new_version.test_mutable_content_field == [1, 2, 3]
+        assert new_version.test_mutable_settings_field == ['a', 's', 'd']
+        assert new_version.children == self.fake_children_locations
 
         # Expect that these fields are marked explicitly set
         self._check_explicitly_set(new_version, Scope.content, self.CONTENT_FIELDS, should_be_set=True)
@@ -343,7 +327,7 @@ class UpdateLocationTest(ModuleStoreNoSettings):
 
         # Expect these fields pass "is_set_on" test
         for field in self.CONTENT_FIELDS + self.SETTINGS_FIELDS + self.CHILDREN_FIELDS:
-            self.assertTrue(new_version.fields[field].is_set_on(new_version))  # lint-amnesty, pylint: disable=unsubscriptable-object
+            assert new_version.fields[field].is_set_on(new_version)  # pylint: disable=unsubscriptable-object
 
 
 class StaticContentImporterTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
diff --git a/common/lib/xmodule/xmodule/partitions/tests/test_partitions.py b/common/lib/xmodule/xmodule/partitions/tests/test_partitions.py
index c1714947007593c825159575e7dd42cdfbcb6752..804759dd5fe6190e8bf6f6e05ed425badee27e02 100644
--- a/common/lib/xmodule/xmodule/partitions/tests/test_partitions.py
+++ b/common/lib/xmodule/xmodule/partitions/tests/test_partitions.py
@@ -6,6 +6,7 @@ Test the partitions and partitions service
 
 from datetime import datetime
 
+import pytest
 import six
 from django.test import TestCase
 from mock import Mock, patch  # lint-amnesty, pylint: disable=unused-import
@@ -31,14 +32,14 @@ class TestGroup(TestCase):
         test_id = 10
         name = "Grendel"
         group = Group(test_id, name)
-        self.assertEqual(group.id, test_id)
-        self.assertEqual(group.name, name)
+        assert group.id == test_id
+        assert group.name == name
 
     def test_string_id(self):
         test_id = "10"
         name = "Grendel"
         group = Group(test_id, name)
-        self.assertEqual(group.id, 10)
+        assert group.id == 10
 
     def test_to_json(self):
         test_id = 10
@@ -50,7 +51,7 @@ class TestGroup(TestCase):
             "name": name,
             "version": group.VERSION
         }
-        self.assertEqual(jsonified, act_jsonified)
+        assert jsonified == act_jsonified
 
     def test_from_json(self):
         test_id = 5
@@ -61,8 +62,8 @@ class TestGroup(TestCase):
             "version": Group.VERSION
         }
         group = Group.from_json(jsonified)
-        self.assertEqual(group.id, test_id)
-        self.assertEqual(group.name, name)
+        assert group.id == test_id
+        assert group.name == name
 
     def test_from_json_broken(self):
         test_id = 5
@@ -92,7 +93,7 @@ class TestGroup(TestCase):
             "programmer": "Cale"
         }
         group = Group.from_json(jsonified)
-        self.assertNotIn("programmer", group.to_json())
+        assert 'programmer' not in group.to_json()
 
 
 class MockUserPartitionScheme(object):
@@ -192,12 +193,12 @@ class TestUserPartition(PartitionTestCase):
             MockUserPartitionScheme(),
             self.TEST_PARAMETERS,
         )
-        self.assertEqual(user_partition.id, self.TEST_ID)
-        self.assertEqual(user_partition.name, self.TEST_NAME)
-        self.assertEqual(user_partition.description, self.TEST_DESCRIPTION)
-        self.assertEqual(user_partition.groups, self.TEST_GROUPS)
-        self.assertEqual(user_partition.scheme.name, self.TEST_SCHEME_NAME)
-        self.assertEqual(user_partition.parameters, self.TEST_PARAMETERS)
+        assert user_partition.id == self.TEST_ID
+        assert user_partition.name == self.TEST_NAME
+        assert user_partition.description == self.TEST_DESCRIPTION
+        assert user_partition.groups == self.TEST_GROUPS
+        assert user_partition.scheme.name == self.TEST_SCHEME_NAME
+        assert user_partition.parameters == self.TEST_PARAMETERS
 
     def test_string_id(self):
         user_partition = UserPartition(
@@ -208,7 +209,7 @@ class TestUserPartition(PartitionTestCase):
             MockUserPartitionScheme(),
             self.TEST_PARAMETERS,
         )
-        self.assertEqual(user_partition.id, 70)
+        assert user_partition.id == 70
 
     def test_to_json(self):
         jsonified = self.user_partition.to_json()
@@ -222,7 +223,7 @@ class TestUserPartition(PartitionTestCase):
             "scheme": self.TEST_SCHEME_NAME,
             "active": True,
         }
-        self.assertEqual(jsonified, act_jsonified)
+        assert jsonified == act_jsonified
 
     def test_from_json(self):
         jsonified = {
@@ -235,16 +236,16 @@ class TestUserPartition(PartitionTestCase):
             "scheme": "mock",
         }
         user_partition = UserPartition.from_json(jsonified)
-        self.assertEqual(user_partition.id, self.TEST_ID)
-        self.assertEqual(user_partition.name, self.TEST_NAME)
-        self.assertEqual(user_partition.description, self.TEST_DESCRIPTION)
-        self.assertEqual(user_partition.parameters, self.TEST_PARAMETERS)
+        assert user_partition.id == self.TEST_ID
+        assert user_partition.name == self.TEST_NAME
+        assert user_partition.description == self.TEST_DESCRIPTION
+        assert user_partition.parameters == self.TEST_PARAMETERS
 
         for act_group in user_partition.groups:
-            self.assertIn(act_group.id, [0, 1])
+            assert act_group.id in [0, 1]
             exp_group = self.TEST_GROUPS[act_group.id]
-            self.assertEqual(exp_group.id, act_group.id)
-            self.assertEqual(exp_group.name, act_group.name)
+            assert exp_group.id == act_group.id
+            assert exp_group.name == act_group.name
 
     def test_version_upgrade(self):
         # Test that version 1 partitions did not have a scheme specified
@@ -257,9 +258,9 @@ class TestUserPartition(PartitionTestCase):
             "version": 1,
         }
         user_partition = UserPartition.from_json(jsonified)
-        self.assertEqual(user_partition.scheme.name, "random")
-        self.assertEqual(user_partition.parameters, {})
-        self.assertTrue(user_partition.active)
+        assert user_partition.scheme.name == 'random'
+        assert user_partition.parameters == {}
+        assert user_partition.active
 
     def test_version_upgrade_2_to_3(self):
         # Test that version 3 user partition raises error if 'scheme' field is
@@ -287,9 +288,9 @@ class TestUserPartition(PartitionTestCase):
             "scheme": self.TEST_SCHEME_NAME,
         }
         user_partition = UserPartition.from_json(jsonified)
-        self.assertEqual(user_partition.scheme.name, self.TEST_SCHEME_NAME)
-        self.assertEqual(user_partition.parameters, {})
-        self.assertTrue(user_partition.active)
+        assert user_partition.scheme.name == self.TEST_SCHEME_NAME
+        assert user_partition.parameters == {}
+        assert user_partition.active
 
         # now test that parameters dict is present in response with same value
         # as provided
@@ -303,8 +304,8 @@ class TestUserPartition(PartitionTestCase):
             "scheme": self.TEST_SCHEME_NAME,
         }
         user_partition = UserPartition.from_json(jsonified)
-        self.assertEqual(user_partition.parameters, self.TEST_PARAMETERS)
-        self.assertTrue(user_partition.active)
+        assert user_partition.parameters == self.TEST_PARAMETERS
+        assert user_partition.active
 
     def test_from_json_broken(self):
         # Missing field
@@ -369,7 +370,7 @@ class TestUserPartition(PartitionTestCase):
             "programmer": "Cale",
         }
         user_partition = UserPartition.from_json(jsonified)
-        self.assertNotIn("programmer", user_partition.to_json())
+        assert 'programmer' not in user_partition.to_json()
 
         # No error on missing parameters key (which is optional)
         jsonified = {
@@ -381,7 +382,7 @@ class TestUserPartition(PartitionTestCase):
             "scheme": "mock",
         }
         user_partition = UserPartition.from_json(jsonified)
-        self.assertEqual(user_partition.parameters, {})
+        assert user_partition.parameters == {}
 
     def test_get_group(self):
         """
@@ -389,15 +390,9 @@ class TestUserPartition(PartitionTestCase):
         `group_id` parameter, or raises NoSuchUserPartitionGroupError when
         the lookup fails.
         """
-        self.assertEqual(
-            self.user_partition.get_group(self.TEST_GROUPS[0].id),
-            self.TEST_GROUPS[0]
-        )
-        self.assertEqual(
-            self.user_partition.get_group(self.TEST_GROUPS[1].id),
-            self.TEST_GROUPS[1]
-        )
-        with self.assertRaises(NoSuchUserPartitionGroupError):
+        assert self.user_partition.get_group(self.TEST_GROUPS[0].id) == self.TEST_GROUPS[0]
+        assert self.user_partition.get_group(self.TEST_GROUPS[1].id) == self.TEST_GROUPS[1]
+        with pytest.raises(NoSuchUserPartitionGroupError):
             self.user_partition.get_group(3)
 
     def test_forward_compatibility(self):
@@ -415,8 +410,8 @@ class TestUserPartition(PartitionTestCase):
             "additional_new_field": "foo",
         }
         partition = UserPartition.from_json(newer_version_json)
-        self.assertEqual(partition.id, self.TEST_ID)
-        self.assertEqual(partition.name, self.TEST_NAME)
+        assert partition.id == self.TEST_ID
+        assert partition.name == self.TEST_NAME
 
 
 class MockPartitionService(PartitionService):
@@ -506,10 +501,7 @@ class TestPartitionService(PartitionServiceBaseClass):
         # Make sure our partition services all return the right thing, but skip
         # ps_shared_cache_2 so we can see if its cache got updated anyway.
         for part_svc in [ps_shared_cache_1, ps_diff_cache, ps_uncached]:
-            self.assertEqual(
-                first_group.id,
-                part_svc.get_user_group_id_for_partition(self.user, user_partition_id)
-            )
+            assert first_group.id == part_svc.get_user_group_id_for_partition(self.user, user_partition_id)
 
         # Now select a new target group
         second_group = self.user_partition.groups[1]
@@ -519,23 +511,14 @@ class TestPartitionService(PartitionServiceBaseClass):
         # ps_shared_cache_2, which was never asked for the value the first time
         # Likewise, our separately cached piece should return the original answer
         for part_svc in [ps_shared_cache_1, ps_shared_cache_2, ps_diff_cache]:
-            self.assertEqual(
-                first_group.id,
-                part_svc.get_user_group_id_for_partition(self.user, user_partition_id)
-            )
+            assert first_group.id == part_svc.get_user_group_id_for_partition(self.user, user_partition_id)
 
         # Our uncached service should be accurate.
-        self.assertEqual(
-            second_group.id,
-            ps_uncached.get_user_group_id_for_partition(self.user, user_partition_id)
-        )
+        assert second_group.id == ps_uncached.get_user_group_id_for_partition(self.user, user_partition_id)
 
         # And a newly created service should see the right thing
         ps_new_cache = self._create_service(username, {})
-        self.assertEqual(
-            second_group.id,
-            ps_new_cache.get_user_group_id_for_partition(self.user, user_partition_id)
-        )
+        assert second_group.id == ps_new_cache.get_user_group_id_for_partition(self.user, user_partition_id)
 
     def test_get_group(self):
         """
@@ -546,12 +529,12 @@ class TestPartitionService(PartitionServiceBaseClass):
         # assign first group and verify that it is returned for the user
         self.user_partition.scheme.current_group = groups[0]
         group1 = self.partition_service.get_group(self.user, self.user_partition)
-        self.assertEqual(group1, groups[0])
+        assert group1 == groups[0]
 
         # switch to the second group and verify that it is returned for the user
         self.user_partition.scheme.current_group = groups[1]
         group2 = self.partition_service.get_group(self.user, self.user_partition)
-        self.assertEqual(group2, groups[1])
+        assert group2 == groups[1]
 
 
 class TestGetCourseUserPartitions(PartitionServiceBaseClass):
@@ -575,12 +558,12 @@ class TestGetCourseUserPartitions(PartitionServiceBaseClass):
         Test that the dynamic enrollment track scheme is added if there is no conflict with the user partition ID.
         """
         all_partitions = get_all_partitions_for_course(self.course)
-        self.assertEqual(2, len(all_partitions))
-        self.assertEqual(self.TEST_SCHEME_NAME, all_partitions[0].scheme.name)
+        assert 2 == len(all_partitions)
+        assert self.TEST_SCHEME_NAME == all_partitions[0].scheme.name
         enrollment_track_partition = all_partitions[1]
-        self.assertEqual(self.ENROLLMENT_TRACK_SCHEME_NAME, enrollment_track_partition.scheme.name)
-        self.assertEqual(six.text_type(self.course.id), enrollment_track_partition.parameters['course_id'])
-        self.assertEqual(ENROLLMENT_TRACK_PARTITION_ID, enrollment_track_partition.id)
+        assert self.ENROLLMENT_TRACK_SCHEME_NAME == enrollment_track_partition.scheme.name
+        assert six.text_type(self.course.id) == enrollment_track_partition.parameters['course_id']
+        assert ENROLLMENT_TRACK_PARTITION_ID == enrollment_track_partition.id
 
     def test_enrollment_track_partition_not_added_if_conflict(self):
         """
@@ -596,8 +579,8 @@ class TestGetCourseUserPartitions(PartitionServiceBaseClass):
         )
         self.course.user_partitions = [self.user_partition]
         all_partitions = get_all_partitions_for_course(self.course)
-        self.assertEqual(1, len(all_partitions))
-        self.assertEqual(self.TEST_SCHEME_NAME, all_partitions[0].scheme.name)
+        assert 1 == len(all_partitions)
+        assert self.TEST_SCHEME_NAME == all_partitions[0].scheme.name
 
     def test_enrollment_track_partition_not_added_if_disabled(self):
         """
@@ -605,8 +588,8 @@ class TestGetCourseUserPartitions(PartitionServiceBaseClass):
         """
         TestGetCourseUserPartitions._enable_enrollment_track_partition(False)
         all_partitions = get_all_partitions_for_course(self.course)
-        self.assertEqual(1, len(all_partitions))
-        self.assertEqual(self.TEST_SCHEME_NAME, all_partitions[0].scheme.name)
+        assert 1 == len(all_partitions)
+        assert self.TEST_SCHEME_NAME == all_partitions[0].scheme.name
 
     def test_filter_inactive_user_partitions(self):
         """
@@ -624,10 +607,10 @@ class TestGetCourseUserPartitions(PartitionServiceBaseClass):
         self.course.user_partitions = [self.user_partition]
 
         all_partitions = get_all_partitions_for_course(self.course, active_only=True)
-        self.assertEqual(1, len(all_partitions))
-        self.assertEqual(self.ENROLLMENT_TRACK_SCHEME_NAME, all_partitions[0].scheme.name)
+        assert 1 == len(all_partitions)
+        assert self.ENROLLMENT_TRACK_SCHEME_NAME == all_partitions[0].scheme.name
 
         all_partitions = get_all_partitions_for_course(self.course, active_only=False)
-        self.assertEqual(2, len(all_partitions))
-        self.assertEqual(self.TEST_SCHEME_NAME, all_partitions[0].scheme.name)
-        self.assertEqual(self.ENROLLMENT_TRACK_SCHEME_NAME, all_partitions[1].scheme.name)
+        assert 2 == len(all_partitions)
+        assert self.TEST_SCHEME_NAME == all_partitions[0].scheme.name
+        assert self.ENROLLMENT_TRACK_SCHEME_NAME == all_partitions[1].scheme.name
diff --git a/common/lib/xmodule/xmodule/tests/__init__.py b/common/lib/xmodule/xmodule/tests/__init__.py
index 79fe8ff2fd1a966b1b573c6ffe07f01c43d8466f..298e12c1463997a89542dcb441fb0892c5d8d782 100644
--- a/common/lib/xmodule/xmodule/tests/__init__.py
+++ b/common/lib/xmodule/xmodule/tests/__init__.py
@@ -187,7 +187,7 @@ class ModelsTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-cl
     def test_load_class(self):
         vc = XModuleDescriptor.load_class('sequential')
         vc_str = "<class 'xmodule.seq_module.SequenceDescriptor'>"
-        self.assertEqual(str(vc), vc_str)
+        assert str(vc) == vc_str
 
 
 class LogicTest(unittest.TestCase):
@@ -307,24 +307,18 @@ class CourseComparisonTest(TestCase):
         elif isinstance(reference_field, ReferenceValueDict):
             expected = {key: extract_key(val) for (key, val) in six.iteritems(expected)}
             actual = {key: extract_key(val) for (key, val) in six.iteritems(actual)}
-        self.assertEqual(
-            expected,
-            actual,
-            LazyFormat(
-                "Field {} doesn't match between usages {} and {}: {!r} != {!r}",
-                reference_field.name,
-                expected_block.scope_ids.usage_id,
-                actual_block.scope_ids.usage_id,
-                expected,
-                actual
-            )
-        )
+        assert expected == actual,\
+            LazyFormat("Field {} doesn't match between usages {} and {}: {!r} != {!r}",
+                       reference_field.name,
+                       expected_block.scope_ids.usage_id,
+                       actual_block.scope_ids.usage_id,
+                       expected, actual)
 
     def assertBlocksEqualByFields(self, expected_block, actual_block):
         """
         Compare block fields to check for equivalence.
         """
-        self.assertEqual(expected_block.fields, actual_block.fields)
+        assert expected_block.fields == actual_block.fields
         for field in expected_block.fields.values():
             self.assertFieldEqual(field, expected_block, actual_block)
 
@@ -337,18 +331,12 @@ class CourseComparisonTest(TestCase):
         else:
             expected = field.read_from(expected_block)
             actual = field.read_from(actual_block)
-            self.assertEqual(
-                expected,
-                actual,
-                LazyFormat(
-                    "Field {} doesn't match between usages {} and {}: {!r} != {!r}",
-                    field.name,
-                    expected_block.scope_ids.usage_id,
-                    actual_block.scope_ids.usage_id,
-                    expected,
-                    actual
-                )
-            )
+            assert expected == actual,\
+                LazyFormat("Field {} doesn't match between usages {} and {}: {!r} != {!r}",
+                           field.name,
+                           expected_block.scope_ids.usage_id,
+                           actual_block.scope_ids.usage_id,
+                           expected, actual)
 
     def assertCoursesEqual(self, expected_store, expected_course_key, actual_store, actual_course_key):
         """
@@ -364,7 +352,7 @@ class CourseComparisonTest(TestCase):
             with actual_store.branch_setting(ModuleStoreEnum.Branch.published_only, actual_course_key):
                 expected_items = expected_store.get_items(expected_course_key, revision=ModuleStoreEnum.RevisionOption.published_only)  # lint-amnesty, pylint: disable=line-too-long
                 actual_items = actual_store.get_items(actual_course_key, revision=ModuleStoreEnum.RevisionOption.published_only)  # lint-amnesty, pylint: disable=line-too-long
-                self.assertGreater(len(expected_items), 0)
+                assert len(expected_items) > 0
                 self._assertCoursesEqual(expected_items, actual_items, actual_course_key)
 
         # if the modulestore supports having a draft branch
@@ -389,7 +377,7 @@ class CourseComparisonTest(TestCase):
         Actual algorithm to compare courses.
         """
 
-        self.assertEqual(len(expected_items), len(actual_items))
+        assert len(expected_items) == len(actual_items)
 
         def map_key(usage_key):
             return (usage_key.block_type, usage_key.block_id)
@@ -416,11 +404,11 @@ class CourseComparisonTest(TestCase):
                 actual_item_location = actual_item_location.replace(name='course')
                 actual_item = actual_item_map.get(map_key(actual_item_location))
             # Formatting the message slows down tests of large courses significantly, so only do it if it would be used
-            self.assertIn(map_key(actual_item_location), list(actual_item_map.keys()))
+            assert map_key(actual_item_location) in list(actual_item_map.keys())
             if actual_item is None:
                 continue
             # compare fields
-            self.assertEqual(expected_item.fields, actual_item.fields)
+            assert expected_item.fields == actual_item.fields
             for field_name, field in six.iteritems(expected_item.fields):
                 if (expected_item.scope_ids.usage_id, field_name) in self.field_exclusions:
                     continue
@@ -431,7 +419,7 @@ class CourseComparisonTest(TestCase):
                     continue
                 self.assertFieldEqual(field, expected_item, actual_item)
             # compare children
-            self.assertEqual(expected_item.has_children, actual_item.has_children)
+            assert expected_item.has_children == actual_item.has_children
             if expected_item.has_children:
                 expected_children = [
                     (expected_item_child.location.block_type, expected_item_child.location.block_id)
@@ -443,7 +431,7 @@ class CourseComparisonTest(TestCase):
                     # get_children() rather than children to strip privates from public parents
                     for item_child in actual_item.get_children()
                 ]
-                self.assertEqual(expected_children, actual_children)
+                assert expected_children == actual_children
 
     def assertAssetEqual(self, expected_course_key, expected_asset, actual_course_key, actual_asset):
         """
@@ -457,20 +445,20 @@ class CourseComparisonTest(TestCase):
 
         expected_key = expected_asset.pop('asset_key')
         actual_key = actual_asset.pop('asset_key')
-        self.assertEqual(expected_key.map_into_course(actual_course_key), actual_key)
-        self.assertEqual(expected_key, actual_key.map_into_course(expected_course_key))
+        assert expected_key.map_into_course(actual_course_key) == actual_key
+        assert expected_key == actual_key.map_into_course(expected_course_key)
 
         expected_filename = expected_asset.pop('filename')
         actual_filename = actual_asset.pop('filename')
-        self.assertEqual(text_type(expected_key), expected_filename)
-        self.assertEqual(text_type(actual_key), actual_filename)
-        self.assertEqual(expected_asset, actual_asset)
+        assert text_type(expected_key) == expected_filename
+        assert text_type(actual_key) == actual_filename
+        assert expected_asset == actual_asset
 
     def _assertAssetsEqual(self, expected_course_key, expected_assets, actual_course_key, actual_assets):  # pylint: disable=invalid-name
         """
         Private helper method for assertAssetsEqual
         """
-        self.assertEqual(len(expected_assets), len(actual_assets))
+        assert len(expected_assets) == len(actual_assets)
 
         actual_assets_map = {asset['asset_key']: asset for asset in actual_assets}
         for expected_item in expected_assets:
@@ -486,7 +474,7 @@ class CourseComparisonTest(TestCase):
         expected_content, expected_count = expected_store.get_all_content_for_course(expected_course_key)
         actual_content, actual_count = actual_store.get_all_content_for_course(actual_course_key)
 
-        self.assertEqual(expected_count, actual_count)
+        assert expected_count == actual_count
         self._assertAssetsEqual(expected_course_key, expected_content, actual_course_key, actual_content)
         expected_thumbs = expected_store.get_all_content_thumbnails_for_course(expected_course_key)
         actual_thumbs = actual_store.get_all_content_thumbnails_for_course(actual_course_key)
@@ -503,10 +491,10 @@ class CourseComparisonTest(TestCase):
         actual_course_assets = actual_modulestore.get_all_asset_metadata(
             actual_course_key, None, sort=('displayname', ModuleStoreEnum.SortOrder.descending)
         )
-        self.assertEqual(len(expected_course_assets), len(actual_course_assets))
+        assert len(expected_course_assets) == len(actual_course_assets)
         for idx, __ in enumerate(expected_course_assets):
             for attr in AssetMetadata.ATTRS_ALLOWED_TO_UPDATE:
                 if attr in ('edited_on',):
                     # edited_on is updated upon import.
                     continue
-                self.assertEqual(getattr(expected_course_assets[idx], attr), getattr(actual_course_assets[idx], attr))
+                assert getattr(expected_course_assets[idx], attr) == getattr(actual_course_assets[idx], attr)
diff --git a/common/lib/xmodule/xmodule/tests/test_annotatable_module.py b/common/lib/xmodule/xmodule/tests/test_annotatable_module.py
index 26787c90c7de0d6dfe05eada99a885ebaa177dd2..b0ca0d985319de76fe7598ad410f4929bd21d2fe 100644
--- a/common/lib/xmodule/xmodule/tests/test_annotatable_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_annotatable_module.py
@@ -51,7 +51,7 @@ class AnnotatableBlockTestCase(unittest.TestCase):  # lint-amnesty, pylint: disa
 
         actual_attr = self.annotatable._get_annotation_data_attr(0, el)  # lint-amnesty, pylint: disable=protected-access
 
-        self.assertIsInstance(actual_attr, dict)
+        assert isinstance(actual_attr, dict)
         self.assertDictEqual(expected_attr, actual_attr)
 
     def test_annotation_class_attr_default(self):
@@ -61,7 +61,7 @@ class AnnotatableBlockTestCase(unittest.TestCase):  # lint-amnesty, pylint: disa
         expected_attr = {'class': {'value': 'annotatable-span highlight'}}
         actual_attr = self.annotatable._get_annotation_class_attr(0, el)  # lint-amnesty, pylint: disable=protected-access
 
-        self.assertIsInstance(actual_attr, dict)
+        assert isinstance(actual_attr, dict)
         self.assertDictEqual(expected_attr, actual_attr)
 
     def test_annotation_class_attr_with_valid_highlight(self):
@@ -79,7 +79,7 @@ class AnnotatableBlockTestCase(unittest.TestCase):  # lint-amnesty, pylint: disa
             }
             actual_attr = self.annotatable._get_annotation_class_attr(0, el)  # lint-amnesty, pylint: disable=protected-access
 
-            self.assertIsInstance(actual_attr, dict)
+            assert isinstance(actual_attr, dict)
             self.assertDictEqual(expected_attr, actual_attr)
 
     def test_annotation_class_attr_with_invalid_highlight(self):
@@ -95,7 +95,7 @@ class AnnotatableBlockTestCase(unittest.TestCase):  # lint-amnesty, pylint: disa
             }
             actual_attr = self.annotatable._get_annotation_class_attr(0, el)  # lint-amnesty, pylint: disable=protected-access
 
-            self.assertIsInstance(actual_attr, dict)
+            assert isinstance(actual_attr, dict)
             self.assertDictEqual(expected_attr, actual_attr)
 
     def test_render_annotation(self):
@@ -105,33 +105,33 @@ class AnnotatableBlockTestCase(unittest.TestCase):  # lint-amnesty, pylint: disa
         actual_el = etree.fromstring('<annotation title="x" body="y" problem="0" highlight="yellow">z</annotation>')
         self.annotatable._render_annotation(0, actual_el)  # lint-amnesty, pylint: disable=protected-access
 
-        self.assertEqual(expected_el.tag, actual_el.tag)
-        self.assertEqual(expected_el.text, actual_el.text)
+        assert expected_el.tag == actual_el.tag
+        assert expected_el.text == actual_el.text
         self.assertDictEqual(dict(expected_el.attrib), dict(actual_el.attrib))
 
     def test_render_content(self):
         content = self.annotatable._render_content()  # lint-amnesty, pylint: disable=protected-access
         el = etree.fromstring(content)
 
-        self.assertEqual('div', el.tag, 'root tag is a div')
+        assert 'div' == el.tag, 'root tag is a div'
 
         expected_num_annotations = 5
         actual_num_annotations = el.xpath('count(//span[contains(@class,"annotatable-span")])')
-        self.assertEqual(expected_num_annotations, actual_num_annotations, 'check number of annotations')
+        assert expected_num_annotations == actual_num_annotations, 'check number of annotations'
 
     def test_get_html(self):
         context = self.annotatable.get_html()
         for key in ['display_name', 'element_id', 'content_html', 'instructions_html']:
-            self.assertIn(key, context)
+            assert key in context
 
     def test_extract_instructions(self):
         xmltree = etree.fromstring(self.sample_xml)
 
         expected_xml = u"<div>Read the text.</div>"
         actual_xml = self.annotatable._extract_instructions(xmltree)  # lint-amnesty, pylint: disable=protected-access
-        self.assertIsNotNone(actual_xml)
-        self.assertEqual(expected_xml.strip(), actual_xml.strip())
+        assert actual_xml is not None
+        assert expected_xml.strip() == actual_xml.strip()
 
         xmltree = etree.fromstring('<annotatable>foo</annotatable>')
         actual = self.annotatable._extract_instructions(xmltree)  # lint-amnesty, pylint: disable=protected-access
-        self.assertIsNone(actual)
+        assert actual is None
diff --git a/common/lib/xmodule/xmodule/tests/test_annotator_mixin.py b/common/lib/xmodule/xmodule/tests/test_annotator_mixin.py
index b4903b0863e61a6edc5cab88ba3b5d2db2f0e70e..813e265d8e95551c450f0b0bc6216acb4214288e 100644
--- a/common/lib/xmodule/xmodule/tests/test_annotator_mixin.py
+++ b/common/lib/xmodule/xmodule/tests/test_annotator_mixin.py
@@ -32,12 +32,12 @@ class HelperFunctionTest(unittest.TestCase):
 
         expected_xml = u"<div><p>Helper Test Instructions.</p></div>"
         actual_xml = get_instructions(xmltree)
-        self.assertIsNotNone(actual_xml)
-        self.assertEqual(expected_xml.strip(), actual_xml.strip())
+        assert actual_xml is not None
+        assert expected_xml.strip() == actual_xml.strip()
 
         xmltree = etree.fromstring('<annotatable>foo</annotatable>')
         actual = get_instructions(xmltree)
-        self.assertIsNone(actual)
+        assert actual is None
 
     def test_get_extension(self):
         """
@@ -47,10 +47,10 @@ class HelperFunctionTest(unittest.TestCase):
         expectednotyoutube = 'video/mp4'
         result1 = get_extension(self.sample_sourceurl)
         result2 = get_extension(self.sample_youtubeurl)
-        self.assertEqual(expectedyoutube, result2)
-        self.assertEqual(expectednotyoutube, result1)
+        assert expectedyoutube == result2
+        assert expectednotyoutube == result1
 
     def test_html_to_text(self):
         expectedtext = "Testing here and not bolded here"
         result = html_to_text(self.sample_html)
-        self.assertEqual(expectedtext, result)
+        assert expectedtext == result
diff --git a/common/lib/xmodule/xmodule/tests/test_capa_module.py b/common/lib/xmodule/xmodule/tests/test_capa_module.py
index 0587ecf5ef5ba3b86e3f25a75af0fe72e6a8ef44..f79d197e45e3d9ea1195fd94fa07b897eb88b8d4 100644
--- a/common/lib/xmodule/xmodule/tests/test_capa_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_capa_module.py
@@ -12,6 +12,7 @@ import random
 import textwrap
 import unittest
 
+import pytest
 import ddt
 import requests
 import six
@@ -194,22 +195,21 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
     def test_import(self):
         module = CapaFactory.create()
-        self.assertEqual(module.get_score().raw_earned, 0)
+        assert module.get_score().raw_earned == 0
 
         other_module = CapaFactory.create()
-        self.assertEqual(module.get_score().raw_earned, 0)
-        self.assertNotEqual(module.url_name, other_module.url_name,
-                            "Factory should be creating unique names for each problem")
+        assert module.get_score().raw_earned == 0
+        assert module.url_name != other_module.url_name, 'Factory should be creating unique names for each problem'
 
     def test_correct(self):
         """
         Check that the factory creates correct and incorrect problems properly.
         """
         module = CapaFactory.create()
-        self.assertEqual(module.get_score().raw_earned, 0)
+        assert module.get_score().raw_earned == 0
 
         other_module = CapaFactory.create(correct=True)
-        self.assertEqual(other_module.get_score().raw_earned, 1)
+        assert other_module.get_score().raw_earned == 1
 
     def test_get_score(self):
         """
@@ -222,17 +222,17 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create(correct=True, override_get_score=False)
         module.lcp.correct_map = correct_map
         module.lcp.student_answers = student_answers
-        self.assertEqual(module.get_score().raw_earned, 0.0)
+        assert module.get_score().raw_earned == 0.0
         module.set_score(module.score_from_lcp(module.lcp))
-        self.assertEqual(module.get_score().raw_earned, 0.9)
+        assert module.get_score().raw_earned == 0.9
 
         other_correct_map = CorrectMap(answer_id='1_2_1', correctness="incorrect", npoints=0.1)
         other_module = CapaFactory.create(correct=False, override_get_score=False)
         other_module.lcp.correct_map = other_correct_map
         other_module.lcp.student_answers = student_answers
-        self.assertEqual(other_module.get_score().raw_earned, 0.0)
+        assert other_module.get_score().raw_earned == 0.0
         other_module.set_score(other_module.score_from_lcp(other_module.lcp))
-        self.assertEqual(other_module.get_score().raw_earned, 0.1)
+        assert other_module.get_score().raw_earned == 0.1
 
     def test_showanswer_default(self):
         """
@@ -241,7 +241,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # default, no due date, showanswer 'closed', so problem is open, and show_answer
         # not visible.
         problem = CapaFactory.create()
-        self.assertFalse(problem.answer_available())
+        assert not problem.answer_available()
 
     @ddt.data(
         (requests.exceptions.ReadTimeout, (1, 'failed to read from the server')),
@@ -257,13 +257,13 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         with patch.object(xqueue_interface.session, 'post', side_effect=exception):
             # pylint: disable = protected-access
             response = xqueue_interface._http_post('http://some/fake/url', {})
-            self.assertEqual(response, result)
+            assert response == result
 
     def test_showanswer_attempted(self):
         problem = CapaFactory.create(showanswer='attempted')
-        self.assertFalse(problem.answer_available())
+        assert not problem.answer_available()
         problem.attempts = 1
-        self.assertTrue(problem.answer_available())
+        assert problem.answer_available()
 
     @ddt.data(
         # If show_correctness=always, Answer is visible after attempted
@@ -285,9 +285,9 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         if 'due' in problem_data:
             problem_data['due'] = getattr(self, problem_data['due'])
         problem = CapaFactory.create(**problem_data)
-        self.assertEqual(problem.answer_available(), answer_available_no_attempt)
+        assert problem.answer_available() == answer_available_no_attempt
         problem.attempts = 1
-        self.assertEqual(problem.answer_available(), answer_available_after_attempt)
+        assert problem.answer_available() == answer_available_after_attempt
 
     def test_showanswer_closed(self):
 
@@ -296,7 +296,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                                max_attempts="1",
                                                attempts="1",
                                                due=self.tomorrow_str)
-        self.assertTrue(used_all_attempts.answer_available())
+        assert used_all_attempts.answer_available()
 
         # can see after due date
         after_due_date = CapaFactory.create(showanswer='closed',
@@ -304,14 +304,14 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                             attempts="0",
                                             due=self.yesterday_str)
 
-        self.assertTrue(after_due_date.answer_available())
+        assert after_due_date.answer_available()
 
         # can't see because attempts left
         attempts_left_open = CapaFactory.create(showanswer='closed',
                                                 max_attempts="1",
                                                 attempts="0",
                                                 due=self.tomorrow_str)
-        self.assertFalse(attempts_left_open.answer_available())
+        assert not attempts_left_open.answer_available()
 
         # Can't see because grace period hasn't expired
         still_in_grace = CapaFactory.create(showanswer='closed',
@@ -319,7 +319,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                             attempts="0",
                                             due=self.yesterday_str,
                                             graceperiod=self.two_day_delta_str)
-        self.assertFalse(still_in_grace.answer_available())
+        assert not still_in_grace.answer_available()
 
     def test_showanswer_correct_or_past_due(self):
         """
@@ -333,14 +333,14 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                             attempts="0",
                                             due=self.tomorrow_str,
                                             correct=True)
-        self.assertTrue(answer_correct.answer_available())
+        assert answer_correct.answer_available()
 
         # can see after due date, even when answer isn't correct
         past_due_date = CapaFactory.create(showanswer='correct_or_past_due',
                                            max_attempts="1",
                                            attempts="0",
                                            due=self.yesterday_str)
-        self.assertTrue(past_due_date.answer_available())
+        assert past_due_date.answer_available()
 
         # can also see after due date when answer _is_ correct
         past_due_date_correct = CapaFactory.create(showanswer='correct_or_past_due',
@@ -348,7 +348,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                                    attempts="0",
                                                    due=self.yesterday_str,
                                                    correct=True)
-        self.assertTrue(past_due_date_correct.answer_available())
+        assert past_due_date_correct.answer_available()
 
         # Can't see because grace period hasn't expired and answer isn't correct
         still_in_grace = CapaFactory.create(showanswer='correct_or_past_due',
@@ -356,7 +356,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                             attempts="1",
                                             due=self.yesterday_str,
                                             graceperiod=self.two_day_delta_str)
-        self.assertFalse(still_in_grace.answer_available())
+        assert not still_in_grace.answer_available()
 
     def test_showanswer_past_due(self):
         """
@@ -369,21 +369,21 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                                max_attempts="1",
                                                attempts="1",
                                                due=self.tomorrow_str)
-        self.assertFalse(used_all_attempts.answer_available())
+        assert not used_all_attempts.answer_available()
 
         # can see after due date
         past_due_date = CapaFactory.create(showanswer='past_due',
                                            max_attempts="1",
                                            attempts="0",
                                            due=self.yesterday_str)
-        self.assertTrue(past_due_date.answer_available())
+        assert past_due_date.answer_available()
 
         # can't see because attempts left
         attempts_left_open = CapaFactory.create(showanswer='past_due',
                                                 max_attempts="1",
                                                 attempts="0",
                                                 due=self.tomorrow_str)
-        self.assertFalse(attempts_left_open.answer_available())
+        assert not attempts_left_open.answer_available()
 
         # Can't see because grace period hasn't expired, even though have no more
         # attempts.
@@ -392,7 +392,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                             attempts="1",
                                             due=self.yesterday_str,
                                             graceperiod=self.two_day_delta_str)
-        self.assertFalse(still_in_grace.answer_available())
+        assert not still_in_grace.answer_available()
 
     def test_showanswer_after_attempts_with_max(self):
         """
@@ -408,7 +408,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             attempts_before_showanswer_button='3',
             max_attempts='5',
         )
-        self.assertFalse(problem.answer_available())
+        assert not problem.answer_available()
 
     def test_showanswer_after_attempts_no_max(self):
         """
@@ -423,7 +423,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             attempts='2',
             attempts_before_showanswer_button='3',
         )
-        self.assertFalse(problem.answer_available())
+        assert not problem.answer_available()
 
     def test_showanswer_after_attempts_used_all_attempts(self):
         """
@@ -440,7 +440,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             attempts='3',
             due=self.tomorrow_str,
         )
-        self.assertTrue(problem.answer_available())
+        assert problem.answer_available()
 
     def test_showanswer_after_attempts_past_due_date(self):
         """
@@ -455,7 +455,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             attempts='2',
             due=self.yesterday_str,
         )
-        self.assertTrue(problem.answer_available())
+        assert problem.answer_available()
 
     def test_showanswer_after_attempts_still_in_grace(self):
         """
@@ -471,7 +471,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             due=self.yesterday_str,
             graceperiod=self.two_day_delta_str,
         )
-        self.assertTrue(problem.answer_available())
+        assert problem.answer_available()
 
     def test_showanswer_after_attempts_large(self):
         """
@@ -487,7 +487,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             max_attempts='3',
             attempts='3',
         )
-        self.assertTrue(problem.answer_available())
+        assert problem.answer_available()
 
     def test_showanswer_after_attempts_zero(self):
         """
@@ -501,7 +501,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             attempts_before_showanswer_button='0',
             attempts='0',
         )
-        self.assertTrue(problem.answer_available())
+        assert problem.answer_available()
 
     def test_showanswer_finished(self):
         """
@@ -514,21 +514,21 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                                max_attempts="1",
                                                attempts="1",
                                                due=self.tomorrow_str)
-        self.assertTrue(used_all_attempts.answer_available())
+        assert used_all_attempts.answer_available()
 
         # can see after due date
         past_due_date = CapaFactory.create(showanswer='finished',
                                            max_attempts="1",
                                            attempts="0",
                                            due=self.yesterday_str)
-        self.assertTrue(past_due_date.answer_available())
+        assert past_due_date.answer_available()
 
         # can't see because attempts left and wrong
         attempts_left_open = CapaFactory.create(showanswer='finished',
                                                 max_attempts="1",
                                                 attempts="0",
                                                 due=self.tomorrow_str)
-        self.assertFalse(attempts_left_open.answer_available())
+        assert not attempts_left_open.answer_available()
 
         # _can_ see because attempts left and right
         correct_ans = CapaFactory.create(showanswer='finished',
@@ -536,7 +536,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                          attempts="0",
                                          due=self.tomorrow_str,
                                          correct=True)
-        self.assertTrue(correct_ans.answer_available())
+        assert correct_ans.answer_available()
 
         # Can see even though grace period hasn't expired, because have no more
         # attempts.
@@ -545,7 +545,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                             attempts="1",
                                             due=self.yesterday_str,
                                             graceperiod=self.two_day_delta_str)
-        self.assertTrue(still_in_grace.answer_available())
+        assert still_in_grace.answer_available()
 
     def test_showanswer_answered(self):
         """
@@ -560,7 +560,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             due=self.tomorrow_str,
             correct=False
         )
-        self.assertFalse(answer_wrong.answer_available())
+        assert not answer_wrong.answer_available()
 
         # Expect to see "Show Answer" when answer is correct
         answer_correct = CapaFactory.create(
@@ -570,7 +570,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             due=self.tomorrow_str,
             correct=True
         )
-        self.assertTrue(answer_correct.answer_available())
+        assert answer_correct.answer_available()
 
     @ddt.data('', 'other-value')
     def test_show_correctness_other(self, show_correctness):
@@ -579,21 +579,21 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         from SHOW_CORRECTNESS constant.
         """
         problem = CapaFactory.create(show_correctness=show_correctness)
-        self.assertTrue(problem.correctness_available())
+        assert problem.correctness_available()
 
     def test_show_correctness_default(self):
         """
         Test that correctness is visible by default.
         """
         problem = CapaFactory.create()
-        self.assertTrue(problem.correctness_available())
+        assert problem.correctness_available()
 
     def test_show_correctness_never(self):
         """
         Test that correctness is hidden when show_correctness turned off.
         """
         problem = CapaFactory.create(show_correctness='never')
-        self.assertFalse(problem.correctness_available())
+        assert not problem.correctness_available()
 
     @ddt.data(
         # Correctness not visible if due date in the future, even after using up all attempts
@@ -616,34 +616,34 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         if 'graceperiod' in problem_data:
             problem_data['graceperiod'] = getattr(self, problem_data['graceperiod'])
         problem = CapaFactory.create(**problem_data)
-        self.assertEqual(problem.correctness_available(), expected_result)
+        assert problem.correctness_available() == expected_result
 
     def test_closed(self):
 
         # Attempts < Max attempts --> NOT closed
         module = CapaFactory.create(max_attempts="1", attempts="0")
-        self.assertFalse(module.closed())
+        assert not module.closed()
 
         # Attempts < Max attempts --> NOT closed
         module = CapaFactory.create(max_attempts="2", attempts="1")
-        self.assertFalse(module.closed())
+        assert not module.closed()
 
         # Attempts = Max attempts --> closed
         module = CapaFactory.create(max_attempts="1", attempts="1")
-        self.assertTrue(module.closed())
+        assert module.closed()
 
         # Attempts > Max attempts --> closed
         module = CapaFactory.create(max_attempts="1", attempts="2")
-        self.assertTrue(module.closed())
+        assert module.closed()
 
         # Max attempts = 0 --> closed
         module = CapaFactory.create(max_attempts="0", attempts="2")
-        self.assertTrue(module.closed())
+        assert module.closed()
 
         # Past due --> closed
         module = CapaFactory.create(max_attempts="1", attempts="0",
                                     due=self.yesterday_str)
-        self.assertTrue(module.closed())
+        assert module.closed()
 
     def test_parse_get_params(self):
 
@@ -664,25 +664,25 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # and that we get the same values back
         for key in result.keys():  # lint-amnesty, pylint: disable=consider-iterating-dictionary
             original_key = "input_" + key
-            self.assertIn(original_key, valid_get_dict, "Output dict should have key %s" % original_key)
-            self.assertEqual(valid_get_dict[original_key], result[key])
+            assert original_key in valid_get_dict, ('Output dict should have key %s' % original_key)
+            assert valid_get_dict[original_key] == result[key]
 
         # Valid GET param dict with list keys
         # Each tuple represents a single parameter in the query string
         valid_get_dict = MultiDict((('input_2[]', 'test1'), ('input_2[]', 'test2')))
         result = ProblemBlock.make_dict_of_responses(valid_get_dict)
-        self.assertIn('2', result)
-        self.assertEqual(['test1', 'test2'], result['2'])
+        assert '2' in result
+        assert ['test1', 'test2'] == result['2']
 
         # If we use [] at the end of a key name, we should always
         # get a list, even if there's just one value
         valid_get_dict = MultiDict({'input_1[]': 'test'})
         result = ProblemBlock.make_dict_of_responses(valid_get_dict)
-        self.assertEqual(result['1'], ['test'])
+        assert result['1'] == ['test']
 
         # If we have no underscores in the name, then the key is invalid
         invalid_get_dict = MultiDict({'input': 'test'})
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             result = ProblemBlock.make_dict_of_responses(invalid_get_dict)
 
         # Two equivalent names (one list, one non-list)
@@ -690,7 +690,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # and raise an exception
         invalid_get_dict = MultiDict({'input_1[]': 'test 1',
                                       'input_1': 'test 2'})
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             result = ProblemBlock.make_dict_of_responses(invalid_get_dict)
 
     def test_submit_problem_correct(self):
@@ -710,15 +710,15 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                 result = module.submit_problem(get_request_dict)
 
         # Expect that the problem is marked correct
-        self.assertEqual(result['success'], 'correct')
+        assert result['success'] == 'correct'
 
         # Expect that we get the (mocked) HTML
-        self.assertEqual(result['contents'], 'Test HTML')
+        assert result['contents'] == 'Test HTML'
 
         # Expect that the number of attempts is incremented by 1
-        self.assertEqual(module.attempts, 2)
+        assert module.attempts == 2
         # and that this was considered attempt number 2 for grading purposes
-        self.assertEqual(module.lcp.context['attempt'], 2)
+        assert module.lcp.context['attempt'] == 2
 
     def test_submit_problem_incorrect(self):
 
@@ -733,12 +733,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = module.submit_problem(get_request_dict)
 
         # Expect that the problem is marked correct
-        self.assertEqual(result['success'], 'incorrect')
+        assert result['success'] == 'incorrect'
 
         # Expect that the number of attempts is incremented by 1
-        self.assertEqual(module.attempts, 1)
+        assert module.attempts == 1
         # and that this is considered the first attempt
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.lcp.context['attempt'] == 1
 
     def test_submit_problem_closed(self):
         module = CapaFactory.create(attempts=3)
@@ -747,12 +747,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Simulate that ProblemBlock.closed() always returns True
         with patch('xmodule.capa_module.ProblemBlock.closed') as mock_closed:
             mock_closed.return_value = True
-            with self.assertRaises(xmodule.exceptions.NotFoundError):
+            with pytest.raises(xmodule.exceptions.NotFoundError):
                 get_request_dict = {CapaFactory.input_key(): '3.14'}
                 module.submit_problem(get_request_dict)
 
         # Expect that number of attempts NOT incremented
-        self.assertEqual(module.attempts, 3)
+        assert module.attempts == 3
 
     @ddt.data(
         RANDOMIZATION.ALWAYS,
@@ -766,12 +766,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module.done = True
 
         # Expect that we cannot submit
-        with self.assertRaises(xmodule.exceptions.NotFoundError):
+        with pytest.raises(xmodule.exceptions.NotFoundError):
             get_request_dict = {CapaFactory.input_key(): '3.14'}
             module.submit_problem(get_request_dict)
 
         # Expect that number of attempts NOT incremented
-        self.assertEqual(module.attempts, 0)
+        assert module.attempts == 0
 
     @ddt.data(
         RANDOMIZATION.NEVER,
@@ -786,11 +786,11 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         get_request_dict = {CapaFactory.input_key(): '3.14'}
         result = module.submit_problem(get_request_dict)
 
-        self.assertEqual(result['success'], 'correct')
+        assert result['success'] == 'correct'
 
         # Expect that number of attempts IS incremented, still same attempt
-        self.assertEqual(module.attempts, 1)
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.attempts == 1
+        assert module.lcp.context['attempt'] == 1
 
     def test_submit_problem_queued(self):
         module = CapaFactory.create(attempts=1)
@@ -809,10 +809,10 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = module.submit_problem(get_request_dict)
 
             # Expect an AJAX alert message in 'success'
-            self.assertIn('You must wait', result['success'])
+            assert 'You must wait' in result['success']
 
         # Expect that the number of attempts is NOT incremented
-        self.assertEqual(module.attempts, 1)
+        assert module.attempts == 1
 
     def test_submit_problem_with_files(self):
         # Check a problem with uploaded files, using the submit_problem API.
@@ -859,11 +859,11 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         #   )
         # pylint: enable=line-too-long
 
-        self.assertEqual(xqueue_interface._http_post.call_count, 1)
+        assert xqueue_interface._http_post.call_count == 1
         _, kwargs = xqueue_interface._http_post.call_args
         six.assertCountEqual(self, fpaths, list(kwargs['files'].keys()))
         for fpath, fileobj in six.iteritems(kwargs['files']):
-            self.assertEqual(fpath, fileobj.name)
+            assert fpath == fileobj.name
 
     def test_submit_problem_with_files_as_xblock(self):
         # Check a problem with uploaded files, using the XBlock API.
@@ -892,11 +892,11 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
         module.handle('xmodule_handler', request, 'problem_check')
 
-        self.assertEqual(xqueue_interface._http_post.call_count, 1)
+        assert xqueue_interface._http_post.call_count == 1
         _, kwargs = xqueue_interface._http_post.call_args
         six.assertCountEqual(self, fnames, list(kwargs['files'].keys()))
         for fpath, fileobj in six.iteritems(kwargs['files']):
-            self.assertEqual(fpath, fileobj.name)
+            assert fpath == fileobj.name
 
     def test_submit_problem_error(self):
 
@@ -918,12 +918,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             # Expect an AJAX alert message in 'success'
             expected_msg = 'test error'
 
-            self.assertEqual(expected_msg, result['success'])
+            assert expected_msg == result['success']
 
             # Expect that the number of attempts is NOT incremented
-            self.assertEqual(module.attempts, 1)
+            assert module.attempts == 1
             # but that this was considered attempt number 2 for grading purposes
-            self.assertEqual(module.lcp.context['attempt'], 2)
+            assert module.lcp.context['attempt'] == 2
 
     def test_submit_problem_error_with_codejail_exception(self):
 
@@ -953,12 +953,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
             # Expect an AJAX alert message in 'success' without the text of the stack trace
             expected_msg = 'Couldn\'t execute jailed code'
-            self.assertEqual(expected_msg, result['success'])
+            assert expected_msg == result['success']
 
             # Expect that the number of attempts is NOT incremented
-            self.assertEqual(module.attempts, 1)
+            assert module.attempts == 1
             # but that this was considered the second attempt for grading purposes
-            self.assertEqual(module.lcp.context['attempt'], 2)
+            assert module.lcp.context['attempt'] == 2
 
     def test_submit_problem_other_errors(self):
         """
@@ -981,7 +981,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = module.submit_problem(get_request_dict)
 
         # Expect an AJAX alert message in 'success'
-        self.assertIn(error_msg, result['success'])
+        assert error_msg in result['success']
 
     def test_submit_problem_zero_max_grade(self):
         """
@@ -1017,12 +1017,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             # Expect an AJAX alert message in 'success'
             expected_msg = u'ȧƈƈḗƞŧḗḓ ŧḗẋŧ ƒǿř ŧḗşŧīƞɠ'
 
-            self.assertEqual(expected_msg, result['success'])
+            assert expected_msg == result['success']
 
             # Expect that the number of attempts is NOT incremented
-            self.assertEqual(module.attempts, 1)
+            assert module.attempts == 1
             # but that this was considered the second attempt for grading purposes
-            self.assertEqual(module.lcp.context['attempt'], 2)
+            assert module.lcp.context['attempt'] == 2
 
     def test_submit_problem_error_with_staff_user(self):
 
@@ -1041,15 +1041,15 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                 result = module.submit_problem(get_request_dict)
 
             # Expect an AJAX alert message in 'success'
-            self.assertIn('test error', result['success'])
+            assert 'test error' in result['success']
 
             # We DO include traceback information for staff users
-            self.assertIn('Traceback', result['success'])
+            assert 'Traceback' in result['success']
 
             # Expect that the number of attempts is NOT incremented
-            self.assertEqual(module.attempts, 1)
+            assert module.attempts == 1
             # but that it was considered the second attempt for grading purposes
-            self.assertEqual(module.lcp.context['attempt'], 2)
+            assert module.lcp.context['attempt'] == 2
 
     @ddt.data(
         ("never", True, None, 'submitted'),
@@ -1075,12 +1075,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = json.loads(json_result)
 
         # Expect that the AJAX result withholds correctness and score
-        self.assertEqual(result['current_score'], expected_score)
-        self.assertEqual(result['success'], expected_success)
+        assert result['current_score'] == expected_score
+        assert result['success'] == expected_success
 
         # Expect that the number of attempts is incremented by 1
-        self.assertEqual(module.attempts, 1)
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.attempts == 1
+        assert module.lcp.context['attempt'] == 1
 
     def test_reset_problem(self):
         module = CapaFactory.create(done=True)
@@ -1096,11 +1096,11 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = module.reset_problem(get_request_dict)
 
         # Expect that the request was successful
-        self.assertTrue('success' in result and result['success'])
+        assert (('success' in result) and result['success'])
 
         # Expect that the problem HTML is retrieved
-        self.assertIn('html', result)
-        self.assertEqual(result['html'], "<div>Test HTML</div>")
+        assert 'html' in result
+        assert result['html'] == '<div>Test HTML</div>'
 
         # Expect that the problem was reset
         module.new_lcp.assert_called_once_with(None)
@@ -1118,7 +1118,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = module.reset_problem(get_request_dict)
 
         # Expect that the problem was NOT reset
-        self.assertTrue('success' in result and not result['success'])
+        assert (('success' in result) and (not result['success']))
 
     def test_reset_problem_not_done(self):
         # Simulate that the problem is NOT done
@@ -1129,7 +1129,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         result = module.reset_problem(get_request_dict)
 
         # Expect that the problem was NOT reset
-        self.assertTrue('success' in result and not result['success'])
+        assert (('success' in result) and (not result['success']))
 
     def test_rescore_problem_correct(self):
 
@@ -1152,12 +1152,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.rescore(only_if_higher=False)
 
         # Expect that the problem is marked correct
-        self.assertEqual(module.is_correct(), True)
+        assert module.is_correct() is True
 
         # Expect that the number of attempts is not incremented
-        self.assertEqual(module.attempts, 1)
+        assert module.attempts == 1
         # and that this was considered attempt number 1 for grading purposes
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.lcp.context['attempt'] == 1
 
     def test_rescore_problem_additional_correct(self):
         # make sure it also works when new correct answer has been added
@@ -1169,13 +1169,13 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         result = module.submit_problem(get_request_dict)
 
         # Expect that the problem is marked incorrect and user didn't earn score
-        self.assertEqual(result['success'], 'incorrect')
-        self.assertEqual(module.get_score(), (0, 1))
-        self.assertEqual(module.correct_map[answer_id]['correctness'], 'incorrect')
+        assert result['success'] == 'incorrect'
+        assert module.get_score() == (0, 1)
+        assert module.correct_map[answer_id]['correctness'] == 'incorrect'
 
         # Expect that the number of attempts has incremented to 1
-        self.assertEqual(module.attempts, 1)
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.attempts == 1
+        assert module.lcp.context['attempt'] == 1
 
         # Simulate that after making an incorrect answer to the correct answer
         # the new calculated score is (1,1)
@@ -1191,12 +1191,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                 module.rescore(only_if_higher=True)
 
         # Expect that the problem is marked correct and user earned the score
-        self.assertEqual(module.get_score(), (1, 1))
-        self.assertEqual(module.correct_map[answer_id]['correctness'], 'correct')
+        assert module.get_score() == (1, 1)
+        assert module.correct_map[answer_id]['correctness'] == 'correct'
         # Expect that the number of attempts is not incremented
-        self.assertEqual(module.attempts, 1)
+        assert module.attempts == 1
         # and hence that this was still considered the first attempt for grading purposes
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.lcp.context['attempt'] == 1
 
     def test_rescore_problem_incorrect(self):
         # make sure it also works when attempts have been reset,
@@ -1210,19 +1210,19 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.rescore(only_if_higher=False)
 
         # Expect that the problem is marked incorrect
-        self.assertEqual(module.is_correct(), False)
+        assert module.is_correct() is False
 
         # Expect that the number of attempts is not incremented
-        self.assertEqual(module.attempts, 0)
+        assert module.attempts == 0
         # and that this is treated as the first attempt for grading purposes
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.lcp.context['attempt'] == 1
 
     def test_rescore_problem_not_done(self):
         # Simulate that the problem is NOT done
         module = CapaFactory.create(done=False)
 
         # Try to rescore the problem, and get exception
-        with self.assertRaises(xmodule.exceptions.NotFoundError):
+        with pytest.raises(xmodule.exceptions.NotFoundError):
             module.rescore(only_if_higher=False)
 
     def test_rescore_problem_not_supported(self):
@@ -1231,7 +1231,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Try to rescore the problem, and get exception
         with patch('capa.capa_problem.LoncapaProblem.supports_rescoring') as mock_supports_rescoring:
             mock_supports_rescoring.return_value = False
-            with self.assertRaises(NotImplementedError):
+            with pytest.raises(NotImplementedError):
                 module.rescore(only_if_higher=False)
 
     def _rescore_problem_error_helper(self, exception_class):
@@ -1242,13 +1242,13 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Simulate answering a problem that raises the exception
         with patch('capa.capa_problem.LoncapaProblem.get_grade_from_current_answers') as mock_rescore:
             mock_rescore.side_effect = exception_class(u'test error \u03a9')
-            with self.assertRaises(exception_class):
+            with pytest.raises(exception_class):
                 module.rescore(only_if_higher=False)
 
         # Expect that the number of attempts is NOT incremented
-        self.assertEqual(module.attempts, 1)
+        assert module.attempts == 1
         # and that this was considered the first attempt for grading purposes
-        self.assertEqual(module.lcp.context['attempt'], 1)
+        assert module.lcp.context['attempt'] == 1
 
     def test_rescore_problem_student_input_error(self):
         self._rescore_problem_error_helper(StudentInputError)
@@ -1268,10 +1268,10 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
         # Expect that answers are saved to the problem
         expected_answers = {CapaFactory.answer_key(): '3.14'}
-        self.assertEqual(module.lcp.student_answers, expected_answers)
+        assert module.lcp.student_answers == expected_answers
 
         # Expect that the result is success
-        self.assertTrue('success' in result and result['success'])
+        assert (('success' in result) and result['success'])
 
     def test_save_problem_closed(self):
         module = CapaFactory.create(done=False)
@@ -1285,7 +1285,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             result = module.save_problem(get_request_dict)
 
         # Expect that the result is failure
-        self.assertTrue('success' in result and not result['success'])
+        assert (('success' in result) and (not result['success']))
 
     @ddt.data(
         RANDOMIZATION.ALWAYS,
@@ -1300,7 +1300,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         result = module.save_problem(get_request_dict)
 
         # Expect that we cannot save
-        self.assertTrue('success' in result and not result['success'])
+        assert (('success' in result) and (not result['success']))
 
     @ddt.data(
         RANDOMIZATION.NEVER,
@@ -1316,15 +1316,15 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         result = module.save_problem(get_request_dict)
 
         # Expect that we succeed
-        self.assertTrue('success' in result and result['success'])
+        assert (('success' in result) and result['success'])
 
     def test_submit_button_name(self):
         module = CapaFactory.create(attempts=0)
-        self.assertEqual(module.submit_button_name(), "Submit")
+        assert module.submit_button_name() == 'Submit'
 
     def test_submit_button_submitting_name(self):
         module = CapaFactory.create(attempts=1, max_attempts=10)
-        self.assertEqual(module.submit_button_submitting_name(), "Submitting")
+        assert module.submit_button_submitting_name() == 'Submitting'
 
     def test_should_enable_submit_button(self):
 
@@ -1332,41 +1332,41 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
         # If we're after the deadline, disable the submit button
         module = CapaFactory.create(due=self.yesterday_str)
-        self.assertFalse(module.should_enable_submit_button())
+        assert not module.should_enable_submit_button()
 
         # If user is out of attempts, disable the submit button
         module = CapaFactory.create(attempts=attempts, max_attempts=attempts)
-        self.assertFalse(module.should_enable_submit_button())
+        assert not module.should_enable_submit_button()
 
         # If survey question (max_attempts = 0), disable the submit button
         module = CapaFactory.create(max_attempts=0)
-        self.assertFalse(module.should_enable_submit_button())
+        assert not module.should_enable_submit_button()
 
         # If user submitted a problem but hasn't reset,
         # disable the submit button
         # Note:  we can only reset when rerandomize="always" or "true"
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, done=True)
-        self.assertFalse(module.should_enable_submit_button())
+        assert not module.should_enable_submit_button()
 
         module = CapaFactory.create(rerandomize="true", done=True)
-        self.assertFalse(module.should_enable_submit_button())
+        assert not module.should_enable_submit_button()
 
         # Otherwise, enable the submit button
         module = CapaFactory.create()
-        self.assertTrue(module.should_enable_submit_button())
+        assert module.should_enable_submit_button()
 
         # If the user has submitted the problem
         # and we do NOT have a reset button, then we can enable the submit button
         # Setting rerandomize to "never" or "false" ensures that the reset button
         # is not shown
         module = CapaFactory.create(rerandomize=RANDOMIZATION.NEVER, done=True)
-        self.assertTrue(module.should_enable_submit_button())
+        assert module.should_enable_submit_button()
 
         module = CapaFactory.create(rerandomize="false", done=True)
-        self.assertTrue(module.should_enable_submit_button())
+        assert module.should_enable_submit_button()
 
         module = CapaFactory.create(rerandomize=RANDOMIZATION.PER_STUDENT, done=True)
-        self.assertTrue(module.should_enable_submit_button())
+        assert module.should_enable_submit_button()
 
     def test_should_show_reset_button(self):
 
@@ -1374,43 +1374,43 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
         # If we're after the deadline, do NOT show the reset button
         module = CapaFactory.create(due=self.yesterday_str, done=True)
-        self.assertFalse(module.should_show_reset_button())
+        assert not module.should_show_reset_button()
 
         # If the user is out of attempts, do NOT show the reset button
         module = CapaFactory.create(attempts=attempts, max_attempts=attempts, done=True)
-        self.assertFalse(module.should_show_reset_button())
+        assert not module.should_show_reset_button()
 
         # pre studio default value, DO show the reset button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, done=True)
-        self.assertTrue(module.should_show_reset_button())
+        assert module.should_show_reset_button()
 
         # If survey question for capa (max_attempts = 0),
         # DO show the reset button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, max_attempts=0, done=True)
-        self.assertTrue(module.should_show_reset_button())
+        assert module.should_show_reset_button()
 
         # If the question is not correct
         # DO show the reset button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, max_attempts=0, done=True, correct=False)
-        self.assertTrue(module.should_show_reset_button())
+        assert module.should_show_reset_button()
 
         # If the question is correct and randomization is never
         # DO not show the reset button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.NEVER, max_attempts=0, done=True, correct=True)
-        self.assertFalse(module.should_show_reset_button())
+        assert not module.should_show_reset_button()
 
         # If the question is correct and randomization is always
         # Show the reset button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, max_attempts=0, done=True, correct=True)
-        self.assertTrue(module.should_show_reset_button())
+        assert module.should_show_reset_button()
 
         # Don't show reset button if randomization is turned on and the question is not done
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, show_reset_button=False, done=False)
-        self.assertFalse(module.should_show_reset_button())
+        assert not module.should_show_reset_button()
 
         # Show reset button if randomization is turned on and the problem is done
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, show_reset_button=False, done=True)
-        self.assertTrue(module.should_show_reset_button())
+        assert module.should_show_reset_button()
 
     def test_should_show_save_button(self):
 
@@ -1418,49 +1418,49 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
         # If we're after the deadline, do NOT show the save button
         module = CapaFactory.create(due=self.yesterday_str, done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         # If the user is out of attempts, do NOT show the save button
         module = CapaFactory.create(attempts=attempts, max_attempts=attempts, done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         # If user submitted a problem but hasn't reset, do NOT show the save button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         module = CapaFactory.create(rerandomize="true", done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         # If the user has unlimited attempts and we are not randomizing,
         # then do NOT show a save button
         # because they can keep using "Check"
         module = CapaFactory.create(max_attempts=None, rerandomize=RANDOMIZATION.NEVER, done=False)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         module = CapaFactory.create(max_attempts=None, rerandomize="false", done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         module = CapaFactory.create(max_attempts=None, rerandomize=RANDOMIZATION.PER_STUDENT, done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         # pre-studio default, DO show the save button
         module = CapaFactory.create(rerandomize=RANDOMIZATION.ALWAYS, done=False)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
         # If we're not randomizing and we have limited attempts,  then we can save
         module = CapaFactory.create(rerandomize=RANDOMIZATION.NEVER, max_attempts=2, done=True)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
         module = CapaFactory.create(rerandomize="false", max_attempts=2, done=True)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
         module = CapaFactory.create(rerandomize=RANDOMIZATION.PER_STUDENT, max_attempts=2, done=True)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
         # If survey question for capa (max_attempts = 0),
         # DO show the save button
         module = CapaFactory.create(max_attempts=0, done=False)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
     def test_should_show_save_button_force_save_button(self):
         # If we're after the deadline, do NOT show the save button
@@ -1468,7 +1468,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create(due=self.yesterday_str,
                                     force_save_button="true",
                                     done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         # If the user is out of attempts, do NOT show the save button
         attempts = random.randint(1, 10)
@@ -1476,7 +1476,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                     max_attempts=attempts,
                                     force_save_button="true",
                                     done=True)
-        self.assertFalse(module.should_show_save_button())
+        assert not module.should_show_save_button()
 
         # Otherwise, if we force the save button,
         # then show it even if we would ordinarily
@@ -1484,17 +1484,17 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create(force_save_button="true",
                                     rerandomize=RANDOMIZATION.ALWAYS,
                                     done=True)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
         module = CapaFactory.create(force_save_button="true",
                                     rerandomize="true",
                                     done=True)
-        self.assertTrue(module.should_show_save_button())
+        assert module.should_show_save_button()
 
     def test_no_max_attempts(self):
         module = CapaFactory.create(max_attempts='')
         html = module.get_problem_html()
-        self.assertIsNotNone(html)
+        assert html is not None
         # assert that we got here without exploding
 
     def test_get_problem_html(self):
@@ -1524,24 +1524,24 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             html_encapsulated = module.get_problem_html(encapsulate=True)
 
         # Expect that we get the rendered template back
-        self.assertEqual(html, "<div>Test Template HTML</div>")
+        assert html == '<div>Test Template HTML</div>'
 
         # Check the rendering context
         render_args, _ = module.system.render_template.call_args
-        self.assertEqual(len(render_args), 2)
+        assert len(render_args) == 2
 
         template_name = render_args[0]
-        self.assertEqual(template_name, "problem.html")
+        assert template_name == 'problem.html'
 
         context = render_args[1]
-        self.assertEqual(context['problem']['html'], "<div>Test Problem HTML</div>")
-        self.assertEqual(bool(context['should_enable_submit_button']), enable_submit_button)
-        self.assertEqual(bool(context['reset_button']), show_reset_button)
-        self.assertEqual(bool(context['save_button']), show_save_button)
-        self.assertFalse(context['demand_hint_possible'])
+        assert context['problem']['html'] == '<div>Test Problem HTML</div>'
+        assert bool(context['should_enable_submit_button']) == enable_submit_button
+        assert bool(context['reset_button']) == show_reset_button
+        assert bool(context['save_button']) == show_save_button
+        assert not context['demand_hint_possible']
 
         # Assert that the encapsulated html contains the original html
-        self.assertIn(html, html_encapsulated)
+        assert html in html_encapsulated
 
     demand_xml = """
         <problem>
@@ -1565,21 +1565,21 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create(xml=self.demand_xml)
         module.get_problem_html()  # ignoring html result
         context = module.system.render_template.call_args[0][1]
-        self.assertTrue(context['demand_hint_possible'])
-        self.assertTrue(context['should_enable_next_hint'])
+        assert context['demand_hint_possible']
+        assert context['should_enable_next_hint']
 
         # Check the AJAX call that gets the hint by index
         result = module.get_demand_hint(0)
-        self.assertEqual(result['hint_index'], 0)
-        self.assertTrue(result['should_enable_next_hint'])
+        assert result['hint_index'] == 0
+        assert result['should_enable_next_hint']
 
         result = module.get_demand_hint(1)
-        self.assertEqual(result['hint_index'], 1)
-        self.assertFalse(result['should_enable_next_hint'])
+        assert result['hint_index'] == 1
+        assert not result['should_enable_next_hint']
 
         result = module.get_demand_hint(2)  # here the server wraps around to index 0
-        self.assertEqual(result['hint_index'], 0)
-        self.assertTrue(result['should_enable_next_hint'])
+        assert result['hint_index'] == 0
+        assert result['should_enable_next_hint']
 
     def test_single_demand_hint(self):
         """
@@ -1602,13 +1602,13 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create(xml=test_xml)
         module.get_problem_html()  # ignoring html result
         context = module.system.render_template.call_args[0][1]
-        self.assertTrue(context['demand_hint_possible'])
-        self.assertTrue(context['should_enable_next_hint'])
+        assert context['demand_hint_possible']
+        assert context['should_enable_next_hint']
 
         # Check the AJAX call that gets the hint by index
         result = module.get_demand_hint(0)
-        self.assertEqual(result['hint_index'], 0)
-        self.assertFalse(result['should_enable_next_hint'])
+        assert result['hint_index'] == 0
+        assert not result['should_enable_next_hint']
 
     def test_image_hint(self):
         """
@@ -1633,13 +1633,13 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create(xml=test_xml)
         module.get_problem_html()  # ignoring html result
         context = module.system.render_template.call_args[0][1]
-        self.assertTrue(context['demand_hint_possible'])
-        self.assertTrue(context['should_enable_next_hint'])
+        assert context['demand_hint_possible']
+        assert context['should_enable_next_hint']
 
         # Check the AJAX call that gets the hint by index
         result = module.get_demand_hint(0)
-        self.assertEqual(result['hint_index'], 0)
-        self.assertFalse(result['should_enable_next_hint'])
+        assert result['hint_index'] == 0
+        assert not result['should_enable_next_hint']
 
     def test_demand_hint_logging(self):
         def mock_location_text(self):  # lint-amnesty, pylint: disable=unused-argument
@@ -1671,12 +1671,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
 
         # check to make sure that the input_state and the keys have the same values
         module1.set_state_from_lcp()
-        self.assertEqual(list(module1.lcp.inputs.keys()), list(module1.input_state.keys()))
+        assert list(module1.lcp.inputs.keys()) == list(module1.input_state.keys())
 
         module2.set_state_from_lcp()
 
         intersection = set(module2.input_state.keys()).intersection(set(module1.input_state.keys()))
-        self.assertEqual(len(intersection), 0)
+        assert len(intersection) == 0
 
     def test_get_problem_html_error(self):
         """
@@ -1702,15 +1702,15 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Try to render the module with DEBUG turned off
         html = module.get_problem_html()
 
-        self.assertIsNotNone(html)
+        assert html is not None
 
         # Check the rendering context
         render_args, _ = module.system.render_template.call_args
         context = render_args[1]
-        self.assertIn("error", context['problem']['html'])
+        assert 'error' in context['problem']['html']
 
         # Expect that the module has created a new dummy problem with the error
-        self.assertNotEqual(original_problem, module.lcp)
+        assert original_problem != module.lcp
 
     def test_get_problem_html_error_w_debug(self):
         """
@@ -1732,12 +1732,12 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Try to render the module with DEBUG turned on
         html = module.get_problem_html()
 
-        self.assertIsNotNone(html)
+        assert html is not None
 
         # Check the rendering context
         render_args, _ = module.system.render_template.call_args
         context = render_args[1]
-        self.assertIn(error_msg, context['problem']['html'])
+        assert error_msg in context['problem']['html']
 
     @ddt.data(
         'false',
@@ -1756,26 +1756,25 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Get the seed
         # By this point, the module should have persisted the seed
         seed = module.seed
-        self.assertIsNotNone(seed)
+        assert seed is not None
 
         # If we're not rerandomizing, the seed is always set
         # to the same value (1)
         if rerandomize == RANDOMIZATION.NEVER:
-            self.assertEqual(seed, 1,
-                             msg="Seed should always be 1 when rerandomize='%s'" % rerandomize)
+            assert seed == 1, "Seed should always be 1 when rerandomize='%s'" % rerandomize
 
         # Check the problem
         get_request_dict = {CapaFactory.input_key(): '3.14'}
         module.submit_problem(get_request_dict)
 
         # Expect that the seed is the same
-        self.assertEqual(seed, module.seed)
+        assert seed == module.seed
 
         # Save the problem
         module.save_problem(get_request_dict)
 
         # Expect that the seed is the same
-        self.assertEqual(seed, module.seed)
+        assert seed == module.seed
 
     @ddt.data(
         'false',
@@ -1827,7 +1826,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Get the seed
         # By this point, the module should have persisted the seed
         seed = module.seed
-        self.assertIsNotNone(seed)
+        assert seed is not None
 
         # We do NOT want the seed to reset if rerandomize
         # is set to 'never' -- it should still be 1
@@ -1836,7 +1835,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         if rerandomize in [RANDOMIZATION.NEVER,
                            'false',
                            RANDOMIZATION.PER_STUDENT]:
-            self.assertEqual(seed, _reset_and_get_seed(module))
+            assert seed == _reset_and_get_seed(module)
 
         # Otherwise, we expect the seed to change
         # to another valid seed
@@ -1847,9 +1846,9 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             # to generate a different seed
             success = _retry_and_check(10, lambda: _reset_and_get_seed(module) != seed)
 
-            self.assertIsNotNone(module.seed)
+            assert module.seed is not None
             msg = 'Could not get a new seed from reset after 10 tries'
-            self.assertTrue(success, msg)
+            assert success, msg
 
     @ddt.data(
         'false',
@@ -1881,10 +1880,10 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         # Get the seed
         # By this point, the module should have persisted the seed
         seed = module.seed
-        self.assertIsNotNone(seed)
+        assert seed is not None
 
         # the seed should never change because the student hasn't finished the problem
-        self.assertEqual(seed, _reset_and_get_seed(module))
+        assert seed == _reset_and_get_seed(module)
 
     @ddt.data(
         RANDOMIZATION.ALWAYS,
@@ -1911,7 +1910,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         for error_type in error_types:
             mock_progress.side_effect = error_type
             module = CapaFactory.create()
-            self.assertIsNone(module.get_progress())
+            assert module.get_progress() is None
             mock_log.exception.assert_called_once_with('Got bad progress')
             mock_log.reset_mock()
 
@@ -1924,8 +1923,8 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module = CapaFactory.create()
         module.weight = 0
         progress = module.get_progress()
-        self.assertIsNone(progress)
-        self.assertFalse(mock_progress.called)
+        assert progress is None
+        assert not mock_progress.called
 
     @patch('xmodule.capa_base.Progress')
     def test_get_progress_calculate_progress_fraction(self, mock_progress):
@@ -1960,8 +1959,8 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
                                     due=self.tomorrow_str)
         module.weight = 1
         score, total = module.get_display_progress()
-        self.assertEqual(score, expected_score)
-        self.assertEqual(total, 1)
+        assert score == expected_score
+        assert total == 1
 
     def test_get_html(self):
         """
@@ -1977,7 +1976,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         Check that get_problem() returns the expected dictionary.
         """
         module = CapaFactory.create()
-        self.assertEqual(module.get_problem("data"), {'html': module.get_problem_html(encapsulate=False)})
+        assert module.get_problem('data') == {'html': module.get_problem_html(encapsulate=False)}
 
     # Standard question with shuffle="true" used by a few tests
     common_shuffle_xml = textwrap.dedent("""
@@ -2004,11 +2003,11 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.submit_problem(get_request_dict)
             mock_call = mock_track_function.mock_calls[1]
             event_info = mock_call[1][2]
-            self.assertEqual(event_info['answers'][CapaFactory.answer_key()], 'choice_3')
+            assert event_info['answers'][CapaFactory.answer_key()] == 'choice_3'
             # 'permutation' key added to record how problem was shown
-            self.assertEqual(event_info['permutation'][CapaFactory.answer_key()],
-                             ('shuffle', ['choice_3', 'choice_1', 'choice_2', 'choice_0']))
-            self.assertEqual(event_info['success'], 'correct')
+            assert event_info['permutation'][CapaFactory.answer_key()] ==\
+                   ('shuffle', ['choice_3', 'choice_1', 'choice_2', 'choice_0'])
+            assert event_info['success'] == 'correct'
 
     @unittest.skip("masking temporarily disabled")
     def test_save_unmask(self):
@@ -2019,8 +2018,8 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.save_problem(get_request_dict)
             mock_call = mock_track_function.mock_calls[0]
             event_info = mock_call[1][1]
-            self.assertEqual(event_info['answers'][CapaFactory.answer_key()], 'choice_2')
-            self.assertIsNotNone(event_info['permutation'][CapaFactory.answer_key()])
+            assert event_info['answers'][CapaFactory.answer_key()] == 'choice_2'
+            assert event_info['permutation'][CapaFactory.answer_key()] is not None
 
     @unittest.skip("masking temporarily disabled")
     def test_reset_unmask(self):
@@ -2033,9 +2032,9 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.reset_problem(None)
             mock_call = mock_track_function.mock_calls[0]
             event_info = mock_call[1][1]
-            self.assertEqual(mock_call[1][0], 'reset_problem')
-            self.assertEqual(event_info['old_state']['student_answers'][CapaFactory.answer_key()], 'choice_2')
-            self.assertIsNotNone(event_info['permutation'][CapaFactory.answer_key()])
+            assert mock_call[1][0] == 'reset_problem'
+            assert event_info['old_state']['student_answers'][CapaFactory.answer_key()] == 'choice_2'
+            assert event_info['permutation'][CapaFactory.answer_key()] is not None
 
     @unittest.skip("masking temporarily disabled")
     def test_rescore_unmask(self):
@@ -2048,9 +2047,9 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.rescore_problem(only_if_higher=False)  # lint-amnesty, pylint: disable=no-member
             mock_call = mock_track_function.mock_calls[0]
             event_info = mock_call[1][1]
-            self.assertEqual(mock_call[1][0], 'problem_rescore')
-            self.assertEqual(event_info['state']['student_answers'][CapaFactory.answer_key()], 'choice_2')
-            self.assertIsNotNone(event_info['permutation'][CapaFactory.answer_key()])
+            assert mock_call[1][0] == 'problem_rescore'
+            assert event_info['state']['student_answers'][CapaFactory.answer_key()] == 'choice_2'
+            assert event_info['permutation'][CapaFactory.answer_key()] is not None
 
     def test_check_unmask_answerpool(self):
         """Check answer-pool question track_function uses unmasked names"""
@@ -2072,11 +2071,11 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
             module.submit_problem(get_request_dict)
             mock_call = mock_track_function.mock_calls[1]
             event_info = mock_call[1][2]
-            self.assertEqual(event_info['answers'][CapaFactory.answer_key()], 'choice_2')
+            assert event_info['answers'][CapaFactory.answer_key()] == 'choice_2'
             # 'permutation' key added to record how problem was shown
-            self.assertEqual(event_info['permutation'][CapaFactory.answer_key()],
-                             ('answerpool', ['choice_1', 'choice_3', 'choice_2', 'choice_0']))
-            self.assertEqual(event_info['success'], 'incorrect')
+            assert event_info['permutation'][CapaFactory.answer_key()] ==\
+                   ('answerpool', ['choice_1', 'choice_3', 'choice_2', 'choice_0'])
+            assert event_info['success'] == 'incorrect'
 
     @ddt.unpack
     @ddt.data(
@@ -2090,7 +2089,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         Verify that display_name_with_default works as expected.
         """
         module = CapaFactory.create(display_name=display_name)
-        self.assertEqual(module.display_name_with_default, expected_display_name)
+        assert module.display_name_with_default == expected_display_name
 
     @ddt.data(
         '',
@@ -2104,7 +2103,7 @@ class ProblemBlockTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
         module.get_problem_html()
         render_args, _ = module.system.render_template.call_args
         context = render_args[1]
-        self.assertEqual(context['problem']['name'], module.location.block_type)
+        assert context['problem']['name'] == module.location.block_type
 
 
 @ddt.ddt
@@ -2476,15 +2475,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
         xml = "<problem><{response_tag}></{response_tag}></problem>".format(response_tag=response_tag)
         name = "Some Capa Problem"
         descriptor = self._create_descriptor(xml, name=name)
-        self.assertEqual(descriptor.problem_types, {response_tag})
-        self.assertEqual(descriptor.index_dictionary(), {
-            'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-            'problem_types': [response_tag],
-            'content': {
-                'display_name': name,
-                'capa_content': ''
-            }
-        })
+        assert descriptor.problem_types == {response_tag}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': [response_tag],
+                'content': {'display_name': name, 'capa_content': ''}}
 
     def test_response_types_ignores_non_response_tags(self):
         xml = textwrap.dedent("""
@@ -2503,15 +2498,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
         """)
         name = "Test Capa Problem"
         descriptor = self._create_descriptor(xml, name=name)
-        self.assertEqual(descriptor.problem_types, {"multiplechoiceresponse"})
-        self.assertEqual(descriptor.index_dictionary(), {
-            'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-            'problem_types': ["multiplechoiceresponse"],
-            'content': {
-                'display_name': name,
-                'capa_content': ' Label Some comment Apple Banana Chocolate Donut '
-            }
-        })
+        assert descriptor.problem_types == {'multiplechoiceresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['multiplechoiceresponse'],
+                'content': {'display_name': name, 'capa_content': ' Label Some comment Apple Banana Chocolate Donut '}}
 
     def test_response_types_multiple_tags(self):
         xml = textwrap.dedent("""
@@ -2535,7 +2526,7 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
         """)
         name = "Other Test Capa Problem"
         descriptor = self._create_descriptor(xml, name=name)
-        self.assertEqual(descriptor.problem_types, {"multiplechoiceresponse", "optionresponse"})
+        assert descriptor.problem_types == {'multiplechoiceresponse', 'optionresponse'}
 
         # We are converting problem_types to a set to compare it later without taking into account the order
         # the reasoning behind is that the problem_types (property) is represented by dict and when it is converted
@@ -2580,16 +2571,10 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
         """)
         name = "Blank Common Capa Problem"
         descriptor = self._create_descriptor(xml, name=name)
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
                 'problem_types': [],
-                'content': {
-                    'display_name': name,
-                    'capa_content': ' '
-                }
-            }
-        )
+                'content': {'display_name': name, 'capa_content': ' '}}
 
     def test_indexing_checkboxes(self):
         name = "Checkboxes"
@@ -2606,18 +2591,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             Hungarian
             Note: Make sure you select all of the correct options—there may be more than one!
         """)
-        self.assertEqual(descriptor.problem_types, {"choiceresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(),
-            {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["choiceresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'choiceresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['choiceresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_dropdown(self):
         name = "Dropdown"
@@ -2628,17 +2606,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             You can use the following example problem as a model.
             Which of the following countries celebrates its independence on August 15? 'India','Spain','China','Bermuda'
         """)
-        self.assertEqual(descriptor.problem_types, {"optionresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["optionresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'optionresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['optionresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_multiple_choice(self):
         name = "Multiple Choice"
@@ -2653,17 +2625,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             Indonesia
             Russia
         """)
-        self.assertEqual(descriptor.problem_types, {"multiplechoiceresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["multiplechoiceresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'multiplechoiceresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['multiplechoiceresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_numerical_input(self):
         name = "Numerical Input"
@@ -2681,17 +2647,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             How many miles away from Earth is the sun? Use scientific notation to answer.
             The square of what number is -100?
         """)
-        self.assertEqual(descriptor.problem_types, {"numericalresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["numericalresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'numericalresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['numericalresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_text_input(self):
         name = "Text Input"
@@ -2706,17 +2666,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             You can use the following example problem as a model.
             What was the first post-secondary school in China to allow both male and female students?
         """)
-        self.assertEqual(descriptor.problem_types, {"stringresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["stringresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'stringresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['stringresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_non_latin_problem(self):
         sample_text_input_problem_xml = textwrap.dedent("""
@@ -2730,9 +2684,7 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
         capa_content = " FX1_VAL='Καλημέρα' Δοκιμή με μεταβλητές με Ελληνικούς χαρακτήρες μέσα σε python: $FX1_VAL "
 
         descriptor_dict = descriptor.index_dictionary()
-        self.assertEqual(
-            descriptor_dict['content']['capa_content'], smart_text(capa_content)
-        )
+        assert descriptor_dict['content']['capa_content'] == smart_text(capa_content)
 
     def test_indexing_checkboxes_with_hints_and_feedback(self):
         name = "Checkboxes with Hints and Feedback"
@@ -2752,17 +2704,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             potato
             tomato
         """)
-        self.assertEqual(descriptor.problem_types, {"choiceresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["choiceresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'choiceresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['choiceresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_dropdown_with_hints_and_feedback(self):
         name = "Dropdown with Hints and Feedback"
@@ -2778,17 +2724,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             potato
             tomato
         """)
-        self.assertEqual(descriptor.problem_types, {"optionresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["optionresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'optionresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['optionresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_multiple_choice_with_hints_and_feedback(self):
         name = "Multiple Choice with Hints and Feedback"
@@ -2804,17 +2744,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             potato
             tomato
         """)
-        self.assertEqual(descriptor.problem_types, {"multiplechoiceresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["multiplechoiceresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'multiplechoiceresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['multiplechoiceresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_numerical_input_with_hints_and_feedback(self):
         name = "Numerical Input with Hints and Feedback"
@@ -2828,17 +2762,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             Use the following example problem as a model.
             What is the arithmetic mean for the following set of numbers? (1, 5, 6, 3, 5)
         """)
-        self.assertEqual(descriptor.problem_types, {"numericalresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["numericalresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'numericalresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['numericalresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_text_input_with_hints_and_feedback(self):
         name = "Text Input with Hints and Feedback"
@@ -2852,17 +2780,11 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             Use the following example problem as a model.
             Which U.S. state has the largest land area?
         """)
-        self.assertEqual(descriptor.problem_types, {"stringresponse"})
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
-                'problem_types': ["stringresponse"],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+        assert descriptor.problem_types == {'stringresponse'}
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+                'problem_types': ['stringresponse'],
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_indexing_problem_with_html_tags(self):
         sample_problem_xml = textwrap.dedent("""
@@ -2885,16 +2807,10 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             This has HTML comment in it.
             HTML end.
         """)
-        self.assertEqual(
-            descriptor.index_dictionary(), {
-                'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
+        assert descriptor.index_dictionary() ==\
+               {'content_type': ProblemBlock.INDEX_CONTENT_TYPE,
                 'problem_types': [],
-                'content': {
-                    'display_name': name,
-                    'capa_content': capa_content.replace("\n", " ")
-                }
-            }
-        )
+                'content': {'display_name': name, 'capa_content': capa_content.replace('\n', ' ')}}
 
     def test_invalid_xml_handling(self):
         """
@@ -2905,7 +2821,7 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             <problem>
             </proble-oh no my finger broke and I can't close the problem tag properly...
         """)
-        with self.assertRaises(etree.XMLSyntaxError):
+        with pytest.raises(etree.XMLSyntaxError):
             self._create_descriptor(sample_invalid_xml, name="Invalid XML")
 
     def test_invalid_dropdown_xml(self):
@@ -2915,7 +2831,8 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
         problem_xml = textwrap.dedent("""
         <problem>
             <optionresponse>
-              <p>You can use this template as a guide to the simple editor markdown and OLX markup to use for dropdown problems. Edit this component to replace this template with your own assessment.</p>
+              <p>You can use this template as a guide to the simple editor markdown and OLX markup to use for dropdown
+               problems. Edit this component to replace this template with your own assessment.</p>
             <label>Add the question text, or prompt, here. This text is required.</label>
             <description>You can add an optional tip or note related to the prompt like this. </description>
             <optioninput>
@@ -2926,7 +2843,7 @@ class ProblemBlockXMLTest(unittest.TestCase):  # lint-amnesty, pylint: disable=m
             </optionresponse>
         </problem>
         """)
-        with self.assertRaises(Exception):
+        with pytest.raises(Exception):
             CapaFactory.create(xml=problem_xml)
 
 
@@ -2939,7 +2856,8 @@ class ComplexEncoderTest(unittest.TestCase):  # lint-amnesty, pylint: disable=mi
         complex_num = 1 - 1j
         expected_str = '1-1*j'
         json_str = json.dumps(complex_num, cls=ComplexEncoder)
-        self.assertEqual(expected_str, json_str[1:-1])  # ignore quotes
+        assert expected_str == json_str[1:(- 1)]
+        # ignore quotes
 
 
 class ProblemCheckTrackingTest(unittest.TestCase):
@@ -2993,35 +2911,27 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         }
         event = self.get_event_for_answers(module, answer_input_dict)
 
-        self.assertEqual(event['submission'], {
-            factory.answer_key(2): {
-                'question': 'What color is the open ocean on a sunny day?',
-                'answer': 'blue',
-                'response_type': 'optionresponse',
-                'input_type': 'optioninput',
-                'correct': True,
-                'group_label': '',
-                'variant': '',
-            },
-            factory.answer_key(3): {
-                'question': 'Which piece of furniture is built for sitting?',
-                'answer': u'<text>a table</text>',
-                'response_type': 'multiplechoiceresponse',
-                'input_type': 'choicegroup',
-                'correct': False,
-                'group_label': '',
-                'variant': '',
-            },
-            factory.answer_key(4): {
-                'question': 'Which of the following are musical instruments?',
-                'answer': [u'a piano', u'a tree'],
-                'response_type': 'choiceresponse',
-                'input_type': 'checkboxgroup',
-                'correct': False,
-                'group_label': '',
-                'variant': '',
-            },
-        })
+        assert event['submission'] ==\
+               {factory.answer_key(2): {'question': 'What color is the open ocean on a sunny day?',
+                                        'answer': 'blue', 'response_type': 'optionresponse',
+                                        'input_type': 'optioninput',
+                                        'correct': True,
+                                        'group_label': '',
+                                        'variant': ''},
+                factory.answer_key(3): {'question': 'Which piece of furniture is built for sitting?',
+                                        'answer': u'<text>a table</text>',
+                                        'response_type': 'multiplechoiceresponse',
+                                        'input_type': 'choicegroup',
+                                        'correct': False,
+                                        'group_label': '',
+                                        'variant': ''},
+                factory.answer_key(4): {'question': 'Which of the following are musical instruments?',
+                                        'answer': [u'a piano', u'a tree'],
+                                        'response_type': 'choiceresponse',
+                                        'input_type': 'checkboxgroup',
+                                        'correct': False,
+                                        'group_label': '',
+                                        'variant': ''}}
 
     def capa_factory_for_problem_xml(self, xml):  # lint-amnesty, pylint: disable=missing-function-docstring
         class CustomCapaFactory(CapaFactory):
@@ -3036,7 +2946,7 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         with patch.object(module.runtime, 'publish') as mock_track_function:
             module.submit_problem(answer_input_dict)
 
-            self.assertGreaterEqual(len(mock_track_function.mock_calls), 2)
+            assert len(mock_track_function.mock_calls) >= 2
             # There are potentially 2 track logs: answers and hint. [-1]=answers.
             mock_call = mock_track_function.mock_calls[-1]
             event = mock_call[1][2]
@@ -3052,17 +2962,13 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         }
 
         event = self.get_event_for_answers(module, answer_input_dict)
-        self.assertEqual(event['submission'], {
-            factory.answer_key(2): {
-                'question': '',
-                'answer': '3.14',
-                'response_type': 'numericalresponse',
-                'input_type': 'textline',
-                'correct': True,
-                'group_label': '',
-                'variant': '',
-            }
-        })
+        assert event['submission'] ==\
+               {factory.answer_key(2): {'question': '', 'answer': '3.14',
+                                        'response_type': 'numericalresponse',
+                                        'input_type': 'textline',
+                                        'correct': True,
+                                        'group_label': '',
+                                        'variant': ''}}
 
     def test_multiple_inputs(self):
         group_label = 'Choose the correct color'
@@ -3084,26 +2990,19 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         }
 
         event = self.get_event_for_answers(module, answer_input_dict)
-        self.assertEqual(event['submission'], {
-            factory.answer_key(2, 1): {
-                'group_label': group_label,
-                'question': input1_label,
-                'answer': 'blue',
-                'response_type': 'optionresponse',
-                'input_type': 'optioninput',
-                'correct': True,
-                'variant': '',
-            },
-            factory.answer_key(2, 2): {
-                'group_label': group_label,
-                'question': input2_label,
-                'answer': 'yellow',
-                'response_type': 'optionresponse',
-                'input_type': 'optioninput',
-                'correct': False,
-                'variant': '',
-            },
-        })
+        assert event['submission'] ==\
+               {factory.answer_key(2, 1): {'group_label': group_label,
+                                           'question': input1_label,
+                                           'answer': 'blue',
+                                           'response_type': 'optionresponse',
+                                           'input_type': 'optioninput',
+                                           'correct': True, 'variant': ''},
+                factory.answer_key(2, 2): {'group_label': group_label,
+                                           'question': input2_label,
+                                           'answer': 'yellow',
+                                           'response_type': 'optionresponse',
+                                           'input_type': 'optioninput',
+                                           'correct': False, 'variant': ''}}
 
     def test_optioninput_extended_xml(self):
         """Test the new XML form of writing with <option> tag instead of options= attribute."""
@@ -3154,26 +3053,19 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         }
 
         event = self.get_event_for_answers(module, answer_input_dict)
-        self.assertEqual(event['submission'], {
-            factory.answer_key(2, 1): {
-                'group_label': group_label,
-                'question': input1_label,
-                'answer': 'apple',
-                'response_type': 'optionresponse',
-                'input_type': 'optioninput',
-                'correct': True,
-                'variant': '',
-            },
-            factory.answer_key(2, 2): {
-                'group_label': group_label,
-                'question': input2_label,
-                'answer': 'cucumber',
-                'response_type': 'optionresponse',
-                'input_type': 'optioninput',
-                'correct': False,
-                'variant': '',
-            },
-        })
+        assert event['submission'] ==\
+               {factory.answer_key(2, 1): {'group_label': group_label,
+                                           'question': input1_label,
+                                           'answer': 'apple',
+                                           'response_type': 'optionresponse',
+                                           'input_type': 'optioninput',
+                                           'correct': True, 'variant': ''},
+                factory.answer_key(2, 2): {'group_label': group_label,
+                                           'question': input2_label,
+                                           'answer': 'cucumber',
+                                           'response_type': 'optionresponse',
+                                           'input_type': 'optioninput',
+                                           'correct': False, 'variant': ''}}
 
     def test_rerandomized_inputs(self):
         factory = CapaFactory
@@ -3184,17 +3076,14 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         }
 
         event = self.get_event_for_answers(module, answer_input_dict)
-        self.assertEqual(event['submission'], {
-            factory.answer_key(2): {
-                'question': '',
-                'answer': '3.14',
-                'response_type': 'numericalresponse',
-                'input_type': 'textline',
-                'correct': True,
-                'group_label': '',
-                'variant': module.seed,
-            }
-        })
+        assert event['submission'] ==\
+               {factory.answer_key(2): {'question': '',
+                                        'answer': '3.14',
+                                        'response_type': 'numericalresponse',
+                                        'input_type': 'textline',
+                                        'correct': True,
+                                        'group_label': '',
+                                        'variant': module.seed}}
 
     def test_file_inputs(self):
         fnames = ["prog1.py", "prog2.py", "prog3.py"]
@@ -3217,26 +3106,21 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         }
 
         event = self.get_event_for_answers(module, answer_input_dict)
-        self.assertEqual(event['submission'], {
-            factory.answer_key(2): {
-                'question': '',
-                'answer': fpaths,
-                'response_type': 'coderesponse',
-                'input_type': 'filesubmission',
-                'correct': False,
-                'group_label': '',
-                'variant': '',
-            },
-            factory.answer_key(3): {
-                'answer': 'None',
-                'correct': True,
-                'group_label': '',
-                'question': '',
-                'response_type': 'customresponse',
-                'input_type': 'textline',
-                'variant': ''
-            }
-        })
+        assert event['submission'] ==\
+               {factory.answer_key(2): {'question': '',
+                                        'answer': fpaths,
+                                        'response_type': 'coderesponse',
+                                        'input_type': 'filesubmission',
+                                        'correct': False,
+                                        'group_label': '',
+                                        'variant': ''},
+                factory.answer_key(3): {'answer': 'None',
+                                        'correct': True,
+                                        'group_label': '',
+                                        'question': '',
+                                        'response_type': 'customresponse',
+                                        'input_type': 'textline',
+                                        'variant': ''}}
 
     def test_get_answer_with_jump_to_id_urls(self):
         """
@@ -3262,7 +3146,7 @@ class ProblemCheckTrackingTest(unittest.TestCase):
         problem = CapaFactory.create(showanswer='always', xml=problem_xml)
         problem.runtime.replace_jump_to_id_urls = Mock()
         problem.get_answer(data)
-        self.assertTrue(problem.runtime.replace_jump_to_id_urls.called)
+        assert problem.runtime.replace_jump_to_id_urls.called
 
 
 class ProblemBlockReportGenerationTest(unittest.TestCase):
@@ -3314,13 +3198,13 @@ class ProblemBlockReportGenerationTest(unittest.TestCase):
     def test_generate_report_data_not_implemented(self):
         scope_ids = Mock(block_type='noproblem')
         descriptor = ProblemBlock(get_test_system(), scope_ids=scope_ids)
-        with self.assertRaises(NotImplementedError):
+        with pytest.raises(NotImplementedError):
             next(descriptor.generate_report_data(iter([])))
 
     def test_generate_report_data_limit_responses(self):
         descriptor = self._get_descriptor()
         report_data = list(descriptor.generate_report_data(self._mock_user_state_generator(), 2))
-        self.assertEqual(2, len(report_data))
+        assert 2 == len(report_data)
 
     def test_generate_report_data_dont_limit_responses(self):
         descriptor = self._get_descriptor()
@@ -3332,10 +3216,10 @@ class ProblemBlockReportGenerationTest(unittest.TestCase):
                 response_count=response_count,
             )
         ))
-        self.assertEqual(user_count * response_count, len(report_data))
+        assert (user_count * response_count) == len(report_data)
 
     def test_generate_report_data_skip_dynamath(self):
         descriptor = self._get_descriptor()
         iterator = iter([self._user_state(suffix='_dynamath')])
         report_data = list(descriptor.generate_report_data(iterator))
-        self.assertEqual(0, len(report_data))
+        assert 0 == len(report_data)
diff --git a/common/lib/xmodule/xmodule/tests/test_conditional.py b/common/lib/xmodule/xmodule/tests/test_conditional.py
index 7a4e2d2569125bb86be65898b4fffb063ac4859f..83ed4cde39cd7807dc5ad1c834ac230c058ea3ae 100644
--- a/common/lib/xmodule/xmodule/tests/test_conditional.py
+++ b/common/lib/xmodule/xmodule/tests/test_conditional.py
@@ -159,7 +159,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
             for icon_class in ['other', 'problem', 'video']:
                 modules['source_module'].is_attempted = attempted
                 modules['child_module'].get_icon_class = lambda: icon_class  # lint-amnesty, pylint: disable=cell-var-from-loop
-                self.assertEqual(modules['cond_module'].get_icon_class(), icon_class)
+                assert modules['cond_module'].get_icon_class() == icon_class
 
     def test_get_html(self):
         modules = ConditionalFactory.create(self.test_system)
@@ -171,7 +171,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
             'element_id': u'i4x-edX-conditional_test-conditional-SampleConditional',
             'depends': u'i4x-edX-conditional_test-problem-SampleProblem',
         })
-        self.assertEqual(expected, html)
+        assert expected == html
 
     def test_handle_ajax(self):
         modules = ConditionalFactory.create(self.test_system)
@@ -180,7 +180,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
         ajax = json.loads(modules['cond_module'].handle_ajax('', ''))
         print("ajax: ", ajax)
         fragments = ajax['fragments']
-        self.assertFalse(any(['This is a secret' in item['content'] for item in fragments]))
+        assert not any([('This is a secret' in item['content']) for item in fragments])
 
         # now change state of the capa problem to make it completed
         modules['source_module'].is_attempted = "true"
@@ -188,7 +188,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
         modules['cond_module'].save()
         print("post-attempt ajax: ", ajax)
         fragments = ajax['fragments']
-        self.assertTrue(any(['This is a secret' in item['content'] for item in fragments]))
+        assert any([('This is a secret' in item['content']) for item in fragments])
 
     def test_error_as_source(self):
         '''
@@ -199,7 +199,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
         modules['cond_module'].save()
         ajax = json.loads(modules['cond_module'].handle_ajax('', ''))
         fragments = ajax['fragments']
-        self.assertFalse(any(['This is a secret' in item['content'] for item in fragments]))
+        assert not any([('This is a secret' in item['content']) for item in fragments])
 
     @patch('xmodule.conditional_module.log')
     def test_conditional_with_staff_only_source_module(self, mock_log):
@@ -211,8 +211,8 @@ class ConditionalBlockBasicTest(unittest.TestCase):
         cond_module.save()
         cond_module.is_attempted = "false"
         cond_module.handle_ajax('', '')
-        self.assertFalse(mock_log.warn.called)
-        self.assertIn(None, cond_module.get_required_blocks)
+        assert not mock_log.warn.called
+        assert None in cond_module.get_required_blocks
 
 
 class ConditionalBlockXmlTest(unittest.TestCase):
@@ -236,7 +236,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
         modulestore = XMLModuleStore(DATA_DIR, source_dirs=[name])
         courses = modulestore.get_courses()
         self.modulestore = modulestore  # lint-amnesty, pylint: disable=attribute-defined-outside-init
-        self.assertEqual(len(courses), 1)
+        assert len(courses) == 1
         return courses[0]
 
     @patch('xmodule.x_module.descriptor_global_local_resource_url')
@@ -285,7 +285,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
                 'depends': u'i4x-HarvardX-ER22x-problem-choiceprob'
             }
         )
-        self.assertEqual(html, html_expect)
+        assert html == html_expect
 
         gdi = module.get_display_items()
         print("gdi=", gdi)
@@ -294,7 +294,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
         module.save()
         print("ajax: ", ajax)
         fragments = ajax['fragments']
-        self.assertFalse(any(['This is a secret' in item['content'] for item in fragments]))
+        assert not any([('This is a secret' in item['content']) for item in fragments])
 
         # Now change state of the capa problem to make it completed
         inner_module = inner_get_module(location.replace(category="problem", name='choiceprob'))
@@ -306,7 +306,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
         module.save()
         print("post-attempt ajax: ", ajax)
         fragments = ajax['fragments']
-        self.assertTrue(any(['This is a secret' in item['content'] for item in fragments]))
+        assert any([('This is a secret' in item['content']) for item in fragments])
 
     maxDiff = None
 
@@ -331,12 +331,8 @@ class ConditionalBlockXmlTest(unittest.TestCase):
         )
 
         new_run = conditional.location.course_key.run  # lint-amnesty, pylint: disable=unused-variable
-        self.assertEqual(
-            conditional.sources_list[0],
-            BlockUsageLocator.from_string(
-                conditional.xml_attributes['sources']
-            ).replace(run=dummy_location.course_key.run)
-        )
+        assert conditional.sources_list[0] == BlockUsageLocator.from_string(conditional.xml_attributes['sources'])\
+            .replace(run=dummy_location.course_key.run)
 
     def test_conditional_module_parse_sources(self):
         dummy_system = Mock()
@@ -353,10 +349,8 @@ class ConditionalBlockXmlTest(unittest.TestCase):
             dummy_field_data,
             dummy_scope_ids,
         )
-        self.assertEqual(
-            conditional.parse_sources(conditional.xml_attributes),
-            ['i4x://HarvardX/ER22x/poll_question/T15_poll', 'i4x://HarvardX/ER22x/poll_question/T16_poll']
-        )
+        assert conditional.parse_sources(conditional.xml_attributes) == ['i4x://HarvardX/ER22x/poll_question/T15_poll',
+                                                                         'i4x://HarvardX/ER22x/poll_question/T16_poll']
 
     def test_conditional_module_parse_attr_values(self):
         root = '<conditional attempted="false"></conditional>'
@@ -369,7 +363,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
             'conditional_message': ''
         }
 
-        self.assertEqual(definition, expected_definition)
+        assert definition == expected_definition
 
     def test_presence_attributes_in_xml_attributes(self):
         modules = ConditionalFactory.create(self.test_system)
@@ -430,18 +424,18 @@ class ConditionalBlockStudioTest(XModuleXmlImportTest):
 
         context = create_studio_context(self.conditional, False)
         html = self.module_system.render(self.conditional, AUTHOR_VIEW, context).content
-        self.assertIn('This is a secret HTML', html)
+        assert 'This is a secret HTML' in html
 
         context = create_studio_context(self.sequence, True)
         html = self.module_system.render(self.conditional, AUTHOR_VIEW, context).content
-        self.assertNotIn('This is a secret HTML', html)
+        assert 'This is a secret HTML' not in html
 
     def test_non_editable_settings(self):
         """
         Test the settings that are marked as "non-editable".
         """
         non_editable_metadata_fields = self.conditional.non_editable_metadata_fields
-        self.assertIn(ConditionalBlock.due, non_editable_metadata_fields)
+        assert ConditionalBlock.due in non_editable_metadata_fields
 
     def test_validation_messages(self):
         """
@@ -449,10 +443,7 @@ class ConditionalBlockStudioTest(XModuleXmlImportTest):
         """
         self.conditional.sources_list = None
         validation = self.conditional.validate()
-        self.assertEqual(
-            validation.summary.text,
-            u"This component has no source components configured yet."
-        )
-        self.assertEqual(validation.summary.type, StudioValidationMessage.NOT_CONFIGURED)
-        self.assertEqual(validation.summary.action_class, 'edit-button')
-        self.assertEqual(validation.summary.action_label, u"Configure list of sources")
+        assert validation.summary.text == u'This component has no source components configured yet.'
+        assert validation.summary.type == StudioValidationMessage.NOT_CONFIGURED
+        assert validation.summary.action_class == 'edit-button'
+        assert validation.summary.action_label == u'Configure list of sources'
diff --git a/common/lib/xmodule/xmodule/tests/test_content.py b/common/lib/xmodule/xmodule/tests/test_content.py
index bbeff49346fd6ee7160e70da0b3c6d9f912a2b30..5963c2f47871c94979f0824eec24f01a575e1663 100644
--- a/common/lib/xmodule/xmodule/tests/test_content.py
+++ b/common/lib/xmodule/xmodule/tests/test_content.py
@@ -106,10 +106,10 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         # We had a bug where a thumbnail location of None was getting transformed into a Location tuple, with
         # all elements being None. It is important that the location be just None for rendering.
         content = StaticContent('loc', 'name', 'content_type', 'data', None, None, None)
-        self.assertIsNone(content.thumbnail_location)
+        assert content.thumbnail_location is None
 
         content = StaticContent('loc', 'name', 'content_type', 'data')
-        self.assertIsNone(content.thumbnail_location)
+        assert content.thumbnail_location is None
 
     @ddt.data(
         (u"monsters__.jpg", u"monsters__.jpg"),
@@ -123,11 +123,9 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         content = Content(AssetLocator(CourseLocator(u'mitX', u'800', u'ignore_run'), u'asset', original_filename),
                           None)
         (thumbnail_content, thumbnail_file_location) = content_store.generate_thumbnail(content)
-        self.assertIsNone(thumbnail_content)
-        self.assertEqual(
-            AssetLocator(CourseLocator(u'mitX', u'800', u'ignore_run'), u'thumbnail', thumbnail_filename),
-            thumbnail_file_location
-        )
+        assert thumbnail_content is None
+        assert AssetLocator(CourseLocator(u'mitX', u'800', u'ignore_run'), u'thumbnail', thumbnail_filename) ==\
+               thumbnail_file_location
 
     @patch('xmodule.contentstore.content.Image')
     def test_image_is_closed_when_generating_thumbnail(self, image_class_mock):
@@ -141,8 +139,8 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
                           "image/jpeg")
         content.data = b'mock data'
         content_store.generate_thumbnail(content)
-        self.assertTrue(image_class_mock.open.called, "Image.open not called")
-        self.assertTrue(mock_image.close.called, "mock_image.close not called")
+        assert image_class_mock.open.called, 'Image.open not called'
+        assert mock_image.close.called, 'mock_image.close not called'
 
     def test_store_svg_as_thumbnail(self):
         # We had a bug that caused generate_thumbnail to attempt to pass SVG to PIL to generate a thumbnail.
@@ -154,11 +152,9 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
                           'image/svg+xml')
         content.data = b'mock svg file'
         (thumbnail_content, thumbnail_file_location) = content_store.generate_thumbnail(content)
-        self.assertEqual(thumbnail_content.data.read(), b'mock svg file')
-        self.assertEqual(
-            AssetLocator(CourseLocator(u'mitX', u'800', u'ignore_run'), u'thumbnail', thumbnail_filename),
-            thumbnail_file_location
-        )
+        assert thumbnail_content.data.read() == b'mock svg file'
+        assert AssetLocator(CourseLocator(u'mitX', u'800', u'ignore_run'), u'thumbnail', thumbnail_filename) ==\
+               thumbnail_file_location
 
     def test_compute_location(self):
         # We had a bug that __ got converted into a single _. Make sure that substitution of INVALID_CHARS (like space)
@@ -166,19 +162,13 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         asset_location = StaticContent.compute_location(
             CourseKey.from_string('mitX/400/ignore'), 'subs__1eo_jXvZnE .srt.sjson'
         )
-        self.assertEqual(
-            AssetLocator(CourseLocator(u'mitX', u'400', u'ignore', deprecated=True),
-                         u'asset', u'subs__1eo_jXvZnE_.srt.sjson'),
-            asset_location
-        )
+        assert AssetLocator(CourseLocator(u'mitX', u'400', u'ignore', deprecated=True),
+                            u'asset', u'subs__1eo_jXvZnE_.srt.sjson') == asset_location
 
     def test_get_location_from_path(self):
         asset_location = StaticContent.get_location_from_path(u'/c4x/a/b/asset/images_course_image.jpg')
-        self.assertEqual(
-            AssetLocator(CourseLocator(u'a', u'b', None, deprecated=True),
-                         u'asset', u'images_course_image.jpg', deprecated=True),
-            asset_location
-        )
+        assert AssetLocator(CourseLocator(u'a', u'b', None, deprecated=True),
+                            u'asset', u'images_course_image.jpg', deprecated=True) == asset_location
 
     def test_static_content_stream_stream_data(self):
         """
@@ -193,7 +183,7 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         for chunck in stream:
             total_length += len(chunck)
 
-        self.assertEqual(total_length, static_content_stream.length)
+        assert total_length == static_content_stream.length
 
     def test_static_content_stream_stream_data_in_range(self):
         """
@@ -214,7 +204,7 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         for chunck in stream:
             total_length += len(chunck)
 
-        self.assertEqual(total_length, last_byte - first_byte + 1)
+        assert total_length == ((last_byte - first_byte) + 1)
 
     def test_static_content_write_js(self):
         """
@@ -223,5 +213,5 @@ class ContentTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-c
         output_root = path(u'common/static/xmodule/descriptors/js')
         file_owners = _write_js(output_root, _list_descriptors(), 'get_studio_view_js')
         js_file_paths = set(file_path for file_path in sum(list(file_owners.values()), []) if os.path.basename(file_path).startswith('000-'))  # lint-amnesty, pylint: disable=line-too-long
-        self.assertEqual(len(js_file_paths), 1)
-        self.assertIn("XModule.Descriptor = (function() {", open(js_file_paths.pop()).read())
+        assert len(js_file_paths) == 1
+        assert 'XModule.Descriptor = (function() {' in open(js_file_paths.pop()).read()
diff --git a/common/lib/xmodule/xmodule/tests/test_course_metadata_utils.py b/common/lib/xmodule/xmodule/tests/test_course_metadata_utils.py
index f5ca1f4c2345c2a42dbffceeda442dc949c13f96..f4f06c31fc8769e681a3a281742f96e0e2f7913c 100644
--- a/common/lib/xmodule/xmodule/tests/test_course_metadata_utils.py
+++ b/common/lib/xmodule/xmodule/tests/test_course_metadata_utils.py
@@ -8,7 +8,7 @@ from datetime import datetime, timedelta
 from unittest import TestCase
 
 from pytz import utc
-
+import pytest
 from xmodule.block_metadata_utils import (
     display_name_with_default,
     display_name_with_default_escaped,
@@ -179,10 +179,10 @@ class CourseMetadataUtilsTestCase(TestCase):
         for function_test in function_tests:
             for scenario in function_test.scenarios:
                 actual_return = function_test.function(*scenario.arguments)
-                self.assertEqual(actual_return, scenario.expected_return)
+                assert actual_return == scenario.expected_return
 
         # Even though we don't care about testing mock_strftime_localized,
         # we still need to test it with a bad format string in order to
         # satisfy the coverage checker.
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             mock_strftime_localized(test_datetime, 'BAD_FORMAT_SPECIFIER')
diff --git a/common/lib/xmodule/xmodule/tests/test_course_module.py b/common/lib/xmodule/xmodule/tests/test_course_module.py
index 82f196c285c66583ba89b0a5502ee6427b515cf1..8b1e72cae26939d99dd862b3e771c8d8732e50d3 100644
--- a/common/lib/xmodule/xmodule/tests/test_course_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_course_module.py
@@ -4,7 +4,7 @@
 import itertools
 import unittest
 from datetime import datetime, timedelta
-
+import pytest
 import ddt
 from dateutil import parser
 from django.conf import settings
@@ -32,10 +32,7 @@ _NEXT_WEEK = _TODAY + timedelta(days=7)
 class CourseFieldsTestCase(unittest.TestCase):
 
     def test_default_start_date(self):
-        self.assertEqual(
-            xmodule.course_module.CourseFields.start.default,
-            datetime(2030, 1, 1, tzinfo=utc)
-        )
+        assert xmodule.course_module.CourseFields.start.default == datetime(2030, 1, 1, tzinfo=utc)
 
 
 class DummySystem(ImportSystem):  # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
@@ -132,21 +129,21 @@ class HasEndedMayCertifyTestCase(unittest.TestCase):
 
     def test_has_ended(self):
         """Check that has_ended correctly tells us when a course is over."""
-        self.assertTrue(self.past_show_certs.has_ended())
-        self.assertTrue(self.past_show_certs_no_info.has_ended())
-        self.assertTrue(self.past_noshow_certs.has_ended())
-        self.assertFalse(self.future_show_certs.has_ended())
-        self.assertFalse(self.future_show_certs_no_info.has_ended())
-        self.assertFalse(self.future_noshow_certs.has_ended())
+        assert self.past_show_certs.has_ended()
+        assert self.past_show_certs_no_info.has_ended()
+        assert self.past_noshow_certs.has_ended()
+        assert not self.future_show_certs.has_ended()
+        assert not self.future_show_certs_no_info.has_ended()
+        assert not self.future_noshow_certs.has_ended()
 
     def test_may_certify(self):
         """Check that may_certify correctly tells us when a course may wrap."""
-        self.assertTrue(self.past_show_certs.may_certify())
-        self.assertTrue(self.past_noshow_certs.may_certify())
-        self.assertTrue(self.past_show_certs_no_info.may_certify())
-        self.assertTrue(self.future_show_certs.may_certify())
-        self.assertTrue(self.future_show_certs_no_info.may_certify())
-        self.assertFalse(self.future_noshow_certs.may_certify())
+        assert self.past_show_certs.may_certify()
+        assert self.past_noshow_certs.may_certify()
+        assert self.past_show_certs_no_info.may_certify()
+        assert self.future_show_certs.may_certify()
+        assert self.future_show_certs_no_info.may_certify()
+        assert not self.future_noshow_certs.may_certify()
 
 
 class CourseSummaryHasEnded(unittest.TestCase):
@@ -156,7 +153,7 @@ class CourseSummaryHasEnded(unittest.TestCase):
         test_course = get_dummy_course("2012-01-01T12:00")
         bad_end_date = parser.parse("2012-02-21 10:28:45")
         summary = xmodule.course_module.CourseSummary(test_course.id, end=bad_end_date)
-        self.assertTrue(summary.has_ended())
+        assert summary.has_ended()
 
 
 @ddt.ddt
@@ -229,17 +226,17 @@ class IsNewCourseTestCase(unittest.TestCase):
     def test_start_date_is_default(self):
         for s in self.start_advertised_settings:
             d = get_dummy_course(start=s[0], advertised_start=s[1])
-            self.assertEqual(d.start_date_is_still_default, s[3])
+            assert d.start_date_is_still_default == s[3]
 
     def test_display_organization(self):
         descriptor = get_dummy_course(start='2012-12-02T12:00', is_new=True)
-        self.assertNotEqual(descriptor.location.org, descriptor.display_org_with_default)
-        self.assertEqual(descriptor.display_org_with_default, "{0}_display".format(ORG))
+        assert descriptor.location.org != descriptor.display_org_with_default
+        assert descriptor.display_org_with_default == '{0}_display'.format(ORG)
 
     def test_display_coursenumber(self):
         descriptor = get_dummy_course(start='2012-12-02T12:00', is_new=True)
-        self.assertNotEqual(descriptor.location.course, descriptor.display_number_with_default)
-        self.assertEqual(descriptor.display_number_with_default, "{0}_display".format(COURSE))
+        assert descriptor.location.course != descriptor.display_number_with_default
+        assert descriptor.display_number_with_default == '{0}_display'.format(COURSE)
 
     def test_is_newish(self):
         descriptor = get_dummy_course(start='2012-12-02T12:00', is_new=True)
@@ -268,7 +265,7 @@ class DiscussionTopicsTestCase(unittest.TestCase):
 
     def test_default_discussion_topics(self):
         d = get_dummy_course('2012-12-02T12:00')
-        self.assertEqual({'General': {'id': 'i4x-test_org-test_course-course-test'}}, d.discussion_topics)
+        assert {'General': {'id': 'i4x-test_org-test_course-course-test'}} == d.discussion_topics
 
 
 class TeamsConfigurationTestCase(unittest.TestCase):
@@ -306,52 +303,49 @@ class TeamsConfigurationTestCase(unittest.TestCase):
 
     def test_teams_enabled_new_course(self):
         # Make sure we can detect when no teams exist.
-        self.assertFalse(self.course.teams_enabled)
+        assert not self.course.teams_enabled
 
         # add topics
         self.add_team_configuration(max_team_size=4, topics=[self.make_topic()])
-        self.assertTrue(self.course.teams_enabled)
+        assert self.course.teams_enabled
 
         # remove them again
         self.add_team_configuration(max_team_size=4, topics=[])
-        self.assertFalse(self.course.teams_enabled)
+        assert not self.course.teams_enabled
 
     def test_teams_enabled_max_size_only(self):
         self.add_team_configuration(max_team_size=4)
-        self.assertFalse(self.course.teams_enabled)
+        assert not self.course.teams_enabled
 
     def test_teams_enabled_no_max_size(self):
         self.add_team_configuration(max_team_size=None, topics=[self.make_topic()])
-        self.assertTrue(self.course.teams_enabled)
+        assert self.course.teams_enabled
 
     def test_teams_max_size_no_teams_configuration(self):
-        self.assertEqual(
-            self.course.teams_configuration.default_max_team_size,
-            DEFAULT_COURSE_RUN_MAX_TEAM_SIZE,
-        )
+        assert self.course.teams_configuration.default_max_team_size == DEFAULT_COURSE_RUN_MAX_TEAM_SIZE
 
     def test_teams_max_size_with_teams_configured(self):
         size = 4
         self.add_team_configuration(max_team_size=size, topics=[self.make_topic(), self.make_topic()])
-        self.assertTrue(self.course.teams_enabled)
-        self.assertEqual(size, self.course.teams_configuration.default_max_team_size)
+        assert self.course.teams_enabled
+        assert size == self.course.teams_configuration.default_max_team_size
 
     def test_teamsets_no_config(self):
-        self.assertEqual(self.course.teamsets, [])
+        assert self.course.teamsets == []
 
     def test_teamsets_empty(self):
         self.add_team_configuration(max_team_size=4)
-        self.assertEqual(self.course.teamsets, [])
+        assert self.course.teamsets == []
 
     def test_teamsets_present(self):
         topics = [self.make_topic(), self.make_topic()]
         self.add_team_configuration(max_team_size=4, topics=topics)
-        self.assertTrue(self.course.teams_enabled)
+        assert self.course.teams_enabled
         expected_teamsets_data = [
             teamset.cleaned_data
             for teamset in self.course.teamsets
         ]
-        self.assertEqual(expected_teamsets_data, topics)
+        assert expected_teamsets_data == topics
 
     def test_teams_conf_cached_by_xblock_field(self):
         self.add_team_configuration(max_team_size=5, topics=[self.make_topic()])
@@ -360,9 +354,9 @@ class TeamsConfigurationTestCase(unittest.TestCase):
         self.add_team_configuration(max_team_size=5, topics=[self.make_topic(), self.make_topic()])
         new_cold_cache_conf = self.course.teams_configuration
         new_warm_cache_conf = self.course.teams_configuration
-        self.assertIs(cold_cache_conf, warm_cache_conf)
-        self.assertIs(new_cold_cache_conf, new_warm_cache_conf)
-        self.assertIsNot(cold_cache_conf, new_cold_cache_conf)
+        assert cold_cache_conf is warm_cache_conf
+        assert new_cold_cache_conf is new_warm_cache_conf
+        assert cold_cache_conf is not new_cold_cache_conf
 
 
 class SelfPacedTestCase(unittest.TestCase):
@@ -373,7 +367,7 @@ class SelfPacedTestCase(unittest.TestCase):
         self.course = get_dummy_course('2012-12-02T12:00')
 
     def test_default(self):
-        self.assertFalse(self.course.self_paced)
+        assert not self.course.self_paced
 
 
 class CourseDescriptorTestCase(unittest.TestCase):
@@ -397,29 +391,23 @@ class CourseDescriptorTestCase(unittest.TestCase):
         """
         Test CourseDescriptor.clean_id.
         """
-        self.assertEqual(
-            self.course.clean_id(),
-            "course_ORSXG5C7N5ZGOL3UMVZXIX3DN52XE43FF52GK43UL5ZHK3Q="
-        )
-        self.assertEqual(
-            self.course.clean_id(padding_char='$'),
-            "course_ORSXG5C7N5ZGOL3UMVZXIX3DN52XE43FF52GK43UL5ZHK3Q$"
-        )
+        assert self.course.clean_id() == 'course_ORSXG5C7N5ZGOL3UMVZXIX3DN52XE43FF52GK43UL5ZHK3Q='
+        assert self.course.clean_id(padding_char='$') == 'course_ORSXG5C7N5ZGOL3UMVZXIX3DN52XE43FF52GK43UL5ZHK3Q$'
 
     def test_has_started(self):
         """
         Test CourseDescriptor.has_started.
         """
         self.course.start = _LAST_WEEK
-        self.assertTrue(self.course.has_started())
+        assert self.course.has_started()
         self.course.start = _NEXT_WEEK
-        self.assertFalse(self.course.has_started())
+        assert not self.course.has_started()
 
     def test_number(self):
         """
         Test CourseDescriptor.number.
         """
-        self.assertEqual(self.course.number, COURSE)
+        assert self.course.number == COURSE
 
     def test_set_default_certificate_available_date(self):
         """
@@ -427,7 +415,7 @@ class CourseDescriptorTestCase(unittest.TestCase):
         after the course end date.
         """
         expected_certificate_available_date = self.course.end + timedelta(days=2)
-        self.assertEqual(expected_certificate_available_date, self.course.certificate_available_date)
+        assert expected_certificate_available_date == self.course.certificate_available_date
 
 
 class ProctoringProviderTestCase(unittest.TestCase):
@@ -451,7 +439,7 @@ class ProctoringProviderTestCase(unittest.TestCase):
 
         # we expect the validated value to be equivalent to the value passed in,
         # since there are no validation errors or missing data
-        self.assertEqual(self.proctoring_provider.from_json(default_provider), default_provider)
+        assert self.proctoring_provider.from_json(default_provider) == default_provider
 
     def test_from_json_with_invalid_provider(self):
         """
@@ -461,13 +449,11 @@ class ProctoringProviderTestCase(unittest.TestCase):
         provider = 'invalid-provider'
         allowed_proctoring_providers = [u'mock', u'mock_proctoring_without_rules']
 
-        with self.assertRaises(ValueError) as context_manager:
+        with pytest.raises(ValueError) as context_manager:
             self.proctoring_provider.from_json(provider)
-        self.assertEqual(
-            context_manager.exception.args[0],
-            ['The selected proctoring provider, {}, is not a valid provider. Please select from one of {}.'
-                .format(provider, allowed_proctoring_providers)]
-        )
+        assert context_manager.exception.args[0] ==\
+               [f'The selected proctoring provider, {provider},'
+                f' is not a valid provider. Please select from one of {allowed_proctoring_providers}.']
 
     def test_from_json_adds_platform_default_for_missing_provider(self):
         """
@@ -476,7 +462,7 @@ class ProctoringProviderTestCase(unittest.TestCase):
         """
         default_provider = 'mock'
 
-        self.assertEqual(self.proctoring_provider.from_json(None), default_provider)
+        assert self.proctoring_provider.from_json(None) == default_provider
 
     @override_settings(
         PROCTORING_BACKENDS={
@@ -488,7 +474,7 @@ class ProctoringProviderTestCase(unittest.TestCase):
         """
         Test that, when the platform defaults are not set, the default is correct.
         """
-        self. assertEqual(self.proctoring_provider.default, None)
+        assert self.proctoring_provider.default is None
 
     @override_settings(PROCTORING_BACKENDS=None)
     def test_default_with_no_platform_configuration(self):
@@ -496,4 +482,4 @@ class ProctoringProviderTestCase(unittest.TestCase):
         Test that, when the platform default is not specified, the default is correct.
         """
         default = self.proctoring_provider.default
-        self.assertEqual(default, None)
+        assert default is None
diff --git a/common/lib/xmodule/xmodule/tests/test_delay_between_attempts.py b/common/lib/xmodule/xmodule/tests/test_delay_between_attempts.py
index 667998efdd951a7654bec7a0c0aa5b4c836a1a6a..8f636ba6e1f5160060bbdc23ca8bbfc566383f2d 100644
--- a/common/lib/xmodule/xmodule/tests/test_delay_between_attempts.py
+++ b/common/lib/xmodule/xmodule/tests/test_delay_between_attempts.py
@@ -12,6 +12,7 @@ import datetime
 import textwrap
 import unittest
 
+import pytest
 from mock import Mock
 from opaque_keys.edx.locator import BlockUsageLocator, CourseLocator
 from pytz import UTC
@@ -156,8 +157,8 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         )
         # Successfully submitted and answered
         # Also, the number of attempts should increment by 1
-        self.assertEqual(result['success'], 'correct')
-        self.assertEqual(module.attempts, num_attempts + 1)
+        assert result['success'] == 'correct'
+        assert module.attempts == (num_attempts + 1)
 
     def test_no_wait_time(self):
         num_attempts = 1
@@ -168,8 +169,8 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         )
         # Successfully submitted and answered
         # Also, the number of attempts should increment by 1
-        self.assertEqual(result['success'], 'correct')
-        self.assertEqual(module.attempts, num_attempts + 1)
+        assert result['success'] == 'correct'
+        assert module.attempts == (num_attempts + 1)
 
     def test_submit_quiz_in_rapid_succession(self):
         # Already attempted once (just now) and thus has a submitted time
@@ -182,7 +183,7 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         # You should get a dialog that tells you to wait
         # Also, the number of attempts should not be incremented
         self.assertRegex(result['success'], r"You must wait at least.*")
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
 
     def test_submit_quiz_too_soon(self):
         # Already attempted once (just now)
@@ -196,7 +197,7 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         # You should get a dialog that tells you to wait 2 minutes
         # Also, the number of attempts should not be incremented
         self.assertRegex(result['success'], r"You must wait at least 3 minutes between submissions. 2 minutes remaining\..*")  # lint-amnesty, pylint: disable=line-too-long
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
 
     def test_submit_quiz_1_second_too_soon(self):
         # Already attempted once (just now)
@@ -210,7 +211,7 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         # You should get a dialog that tells you to wait 2 minutes
         # Also, the number of attempts should not be incremented
         self.assertRegex(result['success'], r"You must wait at least 3 minutes between submissions. 1 second remaining\..*")  # lint-amnesty, pylint: disable=line-too-long
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
 
     def test_submit_quiz_as_soon_as_allowed(self):
         # Already attempted once (just now)
@@ -223,8 +224,8 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         )
         # Successfully submitted and answered
         # Also, the number of attempts should increment by 1
-        self.assertEqual(result['success'], 'correct')
-        self.assertEqual(module.attempts, num_attempts + 1)
+        assert result['success'] == 'correct'
+        assert module.attempts == (num_attempts + 1)
 
     def test_submit_quiz_after_delay_expired(self):
         # Already attempted once (just now)
@@ -237,14 +238,14 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         )
         # Successfully submitted and answered
         # Also, the number of attempts should increment by 1
-        self.assertEqual(result['success'], 'correct')
-        self.assertEqual(module.attempts, num_attempts + 1)
+        assert result['success'] == 'correct'
+        assert module.attempts == (num_attempts + 1)
 
     def test_still_cannot_submit_after_max_attempts(self):
         # Already attempted once (just now) and thus has a submitted time
         num_attempts = 99
         # Regular create_and_check should fail
-        with self.assertRaises(xmodule.exceptions.NotFoundError):
+        with pytest.raises(xmodule.exceptions.NotFoundError):
             (module, unused_result) = self.create_and_check(
                 num_attempts=num_attempts,
                 last_submission_time=datetime.datetime(2013, 12, 6, 0, 17, 36, tzinfo=UTC),
@@ -261,7 +262,7 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
             skip_submit_problem=True
         )
         # Expect that number of attempts NOT incremented
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
 
     def test_submit_quiz_with_long_delay(self):
         # Already attempted once (just now)
@@ -275,7 +276,7 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         # You should get a dialog that tells you to wait 2 minutes
         # Also, the number of attempts should not be incremented
         self.assertRegex(result['success'], r"You must wait at least 2 hours between submissions. 2 minutes 1 second remaining\..*")  # lint-amnesty, pylint: disable=line-too-long
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
 
     def test_submit_quiz_with_involved_pretty_print(self):
         # Already attempted once (just now)
@@ -289,7 +290,7 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         # You should get a dialog that tells you to wait 2 minutes
         # Also, the number of attempts should not be incremented
         self.assertRegex(result['success'], r"You must wait at least 2 hours 1 minute 3 seconds between submissions. 1 hour 2 minutes 59 seconds remaining\..*")  # lint-amnesty, pylint: disable=line-too-long
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
 
     def test_submit_quiz_with_nonplural_pretty_print(self):
         # Already attempted once (just now)
@@ -303,4 +304,4 @@ class XModuleQuizAttemptsDelayTest(unittest.TestCase):
         # You should get a dialog that tells you to wait 2 minutes
         # Also, the number of attempts should not be incremented
         self.assertRegex(result['success'], r"You must wait at least 1 minute between submissions. 1 minute remaining\..*")  # lint-amnesty, pylint: disable=line-too-long
-        self.assertEqual(module.attempts, num_attempts)
+        assert module.attempts == num_attempts
diff --git a/common/lib/xmodule/xmodule/tests/test_editing_module.py b/common/lib/xmodule/xmodule/tests/test_editing_module.py
index d95775536821d44c5da986d703e6792b6f917f54..fd870d01640ee0bbcc16ed6ff259c7d104df5bc5 100644
--- a/common/lib/xmodule/xmodule/tests/test_editing_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_editing_module.py
@@ -70,8 +70,8 @@ class TabsEditingDescriptorTestCase(unittest.TestCase):
         test_css_file = os.path.join(current_dir, 'test_files/test_tabseditingdescriptor.scss')
         with open(test_css_file) as new_css:
             added_css = new_css.read()
-        self.assertEqual(css['scss'].pop().decode('utf-8'), added_css)
-        self.assertEqual(css['css'].pop().decode('utf-8'), added_css)
+        assert css['scss'].pop().decode('utf-8') == added_css
+        assert css['css'].pop().decode('utf-8') == added_css
 
     def test_get_context(self):
         """"test get_context"""
diff --git a/common/lib/xmodule/xmodule/tests/test_error_module.py b/common/lib/xmodule/xmodule/tests/test_error_module.py
index 512a9f9aa7717ca8450b5066691e4633d8a7422f..9bbc0046fc0d55a85cb13f3689d90acbaccc5180 100644
--- a/common/lib/xmodule/xmodule/tests/test_error_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_error_module.py
@@ -5,6 +5,7 @@ Tests for ErrorBlock and NonStaffErrorBlock
 
 import unittest
 
+import pytest
 from mock import MagicMock, Mock, patch
 from opaque_keys.edx.locator import BlockUsageLocator, CourseLocator
 from xblock.field_data import DictFieldData
@@ -42,11 +43,11 @@ class TestErrorBlock(SetupTestErrorBlock):
             CourseLocationManager(self.course_id),
             self.error_msg
         )
-        self.assertIsInstance(descriptor, ErrorBlock)
+        assert isinstance(descriptor, ErrorBlock)
         descriptor.xmodule_runtime = self.system
         context_repr = self.system.render(descriptor, STUDENT_VIEW).content
-        self.assertIn(self.error_msg, context_repr)
-        self.assertIn(repr(self.valid_xml), context_repr)
+        assert self.error_msg in context_repr
+        assert repr(self.valid_xml) in context_repr
 
     def test_error_block_from_descriptor(self):
         descriptor = MagicMock(
@@ -57,11 +58,11 @@ class TestErrorBlock(SetupTestErrorBlock):
 
         error_descriptor = ErrorBlock.from_descriptor(
             descriptor, self.error_msg)
-        self.assertIsInstance(error_descriptor, ErrorBlock)
+        assert isinstance(error_descriptor, ErrorBlock)
         error_descriptor.xmodule_runtime = self.system
         context_repr = self.system.render(error_descriptor, STUDENT_VIEW).content
-        self.assertIn(self.error_msg, context_repr)
-        self.assertIn(repr(descriptor), context_repr)
+        assert self.error_msg in context_repr
+        assert repr(descriptor) in context_repr
 
 
 class TestNonStaffErrorBlock(SetupTestErrorBlock):
@@ -75,7 +76,7 @@ class TestNonStaffErrorBlock(SetupTestErrorBlock):
             self.system,
             CourseLocationManager(self.course_id)
         )
-        self.assertIsInstance(descriptor, NonStaffErrorBlock)
+        assert isinstance(descriptor, NonStaffErrorBlock)
 
     def test_from_xml_render(self):
         descriptor = NonStaffErrorBlock.from_xml(
@@ -85,8 +86,8 @@ class TestNonStaffErrorBlock(SetupTestErrorBlock):
         )
         descriptor.xmodule_runtime = self.system
         context_repr = self.system.render(descriptor, STUDENT_VIEW).content
-        self.assertNotIn(self.error_msg, context_repr)
-        self.assertNotIn(repr(self.valid_xml), context_repr)
+        assert self.error_msg not in context_repr
+        assert repr(self.valid_xml) not in context_repr
 
     def test_error_block_from_descriptor(self):
         descriptor = MagicMock(
@@ -97,11 +98,11 @@ class TestNonStaffErrorBlock(SetupTestErrorBlock):
 
         error_descriptor = NonStaffErrorBlock.from_descriptor(
             descriptor, self.error_msg)
-        self.assertIsInstance(error_descriptor, ErrorBlock)
+        assert isinstance(error_descriptor, ErrorBlock)
         error_descriptor.xmodule_runtime = self.system
         context_repr = self.system.render(error_descriptor, STUDENT_VIEW).content
-        self.assertNotIn(self.error_msg, context_repr)
-        self.assertNotIn(str(descriptor), context_repr)
+        assert self.error_msg not in context_repr
+        assert str(descriptor) not in context_repr
 
 
 class BrokenModule(XModule):  # lint-amnesty, pylint: disable=abstract-method
@@ -149,14 +150,14 @@ class TestErrorBlockConstruction(unittest.TestCase):
         get an ErrorBlock back from XModuleDescriptor._xmodule
         """
         module = self.descriptor._xmodule  # lint-amnesty, pylint: disable=protected-access
-        self.assertIsInstance(module, ErrorBlock)
+        assert isinstance(module, ErrorBlock)
 
     @patch.object(ErrorBlock, '__init__', Mock(side_effect=TestException))
     def test_broken_error_descriptor(self):
         """
         Test that a broken block descriptor doesn't cause an infinite loop
         """
-        with self.assertRaises(TestException):
+        with pytest.raises(TestException):
             module = self.descriptor._xmodule  # lint-amnesty, pylint: disable=protected-access, unused-variable
 
     @patch.object(ErrorBlock, '__init__', Mock(side_effect=TestException))
@@ -164,5 +165,5 @@ class TestErrorBlockConstruction(unittest.TestCase):
         """
         Test that a broken block module doesn't cause an infinite loop
         """
-        with self.assertRaises(TestException):
+        with pytest.raises(TestException):
             module = self.descriptor._xmodule  # lint-amnesty, pylint: disable=protected-access, unused-variable
diff --git a/common/lib/xmodule/xmodule/tests/test_export.py b/common/lib/xmodule/xmodule/tests/test_export.py
index 37bf301cd5e3dadad5dbf2c7ae0d08795f527cbb..a399ea352136f5b9deed10f8d18fd13de41d24d3 100644
--- a/common/lib/xmodule/xmodule/tests/test_export.py
+++ b/common/lib/xmodule/xmodule/tests/test_export.py
@@ -9,7 +9,7 @@ import unittest
 from datetime import datetime, timedelta, tzinfo
 from tempfile import mkdtemp
 from textwrap import dedent
-
+import pytest
 import ddt
 import lxml.etree
 import mock
@@ -104,7 +104,7 @@ class RoundTripTestCase(unittest.TestCase):
         initial_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin,))
 
         courses = initial_import.get_courses()
-        self.assertEqual(len(courses), 1)
+        assert len(courses) == 1
         initial_course = courses[0]
 
         # export to the same directory--that way things like the custom_tags/ folder
@@ -122,7 +122,7 @@ class RoundTripTestCase(unittest.TestCase):
         second_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin,))
 
         courses2 = second_import.get_courses()
-        self.assertEqual(len(courses2), 1)
+        assert len(courses2) == 1
         exported_course = courses2[0]
 
         print("Checking course equality")
@@ -132,8 +132,8 @@ class RoundTripTestCase(unittest.TestCase):
         strip_filenames(initial_course)
         strip_filenames(exported_course)
 
-        self.assertTrue(blocks_are_equivalent(initial_course, exported_course))
-        self.assertEqual(initial_course.id, exported_course.id)
+        assert blocks_are_equivalent(initial_course, exported_course)
+        assert initial_course.id == exported_course.id
         course_id = initial_course.id
 
         print("Checking key equality")
@@ -146,10 +146,8 @@ class RoundTripTestCase(unittest.TestCase):
         print("Checking module equality")
         for location in initial_import.modules[course_id].keys():
             print(("Checking", location))
-            self.assertTrue(blocks_are_equivalent(
-                initial_import.modules[course_id][location],
-                second_import.modules[course_id][location]
-            ))
+            assert blocks_are_equivalent(initial_import.modules[course_id][location],
+                                         second_import.modules[course_id][location])
 
 
 class TestEdxJsonEncoder(unittest.TestCase):
@@ -177,42 +175,27 @@ class TestEdxJsonEncoder(unittest.TestCase):
 
     def test_encode_location(self):
         loc = BlockUsageLocator(CourseLocator('org', 'course', 'run'), 'category', 'name')
-        self.assertEqual(text_type(loc), self.encoder.default(loc))
+        assert text_type(loc) == self.encoder.default(loc)
 
         loc = BlockUsageLocator(CourseLocator('org', 'course', 'run', branch='version'), 'category', 'name')
-        self.assertEqual(text_type(loc), self.encoder.default(loc))
+        assert text_type(loc) == self.encoder.default(loc)
 
     def test_encode_naive_datetime(self):
-        self.assertEqual(
-            "2013-05-03T10:20:30.000100",
-            self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 100))
-        )
-        self.assertEqual(
-            "2013-05-03T10:20:30",
-            self.encoder.default(datetime(2013, 5, 3, 10, 20, 30))
-        )
+        assert '2013-05-03T10:20:30.000100' == self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 100))
+        assert '2013-05-03T10:20:30' == self.encoder.default(datetime(2013, 5, 3, 10, 20, 30))
 
     def test_encode_utc_datetime(self):
-        self.assertEqual(
-            "2013-05-03T10:20:30+00:00",
-            self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, pytz.UTC))
-        )
+        assert '2013-05-03T10:20:30+00:00' == self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, pytz.UTC))
 
-        self.assertEqual(
-            "2013-05-03T10:20:30+04:00",
-            self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, self.offset_tz))
-        )
+        assert '2013-05-03T10:20:30+04:00' == self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, self.offset_tz))
 
-        self.assertEqual(
-            "2013-05-03T10:20:30Z",
-            self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, self.null_utc_tz))
-        )
+        assert '2013-05-03T10:20:30Z' == self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, self.null_utc_tz))
 
     def test_fallthrough(self):
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             self.encoder.default(None)
 
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             self.encoder.default({})
 
     def test_encode_unicode_lazy_text(self):
@@ -224,7 +207,4 @@ class TestEdxJsonEncoder(unittest.TestCase):
         unicode_text = u"Your 𝓟𝓵𝓪𝓽𝓯𝓸𝓻𝓶 Name Here"
         lazy_text = ugettext_lazy(unicode_text)  # lint-amnesty, pylint: disable=translation-of-non-string
 
-        self.assertEqual(
-            unicode_text,
-            self.encoder.default(lazy_text)
-        )
+        assert unicode_text == self.encoder.default(lazy_text)
diff --git a/common/lib/xmodule/xmodule/tests/test_fields.py b/common/lib/xmodule/xmodule/tests/test_fields.py
index bcdc61635f13f51fee870ea16bcac47dd3745d15..3e8efb3227733c7f9b9d9b6f983453cb7426036e 100644
--- a/common/lib/xmodule/xmodule/tests/test_fields.py
+++ b/common/lib/xmodule/xmodule/tests/test_fields.py
@@ -3,7 +3,7 @@
 
 import datetime
 import unittest
-
+import pytest
 from pytz import UTC
 
 from xmodule.fields import Date, RelativeTime, Timedelta
@@ -14,11 +14,7 @@ class DateTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-clas
     date = Date()
 
     def compare_dates(self, dt1, dt2, expected_delta):
-        self.assertEqual(
-            dt1 - dt2,
-            expected_delta,
-            str(dt1) + "-" + str(dt2) + "!=" + str(expected_delta)
-        )
+        assert (dt1 - dt2) == expected_delta, ((((str(dt1) + '-') + str(dt2)) + '!=') + str(expected_delta))
 
     def test_from_json(self):
         """Test conversion from iso compatible date strings to struct_time"""
@@ -54,40 +50,27 @@ class DateTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-clas
         )
 
     def test_enforce_type(self):
-        self.assertEqual(DateTest.date.enforce_type(None), None)
-        self.assertEqual(DateTest.date.enforce_type(""), None)
-        self.assertEqual(
-            DateTest.date.enforce_type("2012-12-31T23:00:01"),
-            datetime.datetime(2012, 12, 31, 23, 0, 1, tzinfo=UTC)
-        )
-        self.assertEqual(
-            DateTest.date.enforce_type(1234567890000),
-            datetime.datetime(2009, 2, 13, 23, 31, 30, tzinfo=UTC)
-        )
-        self.assertEqual(
-            DateTest.date.enforce_type(datetime.datetime(2014, 5, 9, 21, 1, 27, tzinfo=UTC)),
-            datetime.datetime(2014, 5, 9, 21, 1, 27, tzinfo=UTC)
-        )
-        with self.assertRaises(TypeError):
+        assert DateTest.date.enforce_type(None) is None
+        assert DateTest.date.enforce_type('') is None
+        assert DateTest.date.enforce_type('2012-12-31T23:00:01') ==\
+               datetime.datetime(2012, 12, 31, 23, 0, 1, tzinfo=UTC)
+        assert DateTest.date.enforce_type(1234567890000) == datetime.datetime(2009, 2, 13, 23, 31, 30, tzinfo=UTC)
+        assert DateTest.date.enforce_type(datetime.datetime(2014, 5, 9, 21, 1, 27, tzinfo=UTC)) ==\
+               datetime.datetime(2014, 5, 9, 21, 1, 27, tzinfo=UTC)
+        with pytest.raises(TypeError):
             DateTest.date.enforce_type([1])
 
     def test_return_None(self):
-        self.assertIsNone(DateTest.date.from_json(""))
-        self.assertIsNone(DateTest.date.from_json(None))
-        with self.assertRaises(TypeError):
+        assert DateTest.date.from_json('') is None
+        assert DateTest.date.from_json(None) is None
+        with pytest.raises(TypeError):
             DateTest.date.from_json(['unknown value'])
 
     def test_old_due_date_format(self):
         current = datetime.datetime.today()
-        self.assertEqual(
-            datetime.datetime(current.year, 3, 12, 12, tzinfo=UTC),
-            DateTest.date.from_json("March 12 12:00")
-        )
-        self.assertEqual(
-            datetime.datetime(current.year, 12, 4, 16, 30, tzinfo=UTC),
-            DateTest.date.from_json("December 4 16:30")
-        )
-        self.assertIsNone(DateTest.date.from_json("12 12:00"))
+        assert datetime.datetime(current.year, 3, 12, 12, tzinfo=UTC) == DateTest.date.from_json('March 12 12:00')
+        assert datetime.datetime(current.year, 12, 4, 16, 30, tzinfo=UTC) == DateTest.date.from_json('December 4 16:30')
+        assert DateTest.date.from_json('12 12:00') is None
 
     def test_non_std_from_json(self):
         """
@@ -95,30 +78,20 @@ class DateTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-clas
         """
         now = datetime.datetime.now(UTC)
         delta = now - datetime.datetime.fromtimestamp(0, UTC)
-        self.assertEqual(
-            DateTest.date.from_json(delta.total_seconds() * 1000),
-            now
-        )
+        assert DateTest.date.from_json((delta.total_seconds() * 1000)) == now
         yesterday = datetime.datetime.now(UTC) - datetime.timedelta(days=-1)
-        self.assertEqual(DateTest.date.from_json(yesterday), yesterday)
+        assert DateTest.date.from_json(yesterday) == yesterday
 
     def test_to_json(self):
         """
         Test converting time reprs to iso dates
         """
-        self.assertEqual(
-            DateTest.date.to_json(datetime.datetime.strptime("2012-12-31T23:59:59Z", "%Y-%m-%dT%H:%M:%SZ")),
-            "2012-12-31T23:59:59Z"
-        )
-        self.assertEqual(
-            DateTest.date.to_json(DateTest.date.from_json("2012-12-31T23:59:59Z")),
-            "2012-12-31T23:59:59Z"
-        )
-        self.assertEqual(
-            DateTest.date.to_json(DateTest.date.from_json("2012-12-31T23:00:01-01:00")),
-            "2012-12-31T23:00:01-01:00"
-        )
-        with self.assertRaises(TypeError):
+        assert DateTest.date.to_json(datetime.datetime.strptime('2012-12-31T23:59:59Z', '%Y-%m-%dT%H:%M:%SZ')) ==\
+               '2012-12-31T23:59:59Z'
+        assert DateTest.date.to_json(DateTest.date.from_json('2012-12-31T23:59:59Z')) == '2012-12-31T23:59:59Z'
+        assert DateTest.date.to_json(DateTest.date.from_json('2012-12-31T23:00:01-01:00')) ==\
+               '2012-12-31T23:00:01-01:00'
+        with pytest.raises(TypeError):
             DateTest.date.to_json('2012-12-31T23:00:01-01:00')
 
 
@@ -126,34 +99,22 @@ class TimedeltaTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing
     delta = Timedelta()
 
     def test_from_json(self):
-        self.assertEqual(
-            TimedeltaTest.delta.from_json('1 day 12 hours 59 minutes 59 seconds'),
-            datetime.timedelta(days=1, hours=12, minutes=59, seconds=59)
-        )
+        assert TimedeltaTest.delta.from_json('1 day 12 hours 59 minutes 59 seconds') ==\
+               datetime.timedelta(days=1, hours=12, minutes=59, seconds=59)
 
-        self.assertEqual(
-            TimedeltaTest.delta.from_json('1 day 46799 seconds'),
-            datetime.timedelta(days=1, seconds=46799)
-        )
+        assert TimedeltaTest.delta.from_json('1 day 46799 seconds') == datetime.timedelta(days=1, seconds=46799)
 
     def test_enforce_type(self):
-        self.assertEqual(TimedeltaTest.delta.enforce_type(None), None)
-        self.assertEqual(
-            TimedeltaTest.delta.enforce_type(datetime.timedelta(days=1, seconds=46799)),
-            datetime.timedelta(days=1, seconds=46799)
-        )
-        self.assertEqual(
-            TimedeltaTest.delta.enforce_type('1 day 46799 seconds'),
-            datetime.timedelta(days=1, seconds=46799)
-        )
-        with self.assertRaises(TypeError):
+        assert TimedeltaTest.delta.enforce_type(None) is None
+        assert TimedeltaTest.delta.enforce_type(datetime.timedelta(days=1, seconds=46799)) ==\
+               datetime.timedelta(days=1, seconds=46799)
+        assert TimedeltaTest.delta.enforce_type('1 day 46799 seconds') == datetime.timedelta(days=1, seconds=46799)
+        with pytest.raises(TypeError):
             TimedeltaTest.delta.enforce_type([1])
 
     def test_to_json(self):
-        self.assertEqual(
-            '1 days 46799 seconds',
-            TimedeltaTest.delta.to_json(datetime.timedelta(days=1, hours=12, minutes=59, seconds=59))
-        )
+        assert '1 days 46799 seconds' ==\
+               TimedeltaTest.delta.to_json(datetime.timedelta(days=1, hours=12, minutes=59, seconds=59))
 
 
 class TimeInfoTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -162,10 +123,7 @@ class TimeInfoTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-
         due_date = datetime.datetime(2000, 4, 14, 10, tzinfo=UTC)
         grace_pd_string = '1 day 12 hours 59 minutes 59 seconds'
         timeinfo = TimeInfo(due_date, grace_pd_string)
-        self.assertEqual(
-            timeinfo.close_date,
-            due_date + Timedelta().from_json(grace_pd_string)
-        )
+        assert timeinfo.close_date == (due_date + Timedelta().from_json(grace_pd_string))
 
 
 class RelativeTimeTest(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -173,66 +131,37 @@ class RelativeTimeTest(unittest.TestCase):  # lint-amnesty, pylint: disable=miss
     delta = RelativeTime()
 
     def test_from_json(self):
-        self.assertEqual(
-            RelativeTimeTest.delta.from_json('0:05:07'),
-            datetime.timedelta(seconds=307)
-        )
+        assert RelativeTimeTest.delta.from_json('0:05:07') == datetime.timedelta(seconds=307)
 
-        self.assertEqual(
-            RelativeTimeTest.delta.from_json(100.0),
-            datetime.timedelta(seconds=100)
-        )
-        self.assertEqual(
-            RelativeTimeTest.delta.from_json(None),
-            datetime.timedelta(seconds=0)
-        )
+        assert RelativeTimeTest.delta.from_json(100.0) == datetime.timedelta(seconds=100)
+        assert RelativeTimeTest.delta.from_json(None) == datetime.timedelta(seconds=0)
 
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             RelativeTimeTest.delta.from_json(1234)  # int
 
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             RelativeTimeTest.delta.from_json("77:77:77")
 
     def test_enforce_type(self):
-        self.assertEqual(RelativeTimeTest.delta.enforce_type(None), None)
-        self.assertEqual(
-            RelativeTimeTest.delta.enforce_type(datetime.timedelta(days=1, seconds=46799)),
-            datetime.timedelta(days=1, seconds=46799)
-        )
-        self.assertEqual(
-            RelativeTimeTest.delta.enforce_type('0:05:07'),
-            datetime.timedelta(seconds=307)
-        )
-        with self.assertRaises(TypeError):
+        assert RelativeTimeTest.delta.enforce_type(None) is None
+        assert RelativeTimeTest.delta.enforce_type(datetime.timedelta(days=1, seconds=46799)) ==\
+               datetime.timedelta(days=1, seconds=46799)
+        assert RelativeTimeTest.delta.enforce_type('0:05:07') == datetime.timedelta(seconds=307)
+        with pytest.raises(TypeError):
             RelativeTimeTest.delta.enforce_type([1])
 
     def test_to_json(self):
-        self.assertEqual(
-            "01:02:03",
-            RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=3723))
-        )
-        self.assertEqual(
-            "00:00:00",
-            RelativeTimeTest.delta.to_json(None)
-        )
-        self.assertEqual(
-            "00:01:40",
-            RelativeTimeTest.delta.to_json(100.0)
-        )
+        assert '01:02:03' == RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=3723))
+        assert '00:00:00' == RelativeTimeTest.delta.to_json(None)
+        assert '00:01:40' == RelativeTimeTest.delta.to_json(100.0)
 
         error_msg = "RelativeTime max value is 23:59:59=86400.0 seconds, but 90000.0 seconds is passed"
         with self.assertRaisesRegex(ValueError, error_msg):
             RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=90000))
 
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             RelativeTimeTest.delta.to_json("123")
 
     def test_str(self):
-        self.assertEqual(
-            "01:02:03",
-            RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=3723))
-        )
-        self.assertEqual(
-            "11:02:03",
-            RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=39723))
-        )
+        assert '01:02:03' == RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=3723))
+        assert '11:02:03' == RelativeTimeTest.delta.to_json(datetime.timedelta(seconds=39723))
diff --git a/common/lib/xmodule/xmodule/tests/test_graders.py b/common/lib/xmodule/xmodule/tests/test_graders.py
index 3e24e8ab12c630a5394d38913343f584d1a6cfb6..30995b5cf1ecfa6d31031f9a1fd87783bc365dd9 100644
--- a/common/lib/xmodule/xmodule/tests/test_graders.py
+++ b/common/lib/xmodule/xmodule/tests/test_graders.py
@@ -5,7 +5,7 @@ Grading tests
 
 import unittest
 from datetime import datetime, timedelta
-
+import pytest
 import ddt
 from pytz import UTC
 import six
@@ -28,26 +28,14 @@ class GradesheetTest(unittest.TestCase):
 
         # No scores
         all_total, graded_total = aggregate_scores(scores)
-        self.assertEqual(
-            all_total,
-            AggregatedScore(tw_earned=0, tw_possible=0, graded=False, **agg_fields),
-        )
-        self.assertEqual(
-            graded_total,
-            AggregatedScore(tw_earned=0, tw_possible=0, graded=True, **agg_fields),
-        )
+        assert all_total == AggregatedScore(tw_earned=0, tw_possible=0, graded=False, **agg_fields)
+        assert graded_total == AggregatedScore(tw_earned=0, tw_possible=0, graded=True, **agg_fields)
 
         # (0/5 non-graded)
         scores.append(ProblemScore(weighted_earned=0, weighted_possible=5, graded=False, **prob_fields))
         all_total, graded_total = aggregate_scores(scores)
-        self.assertEqual(
-            all_total,
-            AggregatedScore(tw_earned=0, tw_possible=5, graded=False, **agg_fields),
-        )
-        self.assertEqual(
-            graded_total,
-            AggregatedScore(tw_earned=0, tw_possible=0, graded=True, **agg_fields),
-        )
+        assert all_total == AggregatedScore(tw_earned=0, tw_possible=5, graded=False, **agg_fields)
+        assert graded_total == AggregatedScore(tw_earned=0, tw_possible=0, graded=True, **agg_fields)
 
         # (0/5 non-graded) + (3/5 graded) = 3/10 total, 3/5 graded
         now = datetime.now()
@@ -55,26 +43,14 @@ class GradesheetTest(unittest.TestCase):
         agg_fields['first_attempted'] = now
         scores.append(ProblemScore(weighted_earned=3, weighted_possible=5, graded=True, **prob_fields))
         all_total, graded_total = aggregate_scores(scores)
-        self.assertAlmostEqual(
-            all_total,
-            AggregatedScore(tw_earned=3, tw_possible=10, graded=False, **agg_fields),
-        )
-        self.assertAlmostEqual(
-            graded_total,
-            AggregatedScore(tw_earned=3, tw_possible=5, graded=True, **agg_fields),
-        )
+        assert round(all_total - AggregatedScore(tw_earned=3, tw_possible=10, graded=False, **agg_fields), 7) >= 0
+        assert round(graded_total - AggregatedScore(tw_earned=3, tw_possible=5, graded=True, **agg_fields), 7) >= 0
 
         # (0/5 non-graded) + (3/5 graded) + (2/5 graded) = 5/15 total, 5/10 graded
         scores.append(ProblemScore(weighted_earned=2, weighted_possible=5, graded=True, **prob_fields))
         all_total, graded_total = aggregate_scores(scores)
-        self.assertAlmostEqual(
-            all_total,
-            AggregatedScore(tw_earned=5, tw_possible=15, graded=False, **agg_fields),
-        )
-        self.assertAlmostEqual(
-            graded_total,
-            AggregatedScore(tw_earned=5, tw_possible=10, graded=True, **agg_fields),
-        )
+        assert round(all_total - AggregatedScore(tw_earned=5, tw_possible=15, graded=False, **agg_fields), 7) >= 0
+        assert round(graded_total - AggregatedScore(tw_earned=5, tw_possible=10, graded=True, **agg_fields), 7) >= 0
 
 
 @ddt.ddt
@@ -147,25 +123,28 @@ class GraderTest(unittest.TestCase):
                 homework_grader.grade(self.incomplete_gradesheet),
                 no_drop_grader.grade(self.incomplete_gradesheet),
         ]:
-            self.assertAlmostEqual(graded['percent'], 0.0)
+            assert round(graded['percent'] - 0.0, 7) >= 0
             # Make sure the breakdown includes 12 sections, plus one summary
-            self.assertEqual(len(graded['section_breakdown']), 12 + 1)
+            assert len(graded['section_breakdown']) == (12 + 1)
 
         graded = homework_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.11)  # 100% + 10% / 10 assignments
-        self.assertEqual(len(graded['section_breakdown']), 12 + 1)
+        assert round(graded['percent'] - 0.11, 7) >= 0
+        # 100% + 10% / 10 assignments
+        assert len(graded['section_breakdown']) == (12 + 1)
 
         graded = no_drop_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.0916666666666666)  # 100% + 10% / 12 assignments
-        self.assertEqual(len(graded['section_breakdown']), 12 + 1)
+        assert round(graded['percent'] - 0.0916666666666666, 7) >= 0
+        # 100% + 10% / 12 assignments
+        assert len(graded['section_breakdown']) == (12 + 1)
 
         graded = overflow_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.8879999999999999)  # 100% + 10% / 5 assignments
-        self.assertEqual(len(graded['section_breakdown']), 7 + 1)
+        assert round(graded['percent'] - 0.8879999999999999, 7) >= 0
+        # 100% + 10% / 5 assignments
+        assert len(graded['section_breakdown']) == (7 + 1)
 
         graded = lab_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.92249999999999999)
-        self.assertEqual(len(graded['section_breakdown']), 7 + 1)
+        assert round(graded['percent'] - 0.9225, 7) >= 0
+        assert len(graded['section_breakdown']) == (7 + 1)
 
     def test_assignment_format_grader_on_single_section_entry(self):
         midterm_grader = graders.AssignmentFormatGrader("Midterm", 1, 0)
@@ -174,14 +153,14 @@ class GraderTest(unittest.TestCase):
                 midterm_grader.grade(self.empty_gradesheet),
                 midterm_grader.grade(self.incomplete_gradesheet),
         ]:
-            self.assertAlmostEqual(graded['percent'], 0.0)
+            assert round(graded['percent'] - 0.0, 7) >= 0
             # Make sure the breakdown includes just the one summary
-            self.assertEqual(len(graded['section_breakdown']), 0 + 1)
-            self.assertEqual(graded['section_breakdown'][0]['label'], 'Midterm')
+            assert len(graded['section_breakdown']) == (0 + 1)
+            assert graded['section_breakdown'][0]['label'] == 'Midterm'
 
         graded = midterm_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.50)
-        self.assertEqual(len(graded['section_breakdown']), 0 + 1)
+        assert round(graded['percent'] - 0.5, 7) >= 0
+        assert len(graded['section_breakdown']) == (0 + 1)
 
     def test_weighted_subsections_grader(self):
         # First, a few sub graders
@@ -218,24 +197,24 @@ class GraderTest(unittest.TestCase):
         empty_grader = graders.WeightedSubsectionsGrader([])
 
         graded = weighted_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.50812499999999994)
-        self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-        self.assertEqual(len(graded['grade_breakdown']), 3)
+        assert round(graded['percent'] - 0.5081249999999999, 7) >= 0
+        assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+        assert len(graded['grade_breakdown']) == 3
 
         graded = over_one_weights_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.76624999999999999)
-        self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-        self.assertEqual(len(graded['grade_breakdown']), 3)
+        assert round(graded['percent'] - 0.76625, 7) >= 0
+        assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+        assert len(graded['grade_breakdown']) == 3
 
         graded = zero_weights_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.25)
-        self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-        self.assertEqual(len(graded['grade_breakdown']), 3)
+        assert round(graded['percent'] - 0.25, 7) >= 0
+        assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+        assert len(graded['grade_breakdown']) == 3
 
         graded = all_zero_weights_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.0)
-        self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-        self.assertEqual(len(graded['grade_breakdown']), 3)
+        assert round(graded['percent'] - 0.0, 7) >= 0
+        assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+        assert len(graded['grade_breakdown']) == 3
 
         for graded in [
                 weighted_grader.grade(self.empty_gradesheet),
@@ -243,14 +222,14 @@ class GraderTest(unittest.TestCase):
                 zero_weights_grader.grade(self.empty_gradesheet),
                 all_zero_weights_grader.grade(self.empty_gradesheet),
         ]:
-            self.assertAlmostEqual(graded['percent'], 0.0)
-            self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-            self.assertEqual(len(graded['grade_breakdown']), 3)
+            assert round(graded['percent'] - 0.0, 7) >= 0
+            assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+            assert len(graded['grade_breakdown']) == 3
 
         graded = empty_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.0)
-        self.assertEqual(len(graded['section_breakdown']), 0)
-        self.assertEqual(len(graded['grade_breakdown']), 0)
+        assert round(graded['percent'] - 0.0, 7) >= 0
+        assert len(graded['section_breakdown']) == 0
+        assert len(graded['grade_breakdown']) == 0
 
     def test_grade_with_string_min_count(self):
         """
@@ -282,9 +261,9 @@ class GraderTest(unittest.TestCase):
         ])
 
         graded = weighted_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.50812499999999994)
-        self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-        self.assertEqual(len(graded['grade_breakdown']), 3)
+        assert round(graded['percent'] - 0.50812499999999994, 7) >= 0
+        assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+        assert len(graded['grade_breakdown']) == 3
 
     def test_grader_from_conf(self):
 
@@ -319,22 +298,22 @@ class GraderTest(unittest.TestCase):
         empty_grader = graders.grader_from_conf([])
 
         graded = weighted_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.50812499999999994)
-        self.assertEqual(len(graded['section_breakdown']), (12 + 1) + (7 + 1) + 1)
-        self.assertEqual(len(graded['grade_breakdown']), 3)
+        assert round(graded['percent'] - 0.5081249999999999, 7) >= 0
+        assert len(graded['section_breakdown']) == (((12 + 1) + (7 + 1)) + 1)
+        assert len(graded['grade_breakdown']) == 3
 
         graded = empty_grader.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.0)
-        self.assertEqual(len(graded['section_breakdown']), 0)
-        self.assertEqual(len(graded['grade_breakdown']), 0)
+        assert round(graded['percent'] - 0.0, 7) >= 0
+        assert len(graded['section_breakdown']) == 0
+        assert len(graded['grade_breakdown']) == 0
 
         # Test that graders can also be used instead of lists of dictionaries
         homework_grader = graders.AssignmentFormatGrader("Homework", 12, 2)
         homework_grader2 = graders.grader_from_conf(homework_grader)
 
         graded = homework_grader2.grade(self.test_gradesheet)
-        self.assertAlmostEqual(graded['percent'], 0.11)
-        self.assertEqual(len(graded['section_breakdown']), 12 + 1)
+        assert round(graded['percent'] - 0.11, 7) >= 0
+        assert len(graded['section_breakdown']) == (12 + 1)
 
     @ddt.data(
         (
@@ -356,9 +335,9 @@ class GraderTest(unittest.TestCase):
     )
     @ddt.unpack
     def test_grader_with_invalid_conf(self, invalid_conf, expected_error_message):
-        with self.assertRaises(ValueError) as error:
+        with pytest.raises(ValueError) as error:
             graders.grader_from_conf([invalid_conf])
-        self.assertIn(expected_error_message, text_type(error.exception))
+        assert expected_error_message in text_type(error.exception)
 
 
 @ddt.ddt
@@ -380,7 +359,7 @@ class ShowCorrectnessTest(unittest.TestCase):
         """
         Test that correctness is visible by default.
         """
-        self.assertTrue(ShowCorrectness.correctness_available())
+        assert ShowCorrectness.correctness_available()
 
     @ddt.data(
         (ShowCorrectness.ALWAYS, True),
@@ -396,20 +375,16 @@ class ShowCorrectnessTest(unittest.TestCase):
         """
         Test that correctness is visible when show_correctness is turned on.
         """
-        self.assertTrue(ShowCorrectness.correctness_available(
-            show_correctness=show_correctness,
-            has_staff_access=has_staff_access
-        ))
+        assert ShowCorrectness.correctness_available(show_correctness=show_correctness,
+                                                     has_staff_access=has_staff_access)
 
     @ddt.data(True, False)
     def test_show_correctness_never(self, has_staff_access):
         """
         Test that show_correctness="never" hides correctness from learners and course staff.
         """
-        self.assertFalse(ShowCorrectness.correctness_available(
-            show_correctness=ShowCorrectness.NEVER,
-            has_staff_access=has_staff_access
-        ))
+        assert not ShowCorrectness.correctness_available(show_correctness=ShowCorrectness.NEVER,
+                                                         has_staff_access=has_staff_access)
 
     @ddt.data(
         # Correctness not visible to learners if due date in the future
@@ -439,7 +414,5 @@ class ShowCorrectnessTest(unittest.TestCase):
             due_date = None
         else:
             due_date = getattr(self, due_date_str)
-        self.assertEqual(
-            ShowCorrectness.correctness_available(ShowCorrectness.PAST_DUE, due_date, has_staff_access),
-            expected_result
-        )
+        assert ShowCorrectness.correctness_available(ShowCorrectness.PAST_DUE, due_date, has_staff_access) ==\
+               expected_result
diff --git a/common/lib/xmodule/xmodule/tests/test_html_module.py b/common/lib/xmodule/xmodule/tests/test_html_module.py
index 4b539ff2b9590e08d468b1c3f036ac32c5d03d3b..28123b712bccbc49e196120ba21bcfed67e6a1c7 100644
--- a/common/lib/xmodule/xmodule/tests/test_html_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_html_module.py
@@ -50,10 +50,8 @@ class HtmlBlockCourseApiTestCase(unittest.TestCase):
         module = HtmlBlock(module_system, field_data, Mock())
 
         with override_settings(**settings):
-            self.assertEqual(module.student_view_data(), dict(
-                enabled=False,
-                message='To enable, set FEATURES["ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA"]',
-            ))
+            assert module.student_view_data() ==\
+                   dict(enabled=False, message='To enable, set FEATURES["ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA"]')
 
     @ddt.data(
         '<h1>Some content</h1>',  # Valid HTML
@@ -78,7 +76,7 @@ class HtmlBlockCourseApiTestCase(unittest.TestCase):
         field_data = DictFieldData({'data': html})
         module_system = get_test_system()
         module = HtmlBlock(module_system, field_data, Mock())
-        self.assertEqual(module.student_view_data(), dict(enabled=True, html=html))
+        assert module.student_view_data() == dict(enabled=True, html=html)
 
     @ddt.data(
         STUDENT_VIEW,
@@ -93,7 +91,7 @@ class HtmlBlockCourseApiTestCase(unittest.TestCase):
         module_system = get_test_system()
         module = HtmlBlock(module_system, field_data, Mock())
         rendered = module_system.render(module, view, {}).content
-        self.assertIn(html, rendered)
+        assert html in rendered
 
 
 class HtmlBlockSubstitutionTestCase(unittest.TestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -103,7 +101,7 @@ class HtmlBlockSubstitutionTestCase(unittest.TestCase):  # lint-amnesty, pylint:
         field_data = DictFieldData({'data': sample_xml})
         module_system = get_test_system()
         module = HtmlBlock(module_system, field_data, Mock())
-        self.assertEqual(module.get_html(), str(module_system.anonymous_student_id))
+        assert module.get_html() == str(module_system.anonymous_student_id)
 
     def test_substitution_course_id(self):
         sample_xml = '''%%COURSE_ID%%'''
@@ -121,7 +119,7 @@ class HtmlBlockSubstitutionTestCase(unittest.TestCase):  # lint-amnesty, pylint:
             block_id='block_id'
         )
         module.scope_ids.usage_id = usage_key
-        self.assertEqual(module.get_html(), str(course_key))
+        assert module.get_html() == str(course_key)
 
     def test_substitution_without_magic_string(self):
         sample_xml = '''
@@ -132,7 +130,7 @@ class HtmlBlockSubstitutionTestCase(unittest.TestCase):  # lint-amnesty, pylint:
         field_data = DictFieldData({'data': sample_xml})
         module_system = get_test_system()
         module = HtmlBlock(module_system, field_data, Mock())
-        self.assertEqual(module.get_html(), sample_xml)
+        assert module.get_html() == sample_xml
 
     def test_substitution_without_anonymous_student_id(self):
         sample_xml = '''%%USER_ID%%'''
@@ -140,7 +138,7 @@ class HtmlBlockSubstitutionTestCase(unittest.TestCase):  # lint-amnesty, pylint:
         module_system = get_test_system()
         module_system.anonymous_student_id = None
         module = HtmlBlock(module_system, field_data, Mock())
-        self.assertEqual(module.get_html(), sample_xml)
+        assert module.get_html() == sample_xml
 
 
 class HtmlBlockIndexingTestCase(unittest.TestCase):
@@ -155,10 +153,8 @@ class HtmlBlockIndexingTestCase(unittest.TestCase):
             </html>
         '''
         descriptor = instantiate_descriptor(data=sample_xml)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"html_content": " Hello World! ", "display_name": "Text"},
-            "content_type": "Text"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'html_content': ' Hello World! ', 'display_name': 'Text'}, 'content_type': 'Text'}
 
     def test_index_dictionary_cdata_html_module(self):
         sample_xml_cdata = '''
@@ -168,10 +164,8 @@ class HtmlBlockIndexingTestCase(unittest.TestCase):
             </html>
         '''
         descriptor = instantiate_descriptor(data=sample_xml_cdata)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"html_content": " This has CDATA in it. ", "display_name": "Text"},
-            "content_type": "Text"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'html_content': ' This has CDATA in it. ', 'display_name': 'Text'}, 'content_type': 'Text'}
 
     def test_index_dictionary_multiple_spaces_html_module(self):
         sample_xml_tab_spaces = '''
@@ -180,10 +174,8 @@ class HtmlBlockIndexingTestCase(unittest.TestCase):
             </html>
         '''
         descriptor = instantiate_descriptor(data=sample_xml_tab_spaces)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"html_content": " Text has spaces :) ", "display_name": "Text"},
-            "content_type": "Text"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'html_content': ' Text has spaces :) ', 'display_name': 'Text'}, 'content_type': 'Text'}
 
     def test_index_dictionary_html_module_with_comment(self):
         sample_xml_comment = '''
@@ -193,10 +185,7 @@ class HtmlBlockIndexingTestCase(unittest.TestCase):
             </html>
         '''
         descriptor = instantiate_descriptor(data=sample_xml_comment)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"html_content": " This has HTML comment in it. ", "display_name": "Text"},
-            "content_type": "Text"
-        })
+        assert descriptor.index_dictionary() == {'content': {'html_content': ' This has HTML comment in it. ', 'display_name': 'Text'}, 'content_type': 'Text'}  # pylint: disable=line-too-long
 
     def test_index_dictionary_html_module_with_both_comments_and_cdata(self):
         sample_xml_mix_comment_cdata = '''
@@ -209,10 +198,9 @@ class HtmlBlockIndexingTestCase(unittest.TestCase):
             </html>
         '''
         descriptor = instantiate_descriptor(data=sample_xml_mix_comment_cdata)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"html_content": " This has HTML comment in it. HTML end. ", "display_name": "Text"},
-            "content_type": "Text"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'html_content': ' This has HTML comment in it. HTML end. ',
+                            'display_name': 'Text'}, 'content_type': 'Text'}
 
     def test_index_dictionary_html_module_with_script_and_style_tags(self):
         sample_xml_style_script_tags = '''
@@ -229,10 +217,9 @@ class HtmlBlockIndexingTestCase(unittest.TestCase):
             </html>
         '''
         descriptor = instantiate_descriptor(data=sample_xml_style_script_tags)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"html_content": " This has HTML comment in it. HTML end. ", "display_name": "Text"},
-            "content_type": "Text"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'html_content': ' This has HTML comment in it. HTML end. ',
+                            'display_name': 'Text'}, 'content_type': 'Text'}
 
 
 class CourseInfoBlockTestCase(unittest.TestCase):
diff --git a/common/lib/xmodule/xmodule/tests/test_import.py b/common/lib/xmodule/xmodule/tests/test_import.py
index 9a3a09fc0462f3e43379695b76f8241438200fc0..a2354be1c65652c6d1550413c48f17f5f30e5dac 100644
--- a/common/lib/xmodule/xmodule/tests/test_import.py
+++ b/common/lib/xmodule/xmodule/tests/test_import.py
@@ -77,7 +77,7 @@ class BaseCourseTestCase(TestCase):
             xblock_select=only_xmodules,
         )
         courses = modulestore.get_courses()
-        self.assertEqual(len(courses), 1)
+        assert len(courses) == 1
         return courses[0]
 
 
@@ -97,8 +97,8 @@ class PureXBlockImportTest(BaseCourseTestCase):
     def assert_xblocks_are_good(self, block):
         """Assert a number of conditions that must be true for `block` to be good."""
         scope_ids = block.scope_ids
-        self.assertIsNotNone(scope_ids.usage_id)
-        self.assertIsNotNone(scope_ids.def_id)
+        assert scope_ids.usage_id is not None
+        assert scope_ids.def_id is not None
 
         for child_id in block.children:
             child = block.runtime.get_block(child_id)
@@ -114,9 +114,9 @@ class PureXBlockImportTest(BaseCourseTestCase):
     def test_parsing_pure_xblock(self, xml, mock_location):
         system = self.get_system(load_error_modules=False)
         descriptor = system.process_xml(xml)
-        self.assertIsInstance(descriptor, GenericXBlock)
+        assert isinstance(descriptor, GenericXBlock)
         self.assert_xblocks_are_good(descriptor)
-        self.assertFalse(mock_location.called)
+        assert not mock_location.called
 
 
 class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missing-class-docstring
@@ -131,7 +131,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
 
         descriptor = system.process_xml(bad_xml)
 
-        self.assertEqual(descriptor.__class__.__name__, 'ErrorBlockWithMixins')
+        assert descriptor.__class__.__name__ == 'ErrorBlockWithMixins'
 
     def test_unique_url_names(self):
         '''Check that each error gets its very own url_name'''
@@ -142,7 +142,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         descriptor1 = system.process_xml(bad_xml)
         descriptor2 = system.process_xml(bad_xml2)
 
-        self.assertNotEqual(descriptor1.location, descriptor2.location)
+        assert descriptor1.location != descriptor2.location
 
         # Check that each vertical gets its very own url_name
         bad_xml = '''<vertical display_name="abc"><problem url_name="exam1:2013_Spring:abc"/></vertical>'''
@@ -151,7 +151,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         descriptor1 = system.process_xml(bad_xml)
         descriptor2 = system.process_xml(bad_xml2)
 
-        self.assertNotEqual(descriptor1.location, descriptor2.location)
+        assert descriptor1.location != descriptor2.location
 
     def test_reimport(self):
         '''Make sure an already-exported error xml tag loads properly'''
@@ -165,10 +165,10 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         descriptor.add_xml_to_node(node)
         re_import_descriptor = system.process_xml(etree.tostring(node))
 
-        self.assertEqual(re_import_descriptor.__class__.__name__, 'ErrorBlockWithMixins')
+        assert re_import_descriptor.__class__.__name__ == 'ErrorBlockWithMixins'
 
-        self.assertEqual(descriptor.contents, re_import_descriptor.contents)
-        self.assertEqual(descriptor.error_msg, re_import_descriptor.error_msg)
+        assert descriptor.contents == re_import_descriptor.contents
+        assert descriptor.error_msg == re_import_descriptor.error_msg
 
     def test_fixed_xml_tag(self):
         """Make sure a tag that's been fixed exports as the original tag type"""
@@ -189,7 +189,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         descriptor.add_xml_to_node(node)
 
         # Now make sure the exported xml is a sequential
-        self.assertEqual(node.tag, 'sequential')
+        assert node.tag == 'sequential'
 
     def course_descriptor_inheritance_check(self, descriptor, from_date_string, unicorn_color, course_run=RUN):
         """
@@ -197,16 +197,14 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         """
         # pylint: disable=protected-access
         print((descriptor, descriptor._field_data))
-        self.assertEqual(descriptor.due, ImportTestCase.date.from_json(from_date_string))
+        assert descriptor.due == ImportTestCase.date.from_json(from_date_string)
 
         # Check that the child inherits due correctly
         child = descriptor.get_children()[0]
-        self.assertEqual(child.due, ImportTestCase.date.from_json(from_date_string))
+        assert child.due == ImportTestCase.date.from_json(from_date_string)
         # need to convert v to canonical json b4 comparing
-        self.assertEqual(
-            ImportTestCase.date.to_json(ImportTestCase.date.from_json(from_date_string)),
-            child.xblock_kvs.inherited_settings['due']
-        )
+        assert ImportTestCase.date.to_json(ImportTestCase.date.from_json(from_date_string)) ==\
+               child.xblock_kvs.inherited_settings['due']
 
         # Now export and check things
         file_system = OSFS(mkdtemp())
@@ -216,30 +214,30 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
 
         # Check that the exported xml is just a pointer
         print(("Exported xml:", etree.tostring(node)))
-        self.assertTrue(is_pointer_tag(node))
+        assert is_pointer_tag(node)
         # but it's a special case course pointer
-        self.assertEqual(node.attrib['course'], COURSE)
-        self.assertEqual(node.attrib['org'], ORG)
+        assert node.attrib['course'] == COURSE
+        assert node.attrib['org'] == ORG
 
         # Does the course still have unicorns?
         with descriptor.runtime.export_fs.open(u'course/{course_run}.xml'.format(course_run=course_run)) as f:
             course_xml = etree.fromstring(f.read())
 
-        self.assertEqual(course_xml.attrib['unicorn'], unicorn_color)
+        assert course_xml.attrib['unicorn'] == unicorn_color
 
         # the course and org tags should be _only_ in the pointer
-        self.assertNotIn('course', course_xml.attrib)
-        self.assertNotIn('org', course_xml.attrib)
+        assert 'course' not in course_xml.attrib
+        assert 'org' not in course_xml.attrib
 
         # did we successfully strip the url_name from the definition contents?
-        self.assertNotIn('url_name', course_xml.attrib)
+        assert 'url_name' not in course_xml.attrib
 
         # Does the chapter tag now have a due attribute?
         # hardcoded path to child
         with descriptor.runtime.export_fs.open(u'chapter/ch.xml') as f:
             chapter_xml = etree.fromstring(f.read())
-        self.assertEqual(chapter_xml.tag, 'chapter')
-        self.assertNotIn('due', chapter_xml.attrib)
+        assert chapter_xml.tag == 'chapter'
+        assert 'due' not in chapter_xml.attrib
 
     def test_metadata_import_export(self):
         """Two checks:
@@ -290,7 +288,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         LibraryXMLModuleStore.patch_descriptor_kvs(descriptor)
         # '_unwrapped_field_data' is reset in `patch_descriptor_kvs`
         # pylint: disable=protected-access
-        self.assertIsNot(original_unwrapped, descriptor._unwrapped_field_data)
+        assert original_unwrapped is not descriptor._unwrapped_field_data
         compute_inherited_metadata(descriptor)
         # Check the course module, since it has inheritance
         descriptor = descriptor.get_children()[0]
@@ -341,29 +339,23 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         """
         Verifies that a default value of None (for due) does not get marked as inherited.
         """
-        self.assertEqual(descriptor.due, None)
+        assert descriptor.due is None
 
         # Check that the child does not inherit a value for due
         child = descriptor.get_children()[0]
-        self.assertEqual(child.due, None)
+        assert child.due is None
 
         # Check that the child hasn't started yet
-        self.assertLessEqual(
-            datetime.datetime.now(UTC),
-            child.start
-        )
+        assert datetime.datetime.now(UTC) <= child.start
 
     def override_metadata_check(self, descriptor, child, course_due, child_due):
         """
         Verifies that due date can be overriden at child level.
         """
-        self.assertEqual(descriptor.due, ImportTestCase.date.from_json(course_due))
-        self.assertEqual(child.due, ImportTestCase.date.from_json(child_due))
+        assert descriptor.due == ImportTestCase.date.from_json(course_due)
+        assert child.due == ImportTestCase.date.from_json(child_due)
         # Test inherited metadata. Due does not appear here (because explicitly set on child).
-        self.assertEqual(
-            ImportTestCase.date.to_json(ImportTestCase.date.from_json(course_due)),
-            child.xblock_kvs.inherited_settings['due']
-        )
+        assert ImportTestCase.date.to_json(ImportTestCase.date.from_json(course_due)) == child.xblock_kvs.inherited_settings['due']  # pylint: disable=line-too-long
 
     def test_metadata_override_default(self):
         """
@@ -435,11 +427,11 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
 
         for xml_str in yes:
             print("should be True for {0}".format(xml_str))
-            self.assertTrue(is_pointer_tag(etree.fromstring(xml_str)))
+            assert is_pointer_tag(etree.fromstring(xml_str))
 
         for xml_str in no:
             print("should be False for {0}".format(xml_str))
-            self.assertFalse(is_pointer_tag(etree.fromstring(xml_str)))
+            assert not is_pointer_tag(etree.fromstring(xml_str))
 
     def test_metadata_inherit(self):
         """Make sure that metadata is inherited properly"""
@@ -450,7 +442,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         def check_for_key(key, node, value):
             "recursive check for presence of key"
             print("Checking {0}".format(text_type(node.location)))
-            self.assertEqual(getattr(node, key), value)
+            assert getattr(node, key) == value
             for c in node.get_children():
                 check_for_key(key, c, value)
 
@@ -463,21 +455,21 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         toy = self.get_course('toy')
         two_toys = self.get_course('two_toys')
 
-        self.assertEqual(toy.url_name, "2012_Fall")
-        self.assertEqual(two_toys.url_name, "TT_2012_Fall")
+        assert toy.url_name == '2012_Fall'
+        assert two_toys.url_name == 'TT_2012_Fall'
 
         toy_ch = toy.get_children()[0]
         two_toys_ch = two_toys.get_children()[0]
 
-        self.assertEqual(toy_ch.display_name, "Overview")
-        self.assertEqual(two_toys_ch.display_name, "Two Toy Overview")
+        assert toy_ch.display_name == 'Overview'
+        assert two_toys_ch.display_name == 'Two Toy Overview'
 
         # Also check that the grading policy loaded
-        self.assertEqual(two_toys.grade_cutoffs['C'], 0.5999)
+        assert two_toys.grade_cutoffs['C'] == 0.5999
 
         # Also check that keys from policy are run through the
         # appropriate attribute maps -- 'graded' should be True, not 'true'
-        self.assertEqual(toy.graded, True)
+        assert toy.graded is True
 
     def test_static_tabs_import(self):
         """Make sure that the static tabs are imported correctly"""
@@ -487,14 +479,14 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         location_tab_syllabus = BlockUsageLocator(CourseLocator("edX", "toy", "2012_Fall", deprecated=True),
                                                   "static_tab", "syllabus", deprecated=True)
         toy_tab_syllabus = modulestore.get_item(location_tab_syllabus)
-        self.assertEqual(toy_tab_syllabus.display_name, 'Syllabus')
-        self.assertEqual(toy_tab_syllabus.course_staff_only, False)
+        assert toy_tab_syllabus.display_name == 'Syllabus'
+        assert toy_tab_syllabus.course_staff_only is False
 
         location_tab_resources = BlockUsageLocator(CourseLocator("edX", "toy", "2012_Fall", deprecated=True),
                                                    "static_tab", "resources", deprecated=True)
         toy_tab_resources = modulestore.get_item(location_tab_resources)
-        self.assertEqual(toy_tab_resources.display_name, 'Resources')
-        self.assertEqual(toy_tab_resources.course_staff_only, True)
+        assert toy_tab_resources.display_name == 'Resources'
+        assert toy_tab_resources.course_staff_only is True
 
     def test_definition_loading(self):
         """When two courses share the same org and course name and
@@ -512,8 +504,8 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         location_two = BlockUsageLocator(CourseLocator("edX", "toy", "TT_2012_Fall", deprecated=True),
                                          "video", "Welcome", deprecated=True)
         two_toy_video = modulestore.get_item(location_two)
-        self.assertEqual(toy_video.youtube_id_1_0, "p2Q6BrNhdh8")
-        self.assertEqual(two_toy_video.youtube_id_1_0, "p2Q6BrNhdh9")
+        assert toy_video.youtube_id_1_0 == 'p2Q6BrNhdh8'
+        assert two_toy_video.youtube_id_1_0 == 'p2Q6BrNhdh9'
 
     def test_colon_in_url_name(self):
         """Ensure that colons in url_names convert to file paths properly"""
@@ -522,7 +514,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         # Not using get_courses because we need the modulestore object too afterward
         modulestore = XMLModuleStore(DATA_DIR, source_dirs=['toy'])
         courses = modulestore.get_courses()
-        self.assertEqual(len(courses), 1)
+        assert len(courses) == 1
         course = courses[0]
 
         print("course errors:")
@@ -531,20 +523,20 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
             print(err)
 
         chapters = course.get_children()
-        self.assertEqual(len(chapters), 5)
+        assert len(chapters) == 5
 
         ch2 = chapters[1]
-        self.assertEqual(ch2.url_name, "secret:magic")
+        assert ch2.url_name == 'secret:magic'
 
         print("Ch2 location: ", ch2.location)
 
         also_ch2 = modulestore.get_item(ch2.location)
-        self.assertEqual(ch2, also_ch2)
+        assert ch2 == also_ch2
 
         print("making sure html loaded")
         loc = course.id.make_usage_key('html', 'secret:toylab')
         html = modulestore.get_item(loc)
-        self.assertEqual(html.display_name, "Toy lab")
+        assert html.display_name == 'Toy lab'
 
     def test_unicode(self):
         """Check that courses with unicode characters in filenames and in
@@ -556,7 +548,7 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         print("Starting import")
         modulestore = XMLModuleStore(DATA_DIR, source_dirs=['test_unicode'])
         courses = modulestore.get_courses()
-        self.assertEqual(len(courses), 1)
+        assert len(courses) == 1
         course = courses[0]
 
         print("course errors:")
@@ -569,12 +561,9 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
             in modulestore.get_course_errors(course.id)
         ]
 
-        self.assertTrue(any(
-            expect in msg or expect in err
-            for msg, err in errors
-        ))
+        assert any((((expect in msg) or (expect in err)) for (msg, err) in errors))
         chapters = course.get_children()
-        self.assertEqual(len(chapters), 4)
+        assert len(chapters) == 4
 
     def test_url_name_mangling(self):
         """
@@ -590,13 +579,13 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         ch1 = chapters[0]
         sections = ch1.get_children()
 
-        self.assertEqual(len(sections), 4)
+        assert len(sections) == 4
 
         for i in (2, 3):
             video = sections[i]
             # Name should be 'video_{hash}'
             print("video {0} url_name: {1}".format(i, video.url_name))
-            self.assertEqual(len(video.url_name), len('video_') + 12)
+            assert len(video.url_name) == (len('video_') + 12)
 
     def test_poll_and_conditional_import(self):
         modulestore = XMLModuleStore(DATA_DIR, source_dirs=['conditional_and_poll'])
@@ -606,26 +595,20 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         ch1 = chapters[0]
         sections = ch1.get_children()
 
-        self.assertEqual(len(sections), 1)
+        assert len(sections) == 1
 
         conditional_location = course.id.make_usage_key('conditional', 'condone')
         module = modulestore.get_item(conditional_location)
-        self.assertEqual(len(module.children), 1)
+        assert len(module.children) == 1
 
         poll_location = course.id.make_usage_key('poll_question', 'first_poll')
         module = modulestore.get_item(poll_location)
-        self.assertEqual(len(module.get_children()), 0)
-        self.assertEqual(module.voted, False)
-        self.assertEqual(module.poll_answer, '')
-        self.assertEqual(module.poll_answers, {})
-        self.assertEqual(
-            module.answers,
-            [
-                {'text': u'Yes', 'id': 'Yes'},
-                {'text': u'No', 'id': 'No'},
-                {'text': u"Don't know", 'id': 'Dont_know'}
-            ]
-        )
+        assert len(module.get_children()) == 0
+        assert module.voted is False
+        assert module.poll_answer == ''
+        assert module.poll_answers == {}
+        assert module.answers ==\
+               [{'text': u'Yes', 'id': 'Yes'}, {'text': u'No', 'id': 'No'}, {'text': u"Don't know", 'id': 'Dont_know'}]
 
     def test_error_on_import(self):
         '''Check that when load_error_module is false, an exception is raised, rather than returning an ErrorBlock'''
@@ -643,13 +626,13 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         ch1 = chapters[0]
         sections = ch1.get_children()
 
-        self.assertEqual(len(sections), 1)
+        assert len(sections) == 1
 
         location = course.id.make_usage_key('word_cloud', 'cloud1')
         module = modulestore.get_item(location)
-        self.assertEqual(len(module.get_children()), 0)
-        self.assertEqual(module.num_inputs, 5)
-        self.assertEqual(module.num_top_words, 250)
+        assert len(module.get_children()) == 0
+        assert module.num_inputs == 5
+        assert module.num_top_words == 250
 
     def test_cohort_config(self):
         """
@@ -665,16 +648,16 @@ class ImportTestCase(BaseCourseTestCase):  # lint-amnesty, pylint: disable=missi
         course = modulestore.get_course(toy_id)
 
         # No config -> False
-        self.assertFalse(course.is_cohorted)
+        assert not course.is_cohorted
 
         # empty config -> False
         course.cohort_config = {}
-        self.assertFalse(course.is_cohorted)
+        assert not course.is_cohorted
 
         # false config -> False
         course.cohort_config = {'cohorted': False}
-        self.assertFalse(course.is_cohorted)
+        assert not course.is_cohorted
 
         # and finally...
         course.cohort_config = {'cohorted': True}
-        self.assertTrue(course.is_cohorted)
+        assert course.is_cohorted
diff --git a/common/lib/xmodule/xmodule/tests/test_import_static.py b/common/lib/xmodule/xmodule/tests/test_import_static.py
index ef06cacfaa563db5bb9235b043d4b8fd69f780c9..aa65bdb7602ed8bea86af2b0a163f176fd068271 100644
--- a/common/lib/xmodule/xmodule/tests/test_import_static.py
+++ b/common/lib/xmodule/xmodule/tests/test_import_static.py
@@ -47,10 +47,10 @@ class IgnoredFilesTestCase(unittest.TestCase):
         static_content_importer.import_static_content_directory()
         saved_static_content = [call[0][0] for call in content_store.save.call_args_list]
         name_val = {sc.name: sc.data for sc in saved_static_content}
-        self.assertIn("example.txt", name_val)
-        self.assertIn(".example.txt", name_val)
-        self.assertIn(b"GREEN", name_val["example.txt"])
-        self.assertIn(b"BLUE", name_val[".example.txt"])
-        self.assertNotIn("._example.txt", name_val)
-        self.assertNotIn(".DS_Store", name_val)
-        self.assertNotIn("example.txt~", name_val)
+        assert 'example.txt' in name_val
+        assert '.example.txt' in name_val
+        assert b'GREEN' in name_val['example.txt']
+        assert b'BLUE' in name_val['.example.txt']
+        assert '._example.txt' not in name_val
+        assert '.DS_Store' not in name_val
+        assert 'example.txt~' not in name_val
diff --git a/common/lib/xmodule/xmodule/tests/test_library_content.py b/common/lib/xmodule/xmodule/tests/test_library_content.py
index cabc1c1a12594b1171cbbf4ff0ae616b943d0da6..b4b753106051d3e05a0cf589d6f3fb437f7f95b4 100644
--- a/common/lib/xmodule/xmodule/tests/test_library_content.py
+++ b/common/lib/xmodule/xmodule/tests/test_library_content.py
@@ -117,7 +117,7 @@ class TestLibraryContentExportImport(LibraryContentTest):
             exported_olx = f.read()
 
         # And compare.
-        self.assertEqual(exported_olx, expected_olx)
+        assert exported_olx == expected_olx
 
         runtime = TestImportSystem(load_error_modules=True, course_id=lc_block.location.course_key)
         runtime.resources_fs = export_fs
@@ -128,14 +128,14 @@ class TestLibraryContentExportImport(LibraryContentTest):
         imported_lc_block = LibraryContentBlock.parse_xml(olx_element, runtime, None, id_generator)
 
         # Check the new XBlock has the same properties as the old one.
-        self.assertEqual(imported_lc_block.display_name, lc_block.display_name)
-        self.assertEqual(imported_lc_block.source_library_id, lc_block.source_library_id)
-        self.assertEqual(imported_lc_block.source_library_version, lc_block.source_library_version)
-        self.assertEqual(imported_lc_block.mode, lc_block.mode)
-        self.assertEqual(imported_lc_block.max_count, lc_block.max_count)
-        self.assertEqual(imported_lc_block.capa_type, lc_block.capa_type)
-        self.assertEqual(len(imported_lc_block.children), 4)
-        self.assertEqual(imported_lc_block.children, lc_block.children)
+        assert imported_lc_block.display_name == lc_block.display_name
+        assert imported_lc_block.source_library_id == lc_block.source_library_id
+        assert imported_lc_block.source_library_version == lc_block.source_library_version
+        assert imported_lc_block.mode == lc_block.mode
+        assert imported_lc_block.max_count == lc_block.max_count
+        assert imported_lc_block.capa_type == lc_block.capa_type
+        assert len(imported_lc_block.children) == 4
+        assert imported_lc_block.children == lc_block.children
 
 
 class LibraryContentBlockTestMixin(object):
@@ -175,12 +175,12 @@ class LibraryContentBlockTestMixin(object):
         # Check that the LibraryContent block has no children initially
         # Normally the children get added when the "source_libraries" setting
         # is updated, but the way we do it through a factory doesn't do that.
-        self.assertEqual(len(self.lc_block.children), 0)
+        assert len(self.lc_block.children) == 0
         # Update the LibraryContent module:
         self.lc_block.refresh_children()
         self.lc_block = self.store.get_item(self.lc_block.location)
         # Check that all blocks from the library are now children of the block:
-        self.assertEqual(len(self.lc_block.children), len(self.lib_blocks))
+        assert len(self.lc_block.children) == len(self.lib_blocks)
 
     def test_children_seen_by_a_user(self):
         """
@@ -190,14 +190,14 @@ class LibraryContentBlockTestMixin(object):
         self.lc_block = self.store.get_item(self.lc_block.location)
         self._bind_course_module(self.lc_block)
         # Make sure the runtime knows that the block's children vary per-user:
-        self.assertTrue(self.lc_block.has_dynamic_children())
+        assert self.lc_block.has_dynamic_children()
 
-        self.assertEqual(len(self.lc_block.children), len(self.lib_blocks))
+        assert len(self.lc_block.children) == len(self.lib_blocks)
 
         # Check how many children each user will see:
-        self.assertEqual(len(self.lc_block.get_child_descriptors()), 1)
+        assert len(self.lc_block.get_child_descriptors()) == 1
         # Check that get_content_titles() doesn't return titles for hidden/unused children
-        self.assertEqual(len(self.lc_block.get_content_titles()), 1)
+        assert len(self.lc_block.get_content_titles()) == 1
 
     def test_validation_of_course_libraries(self):
         """
@@ -207,29 +207,32 @@ class LibraryContentBlockTestMixin(object):
         # When source_library_id is blank, the validation summary should say this block needs to be configured:
         self.lc_block.source_library_id = ""
         result = self.lc_block.validate()
-        self.assertFalse(result)  # Validation fails due to at least one warning/message
-        self.assertTrue(result.summary)
-        self.assertEqual(StudioValidationMessage.NOT_CONFIGURED, result.summary.type)
+        assert not result
+        # Validation fails due to at least one warning/message
+        assert result.summary
+        assert StudioValidationMessage.NOT_CONFIGURED == result.summary.type
 
         # When source_library_id references a non-existent library, we should get an error:
         self.lc_block.source_library_id = "library-v1:BAD+WOLF"
         result = self.lc_block.validate()
-        self.assertFalse(result)  # Validation fails due to at least one warning/message
-        self.assertTrue(result.summary)
-        self.assertEqual(StudioValidationMessage.ERROR, result.summary.type)
-        self.assertIn("invalid", result.summary.text)
+        assert not result
+        # Validation fails due to at least one warning/message
+        assert result.summary
+        assert StudioValidationMessage.ERROR == result.summary.type
+        assert 'invalid' in result.summary.text
 
         # When source_library_id is set but the block needs to be updated, the summary should say so:
         self.lc_block.source_library_id = six.text_type(self.library.location.library_key)
         result = self.lc_block.validate()
-        self.assertFalse(result)  # Validation fails due to at least one warning/message
-        self.assertTrue(result.summary)
-        self.assertEqual(StudioValidationMessage.WARNING, result.summary.type)
-        self.assertIn("out of date", result.summary.text)
+        assert not result
+        # Validation fails due to at least one warning/message
+        assert result.summary
+        assert StudioValidationMessage.WARNING == result.summary.type
+        assert 'out of date' in result.summary.text
 
         # Now if we update the block, all validation should pass:
         self.lc_block.refresh_children()
-        self.assertTrue(self.lc_block.validate())
+        assert self.lc_block.validate()
 
     def test_validation_of_matching_blocks(self):
         """
@@ -241,76 +244,80 @@ class LibraryContentBlockTestMixin(object):
         # In the normal studio editing process, editor_saved() calls refresh_children at this point
         self.lc_block.refresh_children()
         result = self.lc_block.validate()
-        self.assertFalse(result)  # Validation fails due to at least one warning/message
-        self.assertTrue(result.summary)
-        self.assertEqual(StudioValidationMessage.WARNING, result.summary.type)
-        self.assertIn("only 4 matching problems", result.summary.text)
+        assert not result
+        # Validation fails due to at least one warning/message
+        assert result.summary
+        assert StudioValidationMessage.WARNING == result.summary.type
+        assert 'only 4 matching problems' in result.summary.text
 
         # Add some capa problems so we can check problem type validation messages
         self.lc_block.max_count = 1
         self._create_capa_problems()
         self.lc_block.refresh_children()
-        self.assertTrue(self.lc_block.validate())
+        assert self.lc_block.validate()
 
         # Existing problem type should pass validation
         self.lc_block.max_count = 1
         self.lc_block.capa_type = 'multiplechoiceresponse'
         self.lc_block.refresh_children()
-        self.assertTrue(self.lc_block.validate())
+        assert self.lc_block.validate()
 
         # ... unless requested more blocks than exists in library
         self.lc_block.max_count = 10
         self.lc_block.capa_type = 'multiplechoiceresponse'
         self.lc_block.refresh_children()
         result = self.lc_block.validate()
-        self.assertFalse(result)  # Validation fails due to at least one warning/message
-        self.assertTrue(result.summary)
-        self.assertEqual(StudioValidationMessage.WARNING, result.summary.type)
-        self.assertIn("only 1 matching problem", result.summary.text)
+        assert not result
+        # Validation fails due to at least one warning/message
+        assert result.summary
+        assert StudioValidationMessage.WARNING == result.summary.type
+        assert 'only 1 matching problem' in result.summary.text
 
         # Missing problem type should always fail validation
         self.lc_block.max_count = 1
         self.lc_block.capa_type = 'customresponse'
         self.lc_block.refresh_children()
         result = self.lc_block.validate()
-        self.assertFalse(result)  # Validation fails due to at least one warning/message
-        self.assertTrue(result.summary)
-        self.assertEqual(StudioValidationMessage.WARNING, result.summary.type)
-        self.assertIn("no matching problem types", result.summary.text)
+        assert not result
+        # Validation fails due to at least one warning/message
+        assert result.summary
+        assert StudioValidationMessage.WARNING == result.summary.type
+        assert 'no matching problem types' in result.summary.text
 
     def test_capa_type_filtering(self):
         """
         Test that the capa type filter is actually filtering children
         """
         self._create_capa_problems()
-        self.assertEqual(len(self.lc_block.children), 0)  # precondition check
+        assert len(self.lc_block.children) == 0
+        # precondition check
         self.lc_block.capa_type = "multiplechoiceresponse"
         self.lc_block.refresh_children()
-        self.assertEqual(len(self.lc_block.children), 1)
+        assert len(self.lc_block.children) == 1
 
         self.lc_block.capa_type = "optionresponse"
         self.lc_block.refresh_children()
-        self.assertEqual(len(self.lc_block.children), 3)
+        assert len(self.lc_block.children) == 3
 
         self.lc_block.capa_type = "coderesponse"
         self.lc_block.refresh_children()
-        self.assertEqual(len(self.lc_block.children), 2)
+        assert len(self.lc_block.children) == 2
 
         self.lc_block.capa_type = "customresponse"
         self.lc_block.refresh_children()
-        self.assertEqual(len(self.lc_block.children), 0)
+        assert len(self.lc_block.children) == 0
 
         self.lc_block.capa_type = ANY_CAPA_TYPE_VALUE
         self.lc_block.refresh_children()
-        self.assertEqual(len(self.lc_block.children), len(self.lib_blocks) + 4)
+        assert len(self.lc_block.children) == (len(self.lib_blocks) + 4)
 
     def test_non_editable_settings(self):
         """
         Test the settings that are marked as "non-editable".
         """
         non_editable_metadata_fields = self.lc_block.non_editable_metadata_fields
-        self.assertIn(LibraryContentBlock.mode, non_editable_metadata_fields)
-        self.assertNotIn(LibraryContentBlock.display_name, non_editable_metadata_fields)
+        assert LibraryContentBlock.mode in non_editable_metadata_fields
+        assert LibraryContentBlock.display_name not in non_editable_metadata_fields
 
     def test_overlimit_blocks_chosen_randomly(self):
         """
@@ -342,7 +349,7 @@ class LibraryContentBlockTestMixin(object):
         """
         self.lc_block.max_count = count
         selected = self.lc_block.get_child_descriptors()
-        self.assertEqual(len(selected), count)
+        assert len(selected) == count
         return selected
 
 
@@ -396,20 +403,22 @@ class TestLibraryContentRender(LibraryContentTest):
         """ Test preview view rendering """
         self.lc_block.refresh_children()
         self.lc_block = self.store.get_item(self.lc_block.location)
-        self.assertEqual(len(self.lc_block.children), len(self.lib_blocks))
+        assert len(self.lc_block.children) == len(self.lib_blocks)
         self._bind_course_module(self.lc_block)
         rendered = self.lc_block.render(AUTHOR_VIEW, {'root_xblock': self.lc_block})
-        self.assertIn("Hello world from block 1", rendered.content)
+        assert 'Hello world from block 1' in rendered.content
 
     def test_author_view(self):
         """ Test author view rendering """
         self.lc_block.refresh_children()
         self.lc_block = self.store.get_item(self.lc_block.location)
-        self.assertEqual(len(self.lc_block.children), len(self.lib_blocks))
+        assert len(self.lc_block.children) == len(self.lib_blocks)
         self._bind_course_module(self.lc_block)
         rendered = self.lc_block.render(AUTHOR_VIEW, {})
-        self.assertEqual("", rendered.content)  # content should be empty
-        self.assertEqual("LibraryContentAuthorView", rendered.js_init_fn)  # but some js initialization should happen
+        assert '' == rendered.content
+        # content should be empty
+        assert 'LibraryContentAuthorView' == rendered.js_init_fn
+        # but some js initialization should happen
 
 
 class TestLibraryContentAnalytics(LibraryContentTest):
@@ -429,11 +438,11 @@ class TestLibraryContentAnalytics(LibraryContentTest):
         """
         Check that a LibraryContentBlock analytics event was published by self.lc_block.
         """
-        self.assertTrue(self.publisher.called)
-        self.assertTrue(len(self.publisher.call_args[0]), 3)  # pylint:disable=unsubscriptable-object
+        assert self.publisher.called
+        assert len(self.publisher.call_args[0]) == 3  # pylint:disable=unsubscriptable-object
         _, event_name, event_data = self.publisher.call_args[0]  # pylint:disable=unsubscriptable-object
-        self.assertEqual(event_name, "edx.librarycontentblock.content.{}".format(event_type))
-        self.assertEqual(event_data["location"], six.text_type(self.lc_block.location))
+        assert event_name == 'edx.librarycontentblock.content.{}'.format(event_type)
+        assert event_data['location'] == six.text_type(self.lc_block.location)
         return event_data
 
     def test_assigned_event(self):
@@ -443,7 +452,7 @@ class TestLibraryContentAnalytics(LibraryContentTest):
         # In the beginning was the lc_block and it assigned one child to the student:
         child = self.lc_block.get_child_descriptors()[0]
         child_lib_location, child_lib_version = self.store.get_block_original_usage(child.location)
-        self.assertIsInstance(child_lib_version, ObjectId)
+        assert isinstance(child_lib_version, ObjectId)
         event_data = self._assert_event_was_published("assigned")
         block_info = {
             "usage_key": six.text_type(child.location),
@@ -451,25 +460,23 @@ class TestLibraryContentAnalytics(LibraryContentTest):
             "original_usage_version": six.text_type(child_lib_version),
             "descendants": [],
         }
-        self.assertEqual(event_data, {
-            "location": six.text_type(self.lc_block.location),
-            "added": [block_info],
-            "result": [block_info],
-            "previous_count": 0,
-            "max_count": 1,
-        })
+        assert event_data ==\
+               {'location': six.text_type(self.lc_block.location),
+                'added': [block_info],
+                'result': [block_info],
+                'previous_count': 0, 'max_count': 1}
         self.publisher.reset_mock()
 
         # Now increase max_count so that one more child will be added:
         self.lc_block.max_count = 2
         children = self.lc_block.get_child_descriptors()
-        self.assertEqual(len(children), 2)
+        assert len(children) == 2
         child, new_child = children if children[0].location == child.location else reversed(children)
         event_data = self._assert_event_was_published("assigned")
-        self.assertEqual(event_data["added"][0]["usage_key"], six.text_type(new_child.location))
-        self.assertEqual(len(event_data["result"]), 2)
-        self.assertEqual(event_data["previous_count"], 1)
-        self.assertEqual(event_data["max_count"], 2)
+        assert event_data['added'][0]['usage_key'] == six.text_type(new_child.location)
+        assert len(event_data['result']) == 2
+        assert event_data['previous_count'] == 1
+        assert event_data['max_count'] == 2
 
     def test_assigned_event_published(self):
         """
@@ -512,8 +519,9 @@ class TestLibraryContentAnalytics(LibraryContentTest):
         event_data = self._assert_event_was_published("assigned")
 
         for block_list in (event_data["added"], event_data["result"]):
-            self.assertEqual(len(block_list), 1)  # main_vertical is the only root block added, and is the only result.
-            self.assertEqual(block_list[0]["usage_key"], six.text_type(course_usage_main_vertical))
+            assert len(block_list) == 1
+            # main_vertical is the only root block added, and is the only result.
+            assert block_list[0]['usage_key'] == six.text_type(course_usage_main_vertical)
 
             # Check that "descendants" is a flat, unordered list of all of main_vertical's descendants:
             descendants_expected = (
@@ -528,9 +536,9 @@ class TestLibraryContentAnalytics(LibraryContentTest):
                     "original_usage_key": six.text_type(lib_key),
                     "original_usage_version": six.text_type(self.store.get_block_original_usage(course_usage_key)[1]),
                 }
-            self.assertEqual(len(block_list[0]["descendants"]), len(descendant_data_expected))
+            assert len(block_list[0]['descendants']) == len(descendant_data_expected)
             for descendant in block_list[0]["descendants"]:
-                self.assertEqual(descendant, descendant_data_expected.get(descendant["usage_key"]))
+                assert descendant == descendant_data_expected.get(descendant['usage_key'])
 
     def test_removed_overlimit(self):
         """
@@ -544,11 +552,11 @@ class TestLibraryContentAnalytics(LibraryContentTest):
 
         # Check that the event says that one block was removed, leaving no blocks left:
         children = self.lc_block.get_child_descriptors()
-        self.assertEqual(len(children), 0)
+        assert len(children) == 0
         event_data = self._assert_event_was_published("removed")
-        self.assertEqual(len(event_data["removed"]), 1)
-        self.assertEqual(event_data["result"], [])
-        self.assertEqual(event_data["reason"], "overlimit")
+        assert len(event_data['removed']) == 1
+        assert event_data['result'] == []
+        assert event_data['reason'] == 'overlimit'
 
     def test_removed_invalid(self):
         """
@@ -559,14 +567,14 @@ class TestLibraryContentAnalytics(LibraryContentTest):
         self.lc_block.get_child_descriptors()  # This line is needed in the test environment or the change has no effect
         self.lc_block.max_count = 2
         initial_blocks_assigned = self.lc_block.get_child_descriptors()
-        self.assertEqual(len(initial_blocks_assigned), 2)
+        assert len(initial_blocks_assigned) == 2
         self.publisher.reset_mock()  # Clear the "assigned" event that was just published.
         # Now make sure that one of the assigned blocks will have to be un-assigned.
         # To cause an "invalid" event, we delete all blocks from the content library
         # except for one of the two already assigned to the student:
         keep_block_key = initial_blocks_assigned[0].location
         keep_block_lib_usage_key, keep_block_lib_version = self.store.get_block_original_usage(keep_block_key)
-        self.assertIsNotNone(keep_block_lib_usage_key)
+        assert keep_block_lib_usage_key is not None
         deleted_block_key = initial_blocks_assigned[1].location
         self.library.children = [keep_block_lib_usage_key]
         self.store.update_item(self.library, self.user_id)
@@ -574,19 +582,15 @@ class TestLibraryContentAnalytics(LibraryContentTest):
 
         # Check that the event says that one block was removed, leaving one block left:
         children = self.lc_block.get_child_descriptors()
-        self.assertEqual(len(children), 1)
+        assert len(children) == 1
         event_data = self._assert_event_was_published("removed")
-        self.assertEqual(event_data["removed"], [{
-            "usage_key": six.text_type(deleted_block_key),
-            "original_usage_key": None,  # Note: original_usage_key info is sadly unavailable because the block has been
-                                         # deleted so that info can no longer be retrieved
-            "original_usage_version": None,
-            "descendants": [],
-        }])
-        self.assertEqual(event_data["result"], [{
-            "usage_key": six.text_type(keep_block_key),
-            "original_usage_key": six.text_type(keep_block_lib_usage_key),
-            "original_usage_version": six.text_type(keep_block_lib_version),
-            "descendants": [],
-        }])
-        self.assertEqual(event_data["reason"], "invalid")
+        assert event_data['removed'] ==\
+               [{'usage_key': six.text_type(deleted_block_key),
+                 'original_usage_key': None,
+                 'original_usage_version': None,
+                 'descendants': []}]
+        assert event_data['result'] ==\
+               [{'usage_key': six.text_type(keep_block_key),
+                 'original_usage_key': six.text_type(keep_block_lib_usage_key),
+                 'original_usage_version': six.text_type(keep_block_lib_version), 'descendants': []}]
+        assert event_data['reason'] == 'invalid'
diff --git a/common/lib/xmodule/xmodule/tests/test_library_root.py b/common/lib/xmodule/xmodule/tests/test_library_root.py
index c6ebfadee72c06e5647d7c027b98bb608b425115..152078ba2c79c2daeae0003239bdd8989da3688b 100644
--- a/common/lib/xmodule/xmodule/tests/test_library_root.py
+++ b/common/lib/xmodule/xmodule/tests/test_library_root.py
@@ -51,7 +51,7 @@ class TestLibraryRoot(MixedSplitTestCase):
         # Patch the HTML block to always render "Hello world"
 
         result = library.render(AUTHOR_VIEW, context)
-        self.assertIn(message, result.content)
+        assert message in result.content
 
     def test_library_author_view_with_paging(self):
         """
@@ -81,7 +81,7 @@ class TestLibraryRoot(MixedSplitTestCase):
             result = library.render(AUTHOR_VIEW, context)
 
             for expected_block in expected_blocks:
-                self.assertIn(expected_block.data, result.content)
+                assert expected_block.data in result.content
 
         render_and_check_contents(0, 3)
         render_and_check_contents(1, 3)
diff --git a/common/lib/xmodule/xmodule/tests/test_library_sourced_block.py b/common/lib/xmodule/xmodule/tests/test_library_sourced_block.py
index 061eec68f41ec60b25c1392ff3a1a40d406c2620..710379c3947d81cc1b2680bc6fe5ad9fca93e1a8 100644
--- a/common/lib/xmodule/xmodule/tests/test_library_sourced_block.py
+++ b/common/lib/xmodule/xmodule/tests/test_library_sourced_block.py
@@ -47,8 +47,8 @@ class LibrarySourcedBlockTestCase(ContentLibrariesRestApiTest):
 
         # Check if student_view renders the children correctly
         res = self.get_block_view(self.source_block, STUDENT_VIEW)
-        self.assertIn('Student Preview Test 1', res)
-        self.assertIn('Student Preview Test 2', res)
+        assert 'Student Preview Test 1' in res
+        assert 'Student Preview Test 2' in res
 
     def test_block_limits(self):
         # Create a blockstore content library
@@ -59,8 +59,8 @@ class LibrarySourcedBlockTestCase(ContentLibrariesRestApiTest):
         # Import the html blocks from the library to the course
         post_data = {"values": {"source_block_ids": blocks}, "defaults": ["display_name"]}
         res = self.client.post(self.submit_url, data=post_data, format='json')
-        self.assertEqual(res.status_code, 400)
-        self.assertEqual(res.json()['error']['messages'][0]['text'], "A maximum of 10 components may be added.")
+        assert res.status_code == 400
+        assert res.json()['error']['messages'][0]['text'] == 'A maximum of 10 components may be added.'
 
     def get_block_view(self, block, view, context=None):
         """
diff --git a/common/lib/xmodule/xmodule/tests/test_library_tools.py b/common/lib/xmodule/xmodule/tests/test_library_tools.py
index b8a9203022d4d027ac3cd88b62debcbe0ef16c28..950307b6963d6d7473829c722608fd8021332ea8 100644
--- a/common/lib/xmodule/xmodule/tests/test_library_tools.py
+++ b/common/lib/xmodule/xmodule/tests/test_library_tools.py
@@ -28,8 +28,8 @@ class LibraryToolsServiceTest(MixedSplitTestCase):
         """
         _ = LibraryFactory.create(modulestore=self.store)
         all_libraries = self.tools.list_available_libraries()
-        self.assertTrue(all_libraries)
-        self.assertEqual(len(all_libraries), 1)
+        assert all_libraries
+        assert len(all_libraries) == 1
 
     @patch('xmodule.modulestore.split_mongo.split.SplitMongoModuleStore.get_library_summaries')
     def test_list_available_libraries_fetch(self, mock_get_library_summaries):
@@ -37,7 +37,7 @@ class LibraryToolsServiceTest(MixedSplitTestCase):
         Test that library list is compiled using light weight library summary objects.
         """
         _ = self.tools.list_available_libraries()
-        self.assertTrue(mock_get_library_summaries.called)
+        assert mock_get_library_summaries.called
 
 
 class ContentLibraryToolsTest(MixedSplitTestCase, ContentLibrariesRestApiTest):
@@ -69,28 +69,28 @@ class ContentLibraryToolsTest(MixedSplitTestCase, ContentLibrariesRestApiTest):
         self.tools.import_from_blockstore(sourced_block, [unit_block_id])
 
         # Verify imported block with its children
-        self.assertEqual(len(sourced_block.children), 1)
-        self.assertEqual(sourced_block.children[0].category, 'unit')
+        assert len(sourced_block.children) == 1
+        assert sourced_block.children[0].category == 'unit'
 
         imported_unit_block = self.store.get_item(sourced_block.children[0])
-        self.assertEqual(len(imported_unit_block.children), 1)
-        self.assertEqual(imported_unit_block.children[0].category, 'html')
+        assert len(imported_unit_block.children) == 1
+        assert imported_unit_block.children[0].category == 'html'
 
         imported_html_block = self.store.get_item(imported_unit_block.children[0])
-        self.assertIn('Hello world', imported_html_block.data)
+        assert 'Hello world' in imported_html_block.data
 
         # Check that assets were imported and static paths were modified after importing
         assets = library_api.get_library_block_static_asset_files(html_block.scope_ids.usage_id)
-        self.assertEqual(len(assets), 1)
-        self.assertIn(assets[0].url, imported_html_block.data)
+        assert len(assets) == 1
+        assert assets[0].url in imported_html_block.data
 
         # Check that reimporting updates the target block
         self._set_library_block_olx(html_block_id, '<html><a href="/static/test.txt">Foo bar</a></html>')
         self.tools.import_from_blockstore(sourced_block, [unit_block_id])
 
-        self.assertEqual(len(sourced_block.children), 1)
+        assert len(sourced_block.children) == 1
         imported_unit_block = self.store.get_item(sourced_block.children[0])
-        self.assertEqual(len(imported_unit_block.children), 1)
+        assert len(imported_unit_block.children) == 1
         imported_html_block = self.store.get_item(imported_unit_block.children[0])
-        self.assertNotIn('Hello world', imported_html_block.data)
-        self.assertIn('Foo bar', imported_html_block.data)
+        assert 'Hello world' not in imported_html_block.data
+        assert 'Foo bar' in imported_html_block.data
diff --git a/common/lib/xmodule/xmodule/tests/test_lti20_unit.py b/common/lib/xmodule/xmodule/tests/test_lti20_unit.py
index 9d80f41b3f211dc442865f3da50ac1892dce9e8c..426dc639ff3535478b8340df493686866fd6143d 100644
--- a/common/lib/xmodule/xmodule/tests/test_lti20_unit.py
+++ b/common/lib/xmodule/xmodule/tests/test_lti20_unit.py
@@ -49,10 +49,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         )
         for case in test_cases:
             self.xmodule.score_comment = case[0]
-            self.assertEqual(
-                case[1],
-                self.xmodule.get_context()['comment']
-            )
+            assert case[1] == self.xmodule.get_context()['comment']
 
     def test_lti20_rest_bad_contenttype(self):
         """
@@ -81,7 +78,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         request = Mock(headers={u'Content-Type': u'application/vnd.ims.lis.v2.result+json'})
         self.xmodule.verify_lti_2_0_result_rest_headers(request)
         #  We just want the above call to complete without exceptions, and to have called verify_oauth_body_sign
-        self.assertTrue(self.xmodule.verify_oauth_body_sign.called)
+        assert self.xmodule.verify_oauth_body_sign.called
 
     BAD_DISPATCH_INPUTS = [
         None,
@@ -115,7 +112,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         fit the form user/<anon_id>
         """
         for ginput, expected in self.GOOD_DISPATCH_INPUTS:
-            self.assertEqual(self.xmodule.parse_lti_2_0_handler_suffix(ginput), expected)
+            assert self.xmodule.parse_lti_2_0_handler_suffix(ginput) == expected
 
     BAD_JSON_INPUTS = [
         # (bad inputs, error message expected)
@@ -188,8 +185,8 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         """
         for json_str, expected_comment in self.GOOD_JSON_INPUTS:
             score, comment = self.xmodule.parse_lti_2_0_result_json(json_str)
-            self.assertEqual(score, 0.1)
-            self.assertEqual(comment, expected_comment)
+            assert score == 0.1
+            assert comment == expected_comment
 
     GOOD_JSON_PUT = textwrap.dedent(u"""
         {"@type": "Result",
@@ -253,15 +250,13 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         # Now call the handler
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
         # Now assert there's no score
-        self.assertEqual(response.status_code, 200)
-        self.assertIsNone(self.xmodule.module_score)
-        self.assertEqual(self.xmodule.score_comment, u"")
-        (_, evt_type, called_grade_obj), _ = self.system.publish.call_args  # lint-amnesty, pylint: disable=unpacking-non-sequence
-        self.assertEqual(
-            called_grade_obj,
-            {'user_id': self.USER_STANDIN.id, 'value': None, 'max_value': None, 'score_deleted': True},
-        )
-        self.assertEqual(evt_type, 'grade')
+        assert response.status_code == 200
+        assert self.xmodule.module_score is None
+        assert self.xmodule.score_comment == u''
+        (_, evt_type, called_grade_obj), _ = self.system.publish.call_args  # pylint: disable=unpacking-non-sequence
+        assert called_grade_obj ==\
+               {'user_id': self.USER_STANDIN.id, 'value': None, 'max_value': None, 'score_deleted': True}
+        assert evt_type == 'grade'
 
     def test_lti20_delete_success(self):
         """
@@ -276,15 +271,13 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         # Now call the handler
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
         # Now assert there's no score
-        self.assertEqual(response.status_code, 200)
-        self.assertIsNone(self.xmodule.module_score)
-        self.assertEqual(self.xmodule.score_comment, u"")
-        (_, evt_type, called_grade_obj), _ = self.system.publish.call_args  # lint-amnesty, pylint: disable=unpacking-non-sequence
-        self.assertEqual(
-            called_grade_obj,
-            {'user_id': self.USER_STANDIN.id, 'value': None, 'max_value': None, 'score_deleted': True},
-        )
-        self.assertEqual(evt_type, 'grade')
+        assert response.status_code == 200
+        assert self.xmodule.module_score is None
+        assert self.xmodule.score_comment == u''
+        (_, evt_type, called_grade_obj), _ = self.system.publish.call_args  # pylint: disable=unpacking-non-sequence
+        assert called_grade_obj ==\
+               {'user_id': self.USER_STANDIN.id, 'value': None, 'max_value': None, 'score_deleted': True}
+        assert evt_type == 'grade'
 
     def test_lti20_put_set_score_success(self):
         """
@@ -295,15 +288,13 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         # Now call the handler
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
         # Now assert
-        self.assertEqual(response.status_code, 200)
-        self.assertEqual(self.xmodule.module_score, 0.1)
-        self.assertEqual(self.xmodule.score_comment, u"ಠ益ಠ")
-        (_, evt_type, called_grade_obj), _ = self.system.publish.call_args  # lint-amnesty, pylint: disable=unpacking-non-sequence
-        self.assertEqual(evt_type, 'grade')
-        self.assertEqual(
-            called_grade_obj,
-            {'user_id': self.USER_STANDIN.id, 'value': 0.1, 'max_value': 1.0, 'score_deleted': False},
-        )
+        assert response.status_code == 200
+        assert self.xmodule.module_score == 0.1
+        assert self.xmodule.score_comment == u'ಠ益ಠ'
+        (_, evt_type, called_grade_obj), _ = self.system.publish.call_args  # pylint: disable=unpacking-non-sequence
+        assert evt_type == 'grade'
+        assert called_grade_obj ==\
+               {'user_id': self.USER_STANDIN.id, 'value': 0.1, 'max_value': 1.0, 'score_deleted': False}
 
     def test_lti20_get_no_score_success(self):
         """
@@ -314,9 +305,8 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         # Now call the handler
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
         # Now assert
-        self.assertEqual(response.status_code, 200)
-        self.assertEqual(response.json, {"@context": "http://purl.imsglobal.org/ctx/lis/v2/Result",
-                                         "@type": "Result"})
+        assert response.status_code == 200
+        assert response.json == {'@context': 'http://purl.imsglobal.org/ctx/lis/v2/Result', '@type': 'Result'}
 
     def test_lti20_get_with_score_success(self):
         """
@@ -331,11 +321,10 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         # Now call the handler
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
         # Now assert
-        self.assertEqual(response.status_code, 200)
-        self.assertEqual(response.json, {"@context": "http://purl.imsglobal.org/ctx/lis/v2/Result",
-                                         "@type": "Result",
-                                         "resultScore": SCORE,
-                                         "comment": COMMENT})
+        assert response.status_code == 200
+        assert response.json ==\
+               {'@context': 'http://purl.imsglobal.org/ctx/lis/v2/Result',
+                '@type': 'Result', 'resultScore': SCORE, 'comment': COMMENT}
 
     UNSUPPORTED_HTTP_METHODS = ["OPTIONS", "HEAD", "POST", "TRACE", "CONNECT"]
 
@@ -348,7 +337,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         for bad_method in self.UNSUPPORTED_HTTP_METHODS:
             mock_request.method = bad_method
             response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
-            self.assertEqual(response.status_code, 404)
+            assert response.status_code == 404
 
     def test_lti20_request_handler_bad_headers(self):
         """
@@ -358,7 +347,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         self.xmodule.verify_lti_2_0_result_rest_headers = Mock(side_effect=LTIError())
         mock_request = self.get_signed_lti20_mock_request(self.GOOD_JSON_PUT)
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
-        self.assertEqual(response.status_code, 401)
+        assert response.status_code == 401
 
     def test_lti20_request_handler_bad_dispatch_user(self):
         """
@@ -367,7 +356,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         self.setup_system_xmodule_mocks_for_lti20_request_test()
         mock_request = self.get_signed_lti20_mock_request(self.GOOD_JSON_PUT)
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, None)
-        self.assertEqual(response.status_code, 404)
+        assert response.status_code == 404
 
     def test_lti20_request_handler_bad_json(self):
         """
@@ -377,7 +366,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         self.xmodule.parse_lti_2_0_result_json = Mock(side_effect=LTIError())
         mock_request = self.get_signed_lti20_mock_request(self.GOOD_JSON_PUT)
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
-        self.assertEqual(response.status_code, 404)
+        assert response.status_code == 404
 
     def test_lti20_request_handler_bad_user(self):
         """
@@ -387,7 +376,7 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         self.system.get_real_user = Mock(return_value=None)
         mock_request = self.get_signed_lti20_mock_request(self.GOOD_JSON_PUT)
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
-        self.assertEqual(response.status_code, 404)
+        assert response.status_code == 404
 
     def test_lti20_request_handler_grade_past_due(self):
         """
@@ -398,4 +387,4 @@ class LTI20RESTResultServiceTest(unittest.TestCase):
         self.xmodule.accept_grades_past_due = False
         mock_request = self.get_signed_lti20_mock_request(self.GOOD_JSON_PUT)
         response = self.xmodule.lti_2_0_result_rest_handler(mock_request, u"user/abcd")
-        self.assertEqual(response.status_code, 404)
+        assert response.status_code == 404
diff --git a/common/lib/xmodule/xmodule/tests/test_lti_unit.py b/common/lib/xmodule/xmodule/tests/test_lti_unit.py
index b8dde9aeca41ccc8bdfaf180c7ef3948376e8553..f240245d23c9a4eecc7c76596f503f363968574b 100644
--- a/common/lib/xmodule/xmodule/tests/test_lti_unit.py
+++ b/common/lib/xmodule/xmodule/tests/test_lti_unit.py
@@ -7,6 +7,7 @@ import textwrap
 import unittest
 from copy import copy
 
+import pytest
 import six
 from lxml import etree
 from mock import Mock, PropertyMock, patch
@@ -139,7 +140,7 @@ class LTIBlockTest(unittest.TestCase):
             'messageIdentifier': self.defaults['messageIdentifier'],
         }
 
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
 
     @patch(
@@ -163,7 +164,7 @@ class LTIBlockTest(unittest.TestCase):
             'description': 'OAuth verification error: Malformed authorization header',
             'messageIdentifier': self.defaults['messageIdentifier'],
         }
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
 
     def test_real_user_is_none(self):
@@ -183,7 +184,7 @@ class LTIBlockTest(unittest.TestCase):
             'description': 'User not found.',
             'messageIdentifier': self.defaults['messageIdentifier'],
         }
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
 
     def test_grade_past_due(self):
@@ -203,8 +204,8 @@ class LTIBlockTest(unittest.TestCase):
             'description': 'Grade is past due',
             'messageIdentifier': 'unknown',
         }
-        self.assertEqual(response.status_code, 200)
-        self.assertEqual(expected_response, real_response)
+        assert response.status_code == 200
+        assert expected_response == real_response
 
     def test_grade_not_in_range(self):
         """
@@ -221,7 +222,7 @@ class LTIBlockTest(unittest.TestCase):
             'description': 'Request body XML parsing error: score value outside the permitted range of 0-1.',
             'messageIdentifier': 'unknown',
         }
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
 
     def test_bad_grade_decimal(self):
@@ -243,7 +244,7 @@ class LTIBlockTest(unittest.TestCase):
             'description': u'Request body XML parsing error: {}'.format(msg),
             'messageIdentifier': 'unknown',
         }
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
 
     def test_unsupported_action(self):
@@ -262,7 +263,7 @@ class LTIBlockTest(unittest.TestCase):
             'description': 'Target does not support the requested operation.',
             'messageIdentifier': self.defaults['messageIdentifier'],
         }
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
 
     def test_good_request(self):
@@ -286,14 +287,14 @@ class LTIBlockTest(unittest.TestCase):
             'messageIdentifier': self.defaults['messageIdentifier'],
         }
 
-        self.assertEqual(response.status_code, 200)
+        assert response.status_code == 200
         self.assertDictEqual(expected_response, real_response)
-        self.assertEqual(self.xmodule.module_score, float(self.defaults['grade']))
+        assert self.xmodule.module_score == float(self.defaults['grade'])
 
     def test_user_id(self):
         expected_user_id = text_type(six.moves.urllib.parse.quote(self.xmodule.runtime.anonymous_student_id))
         real_user_id = self.xmodule.get_user_id()
-        self.assertEqual(real_user_id, expected_user_id)
+        assert real_user_id == expected_user_id
 
     def test_outcome_service_url(self):
         mock_url_prefix = 'https://hostname/'
@@ -305,14 +306,14 @@ class LTIBlockTest(unittest.TestCase):
 
         self.xmodule.runtime.handler_url = Mock(side_effect=mock_handler_url)
         real_outcome_service_url = self.xmodule.get_outcome_service_url(service_name=test_service_name)
-        self.assertEqual(real_outcome_service_url, mock_url_prefix + test_service_name)
+        assert real_outcome_service_url == (mock_url_prefix + test_service_name)
 
     def test_resource_link_id(self):
         with patch('xmodule.lti_module.LTIBlock.location', new_callable=PropertyMock):
             self.xmodule.location.html_id = lambda: 'i4x-2-3-lti-31de800015cf4afb973356dbe81496df'
             expected_resource_link_id = text_type(six.moves.urllib.parse.quote(self.unquoted_resource_link_id))
             real_resource_link_id = self.xmodule.get_resource_link_id()
-            self.assertEqual(real_resource_link_id, expected_resource_link_id)
+            assert real_resource_link_id == expected_resource_link_id
 
     def test_lis_result_sourcedid(self):
         expected_sourced_id = u':'.join(six.moves.urllib.parse.quote(i) for i in (
@@ -321,7 +322,7 @@ class LTIBlockTest(unittest.TestCase):
             self.user_id
         ))
         real_lis_result_sourcedid = self.xmodule.get_lis_result_sourcedid()
-        self.assertEqual(real_lis_result_sourcedid, expected_sourced_id)
+        assert real_lis_result_sourcedid == expected_sourced_id
 
     def test_client_key_secret(self):
         """
@@ -336,7 +337,7 @@ class LTIBlockTest(unittest.TestCase):
         self.xmodule.lti_id = "lti_id"
         key, secret = self.xmodule.get_client_key_secret()
         expected = ('test_client', 'test_secret')
-        self.assertEqual(expected, (key, secret))
+        assert expected == (key, secret)
 
     def test_client_key_secret_not_provided(self):
         """
@@ -355,7 +356,7 @@ class LTIBlockTest(unittest.TestCase):
         self.xmodule.lti_id = "another_lti_id"
         key_secret = self.xmodule.get_client_key_secret()
         expected = ('', '')
-        self.assertEqual(expected, key_secret)
+        assert expected == key_secret
 
     def test_bad_client_key_secret(self):
         """
@@ -370,7 +371,7 @@ class LTIBlockTest(unittest.TestCase):
         runtime = Mock(modulestore=modulestore)
         self.xmodule.runtime = runtime
         self.xmodule.lti_id = 'lti_id'
-        with self.assertRaises(LTIError):
+        with pytest.raises(LTIError):
             self.xmodule.get_client_key_secret()
 
     @patch('xmodule.lti_module.signature.verify_hmac_sha1', Mock(return_value=True))
@@ -438,7 +439,7 @@ class LTIBlockTest(unittest.TestCase):
 
         Tests that tool provider returned grade back with wrong XML Namespace.
         """
-        with self.assertRaises(IndexError):
+        with pytest.raises(IndexError):
             mocked_request = self.get_signed_grade_mock_request(namespace_lti_v1p1=False)
             self.xmodule.parse_grade_xml_body(mocked_request.body)
 
@@ -450,10 +451,10 @@ class LTIBlockTest(unittest.TestCase):
         """
         mocked_request = self.get_signed_grade_mock_request()
         message_identifier, sourced_id, grade, action = self.xmodule.parse_grade_xml_body(mocked_request.body)
-        self.assertEqual(self.defaults['messageIdentifier'], message_identifier)
-        self.assertEqual(self.defaults['sourcedId'], sourced_id)
-        self.assertEqual(self.defaults['grade'], grade)
-        self.assertEqual(self.defaults['action'], action)
+        assert self.defaults['messageIdentifier'] == message_identifier
+        assert self.defaults['sourcedId'] == sourced_id
+        assert self.defaults['grade'] == grade
+        assert self.defaults['action'] == action
 
     @patch('xmodule.lti_module.signature.verify_hmac_sha1', Mock(return_value=False))
     @patch(
@@ -464,7 +465,7 @@ class LTIBlockTest(unittest.TestCase):
         """
         Oauth signing verify fail.
         """
-        with self.assertRaises(LTIError):
+        with pytest.raises(LTIError):
             req = self.get_signed_grade_mock_request()
             self.xmodule.verify_oauth_body_sign(req)
 
@@ -519,21 +520,21 @@ class LTIBlockTest(unittest.TestCase):
         self.xmodule.custom_parameters = bad_custom_params
         self.xmodule.get_client_key_secret = Mock(return_value=('test_client_key', 'test_client_secret'))
         self.xmodule.oauth_params = Mock()
-        with self.assertRaises(LTIError):
+        with pytest.raises(LTIError):
             self.xmodule.get_input_fields()
 
     def test_max_score(self):
         self.xmodule.weight = 100.0
 
-        self.assertFalse(self.xmodule.has_score)
-        self.assertEqual(self.xmodule.max_score(), None)
+        assert not self.xmodule.has_score
+        assert self.xmodule.max_score() is None
 
         self.xmodule.has_score = True
 
-        self.assertEqual(self.xmodule.max_score(), 100.0)
+        assert self.xmodule.max_score() == 100.0
 
     def test_context_id(self):
         """
         Tests that LTI parameter context_id is equal to course_id.
         """
-        self.assertEqual(text_type(self.system.course_id), self.xmodule.context_id)
+        assert text_type(self.system.course_id) == self.xmodule.context_id
diff --git a/common/lib/xmodule/xmodule/tests/test_mako_module.py b/common/lib/xmodule/xmodule/tests/test_mako_module.py
index 4cd77bb62419db7c47df80d6f5708476d97d8f01..bf52c42f805e56b3921b2848b08bb6035bd0c450 100644
--- a/common/lib/xmodule/xmodule/tests/test_mako_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_mako_module.py
@@ -2,7 +2,7 @@
 
 
 from unittest import TestCase
-
+import pytest
 from mock import Mock
 
 from xmodule.mako_module import MakoModuleDescriptor
@@ -15,10 +15,10 @@ class MakoModuleTest(TestCase):
         mock_system = Mock()
         mock_system.render_template = None
 
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             MakoModuleDescriptor(mock_system, {})
 
         del mock_system.render_template
 
-        with self.assertRaises(TypeError):
+        with pytest.raises(TypeError):
             MakoModuleDescriptor(mock_system, {})
diff --git a/common/lib/xmodule/xmodule/tests/test_mongo_utils.py b/common/lib/xmodule/xmodule/tests/test_mongo_utils.py
index b48933c7688c5951cebf1cea64aeb3da6af6d858..94182b24a725986bddc44fa9039d16240f492ab3 100644
--- a/common/lib/xmodule/xmodule/tests/test_mongo_utils.py
+++ b/common/lib/xmodule/xmodule/tests/test_mongo_utils.py
@@ -33,7 +33,7 @@ class MongoUtilsTests(TestCase):
         db = 'test_read_preference_%s' % uuid4().hex
         # Support for read_preference given in constant name form (ie. PRIMARY, SECONDARY_PREFERRED)
         connection = connect_to_mongodb(db, host, read_preference=enum_name)
-        self.assertEqual(connection.client.read_preference, expected_read_preference)
+        assert connection.client.read_preference == expected_read_preference
         # Support for read_preference given as mongos name.
         connection = connect_to_mongodb(db, host, read_preference=mongos_name)
-        self.assertEqual(connection.client.read_preference, expected_read_preference)
+        assert connection.client.read_preference == expected_read_preference
diff --git a/common/lib/xmodule/xmodule/tests/test_poll.py b/common/lib/xmodule/xmodule/tests/test_poll.py
index 8a0b193f32be92db2ba4b2ffa27abd5b26477423..f2e46aa184f7de8548fe224785e8179d5e6e3741 100644
--- a/common/lib/xmodule/xmodule/tests/test_poll.py
+++ b/common/lib/xmodule/xmodule/tests/test_poll.py
@@ -33,9 +33,9 @@ class PollModuleTest(LogicTest):
         callback = response['callback']
 
         self.assertDictEqual(poll_answers, {'Yes': 1, 'Dont_know': 0, 'No': 1})
-        self.assertEqual(total, 2)
+        assert total == 2
         self.assertDictEqual(callback, {'objectName': 'Conditional'})
-        self.assertEqual(self.xmodule.poll_answer, 'No')
+        assert self.xmodule.poll_answer == 'No'
 
     def test_poll_export_with_unescaped_characters_xml(self):
         """
@@ -64,4 +64,4 @@ class PollModuleTest(LogicTest):
         # Extract texts of all children.
         child_texts = xml.xpath('//text()')
         # Last index of child_texts contains text of answer tag.
-        self.assertEqual(child_texts[-1], '< 18')
+        assert child_texts[(- 1)] == '< 18'
diff --git a/common/lib/xmodule/xmodule/tests/test_progress.py b/common/lib/xmodule/xmodule/tests/test_progress.py
index f5e070c751c869f7909bd86d1962ded3b80985aa..bd5dc2ac3539654dbbeab889a831e5533cac37d6 100644
--- a/common/lib/xmodule/xmodule/tests/test_progress.py
+++ b/common/lib/xmodule/xmodule/tests/test_progress.py
@@ -41,50 +41,50 @@ class ProgressTest(unittest.TestCase):
         self.assertRaises(TypeError, Progress, 2j, 3)
 
     def test_clamp(self):
-        self.assertEqual((2, 2), Progress(3, 2).frac())
-        self.assertEqual((0, 2), Progress(-2, 2).frac())
+        assert (2, 2) == Progress(3, 2).frac()
+        assert (0, 2) == Progress((- 2), 2).frac()
 
     def test_frac(self):
         prg = Progress(1, 2)
         (a_mem, b_mem) = prg.frac()
-        self.assertEqual(a_mem, 1)
-        self.assertEqual(b_mem, 2)
+        assert a_mem == 1
+        assert b_mem == 2
 
     def test_percent(self):
-        self.assertEqual(self.not_started.percent(), 0)
-        self.assertAlmostEqual(self.part_done.percent(), 33.33333333333333)
-        self.assertEqual(self.half_done.percent(), 50)
-        self.assertEqual(self.done.percent(), 100)
+        assert self.not_started.percent() == 0
+        assert round(self.part_done.percent() - 33.33333333333333, 7) >= 0
+        assert self.half_done.percent() == 50
+        assert self.done.percent() == 100
 
-        self.assertEqual(self.half_done.percent(), self.also_half_done.percent())
+        assert self.half_done.percent() == self.also_half_done.percent()
 
     def test_started(self):
-        self.assertFalse(self.not_started.started())
+        assert not self.not_started.started()
 
-        self.assertTrue(self.part_done.started())
-        self.assertTrue(self.half_done.started())
-        self.assertTrue(self.done.started())
+        assert self.part_done.started()
+        assert self.half_done.started()
+        assert self.done.started()
 
     def test_inprogress(self):
         # only true if working on it
-        self.assertFalse(self.done.inprogress())
-        self.assertFalse(self.not_started.inprogress())
+        assert not self.done.inprogress()
+        assert not self.not_started.inprogress()
 
-        self.assertTrue(self.part_done.inprogress())
-        self.assertTrue(self.half_done.inprogress())
+        assert self.part_done.inprogress()
+        assert self.half_done.inprogress()
 
     def test_done(self):
-        self.assertTrue(self.done.done())
-        self.assertFalse(self.half_done.done())
-        self.assertFalse(self.not_started.done())
+        assert self.done.done()
+        assert not self.half_done.done()
+        assert not self.not_started.done()
 
     def test_str(self):
-        self.assertEqual(str(self.not_started), "0/17")
-        self.assertEqual(str(self.part_done), "2/6")
-        self.assertEqual(str(self.done), "7/7")
-        self.assertEqual(str(Progress(2.1234, 7)), '2.12/7')
-        self.assertEqual(str(Progress(2.0034, 7)), '2/7')
-        self.assertEqual(str(Progress(0.999, 7)), '1/7')
+        assert str(self.not_started) == '0/17'
+        assert str(self.part_done) == '2/6'
+        assert str(self.done) == '7/7'
+        assert str(Progress(2.1234, 7)) == '2.12/7'
+        assert str(Progress(2.0034, 7)) == '2/7'
+        assert str(Progress(0.999, 7)) == '1/7'
 
     def test_add(self):
         '''Test the Progress.add_counts() method'''
@@ -94,12 +94,12 @@ class ProgressTest(unittest.TestCase):
         prg_none = None
         add = lambda a, b: Progress.add_counts(a, b).frac()
 
-        self.assertEqual(add(prg1, prg1), (0, 4))
-        self.assertEqual(add(prg1, prg2), (1, 5))
-        self.assertEqual(add(prg2, prg3), (3, 8))
+        assert add(prg1, prg1) == (0, 4)
+        assert add(prg1, prg2) == (1, 5)
+        assert add(prg2, prg3) == (3, 8)
 
-        self.assertEqual(add(prg2, prg_none), prg2.frac())
-        self.assertEqual(add(prg_none, prg2), prg2.frac())
+        assert add(prg2, prg_none) == prg2.frac()
+        assert add(prg_none, prg2) == prg2.frac()
 
     def test_equality(self):
         '''Test that comparing Progress objects for equality
@@ -107,12 +107,12 @@ class ProgressTest(unittest.TestCase):
         prg1 = Progress(1, 2)
         prg2 = Progress(2, 4)
         prg3 = Progress(1, 2)
-        self.assertEqual(prg1, prg3)
-        self.assertNotEqual(prg1, prg2)
+        assert prg1 == prg3
+        assert prg1 != prg2
 
         # Check != while we're at it
-        self.assertNotEqual(prg1, prg2)
-        self.assertEqual(prg1, prg3)
+        assert prg1 != prg2
+        assert prg1 == prg3
 
 
 class ModuleProgressTest(unittest.TestCase):
@@ -123,4 +123,4 @@ class ModuleProgressTest(unittest.TestCase):
         '''Make sure default get_progress exists, returns None'''
         xmod = x_module.XModule(Mock(), get_test_system(), DictFieldData({'location': 'a://b/c/d/e'}), Mock())
         prg = xmod.get_progress()  # lint-amnesty, pylint: disable=assignment-from-none
-        self.assertEqual(prg, None)
+        assert prg is None
diff --git a/common/lib/xmodule/xmodule/tests/test_randomize_module.py b/common/lib/xmodule/xmodule/tests/test_randomize_module.py
index 99d9cb7eb37d6e2a6216147d20ec4c1fc0613097..3fc980cfd4cb16210e24d57e6ff259d69bfce608 100644
--- a/common/lib/xmodule/xmodule/tests/test_randomize_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_randomize_module.py
@@ -78,7 +78,7 @@ class RandomizeBlockTest(MixedSplitTestCase):
             exported_olx = f.read()
 
         # And compare.
-        self.assertEqual(exported_olx, expected_olx)
+        assert exported_olx == expected_olx
 
         runtime = TestImportSystem(load_error_modules=True, course_id=randomize_block.location.course_key)
         runtime.resources_fs = export_fs
@@ -89,9 +89,9 @@ class RandomizeBlockTest(MixedSplitTestCase):
         imported_randomize_block = RandomizeBlock.parse_xml(olx_element, runtime, None, id_generator)
 
         # Check the new XBlock has the same properties as the old one.
-        self.assertEqual(imported_randomize_block.display_name, randomize_block.display_name)
-        self.assertEqual(len(imported_randomize_block.children), 3)
-        self.assertEqual(imported_randomize_block.children, randomize_block.children)
+        assert imported_randomize_block.display_name == randomize_block.display_name
+        assert len(imported_randomize_block.children) == 3
+        assert imported_randomize_block.children == randomize_block.children
 
     def test_children_seen_by_a_user(self):
         """
@@ -101,18 +101,18 @@ class RandomizeBlockTest(MixedSplitTestCase):
         self._bind_module_system(randomize_block, 3)
 
         # Make sure the runtime knows that the block's children vary per-user:
-        self.assertTrue(randomize_block.has_dynamic_children())
+        assert randomize_block.has_dynamic_children()
 
-        self.assertEqual(len(randomize_block.children), 3)
+        assert len(randomize_block.children) == 3
 
         # Check how many children each user will see:
-        self.assertEqual(len(randomize_block.get_child_descriptors()), 1)
-        self.assertEqual(randomize_block.get_child_descriptors()[0].display_name, 'Hello HTML 1')
+        assert len(randomize_block.get_child_descriptors()) == 1
+        assert randomize_block.get_child_descriptors()[0].display_name == 'Hello HTML 1'
         # Check that get_content_titles() doesn't return titles for hidden/unused children
         # get_content_titles() is not overridden in RandomizeBlock so titles of the 3 children are returned.
-        self.assertEqual(len(randomize_block.get_content_titles()), 3)
+        assert len(randomize_block.get_content_titles()) == 3
 
         # Bind to another user and check a different child block is displayed to user.
         randomize_block = self.store.get_item(self.randomize_block.location)
         self._bind_module_system(randomize_block, 1)
-        self.assertEqual(randomize_block.get_child_descriptors()[0].display_name, 'Hello HTML 2')
+        assert randomize_block.get_child_descriptors()[0].display_name == 'Hello HTML 2'
diff --git a/common/lib/xmodule/xmodule/tests/test_resource_templates.py b/common/lib/xmodule/xmodule/tests/test_resource_templates.py
index a0210e82764526a0dc0f8ff955bba230597a6049..1e3702348f224c779ccd53efa516911f7e228e6a 100644
--- a/common/lib/xmodule/xmodule/tests/test_resource_templates.py
+++ b/common/lib/xmodule/xmodule/tests/test_resource_templates.py
@@ -20,15 +20,13 @@ class ResourceTemplatesTests(unittest.TestCase):
             'announcement.yaml',
             'anon_user_id.yaml'])
         got = set((t['template_id'] for t in TestClass.templates()))
-        self.assertEqual(expected, got)
+        assert expected == got
 
     def test_templates_no_suchdir(self):
-        self.assertEqual(len(TestClass2.templates()), 0)
+        assert len(TestClass2.templates()) == 0
 
     def test_get_template(self):
-        self.assertEqual(
-            TestClass.get_template('latex_html.yaml')['template_id'],
-            'latex_html.yaml')
+        assert TestClass.get_template('latex_html.yaml')['template_id'] == 'latex_html.yaml'
 
 
 class TestClass(ResourceTemplates):
diff --git a/common/lib/xmodule/xmodule/tests/test_sequence.py b/common/lib/xmodule/xmodule/tests/test_sequence.py
index cc6c5046a15b2e81c2e3216ba900fc87f7178a2f..0533cbcb71f88d368f56318f9b934cb1ace66cc7 100644
--- a/common/lib/xmodule/xmodule/tests/test_sequence.py
+++ b/common/lib/xmodule/xmodule/tests/test_sequence.py
@@ -138,11 +138,12 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
         """
         Verifies that the rendered view contains the expected position.
         """
-        self.assertIn("'position': {}".format(expected_position), rendered_html)
+        assert "'position': {}".format(expected_position) in rendered_html
 
     def test_student_view_init(self):
         seq_module = SequenceModule(runtime=Mock(position=2), descriptor=Mock(), scope_ids=Mock())
-        self.assertEqual(seq_module.position, 2)  # matches position set in the runtime
+        assert seq_module.position == 2
+        # matches position set in the runtime
 
     @ddt.unpack
     @ddt.data(
@@ -156,11 +157,11 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
             view=view
         )
         self._assert_view_at_position(html, expected_position=1)
-        self.assertIn(six.text_type(self.sequence_3_1.location), html)
-        self.assertIn("'gated': False", html)
-        self.assertIn("'next_url': 'NextSequential'", html)
-        self.assertIn("'prev_url': 'PrevSequential'", html)
-        self.assertNotIn("fa fa-check-circle check-circle is-hidden", html)
+        assert six.text_type(self.sequence_3_1.location) in html
+        assert "'gated': False" in html
+        assert "'next_url': 'NextSequential'" in html
+        assert "'prev_url': 'PrevSequential'" in html
+        assert 'fa fa-check-circle check-circle is-hidden' not in html
 
     # pylint: disable=line-too-long
     @patch('xmodule.seq_module.SequenceModule.gate_entire_sequence_if_it_is_a_timed_exam_and_contains_content_type_gated_problems')
@@ -205,11 +206,11 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
             extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'),
             view=STUDENT_VIEW
         )
-        self.assertIn('i_am_gated', view)
+        assert 'i_am_gated' in view
         # check a few elements to ensure the correct page was loaded
-        self.assertIn("seq_module.html", view)
-        self.assertIn('NextSequential', view)
-        self.assertIn('PrevSequential', view)
+        assert 'seq_module.html' in view
+        assert 'NextSequential' in view
+        assert 'PrevSequential' in view
 
     @ddt.unpack
     @ddt.data(
@@ -234,12 +235,12 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
     def test_tooltip(self):
         html = self._get_rendered_view(self.sequence_3_1, requested_child=None)
         for child in self.sequence_3_1.children:
-            self.assertIn("'page_title': '{}'".format(child.block_id), html)
+            assert "'page_title': '{}'".format(child.block_id) in html
 
     def test_hidden_content_before_due(self):
         html = self._get_rendered_view(self.sequence_4_1)
-        self.assertIn("seq_module.html", html)
-        self.assertIn("'banner_text': None", html)
+        assert 'seq_module.html' in html
+        assert "'banner_text': None" in html
 
     def test_hidden_content_past_due(self):
         with freeze_time(COURSE_END_DATE):
@@ -248,8 +249,8 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
                 self.sequence_4_1,
                 extra_context=dict(progress_url=progress_url),
             )
-            self.assertIn("hidden_content.html", html)
-            self.assertIn(progress_url, html)
+            assert 'hidden_content.html' in html
+            assert progress_url in html
 
     def test_masquerade_hidden_content_past_due(self):
         with freeze_time(COURSE_END_DATE):
@@ -257,18 +258,15 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
                 self.sequence_4_1,
                 extra_context=dict(specific_masquerade=True),
             )
-            self.assertIn("seq_module.html", html)
+            assert 'seq_module.html' in html
             html = self.get_context_dict_from_string(html)
-            self.assertEqual(
-                'Because the due date has passed, this assignment is hidden from the learner.',
-                html['banner_text']
-            )
+            assert 'Because the due date has passed, this assignment is hidden from the learner.' == html['banner_text']
 
     def test_hidden_content_self_paced_past_due_before_end(self):
         with freeze_time(PAST_DUE_BEFORE_END_DATE):
             html = self._get_rendered_view(self.sequence_4_1, self_paced=True)
-            self.assertIn("seq_module.html", html)
-            self.assertIn("'banner_text': None", html)
+            assert 'seq_module.html' in html
+            assert "'banner_text': None" in html
 
     def test_hidden_content_self_paced_past_end(self):
         with freeze_time(COURSE_END_DATE + timedelta(days=7)):
@@ -278,56 +276,50 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
                 extra_context=dict(progress_url=progress_url),
                 self_paced=True,
             )
-            self.assertIn("hidden_content.html", html)
-            self.assertIn(progress_url, html)
+            assert 'hidden_content.html' in html
+            assert progress_url in html
 
     def _assert_gated(self, html, sequence):
         """
         Assert sequence content is gated
         """
-        self.assertIn("seq_module.html", html)
+        assert 'seq_module.html' in html
         html = self.get_context_dict_from_string(html)
-        self.assertIsNone(html['banner_text'])
-        self.assertEqual([], html['items'])
-        self.assertTrue(html['gated_content']['gated'])
-        self.assertEqual('PrereqUrl', html['gated_content']['prereq_url'])
-        self.assertEqual('PrereqSectionName', html['gated_content']['prereq_section_name'])
-        self.assertIn(
-            six.text_type(sequence.display_name),
-            html['gated_content']['gated_section_name']
-        )
-        self.assertEqual('NextSequential', html['next_url'])
-        self.assertEqual('PrevSequential', html['prev_url'])
+        assert html['banner_text'] is None
+        assert [] == html['items']
+        assert html['gated_content']['gated']
+        assert 'PrereqUrl' == html['gated_content']['prereq_url']
+        assert 'PrereqSectionName' == html['gated_content']['prereq_section_name']
+        assert six.text_type(sequence.display_name) in html['gated_content']['gated_section_name']
+        assert 'NextSequential' == html['next_url']
+        assert 'PrevSequential' == html['prev_url']
 
     def _assert_prereq(self, html, sequence):
         """
         Assert sequence is a prerequisite with unfulfilled gates
         """
-        self.assertIn("seq_module.html", html)
+        assert 'seq_module.html' in html
         html = self.get_context_dict_from_string(html)
-        self.assertEqual(
-            "This section is a prerequisite. You must complete this section in order to unlock additional content.",
-            html['banner_text']
-        )
-        self.assertFalse(html['gated_content']['gated'])
-        self.assertEqual(six.text_type(sequence.location), html['item_id'])
-        self.assertIsNone(html['gated_content']['prereq_url'])
-        self.assertIsNone(html['gated_content']['prereq_section_name'])
-        self.assertEqual('NextSequential', html['next_url'])
-        self.assertEqual('PrevSequential', html['prev_url'])
+        assert 'This section is a prerequisite. You must complete this section in order to unlock additional content.' == html['banner_text']
+        assert not html['gated_content']['gated']
+        assert six.text_type(sequence.location) == html['item_id']
+        assert html['gated_content']['prereq_url'] is None
+        assert html['gated_content']['prereq_section_name'] is None
+        assert 'NextSequential' == html['next_url']
+        assert 'PrevSequential' == html['prev_url']
 
     def _assert_ungated(self, html, sequence):
         """
         Assert sequence is not gated
         """
-        self.assertIn("seq_module.html", html)
-        self.assertIn("'banner_text': None", html)
-        self.assertIn("'gated': False", html)
-        self.assertIn(six.text_type(sequence.location), html)
-        self.assertIn("'prereq_url': None", html)
-        self.assertIn("'prereq_section_name': None", html)
-        self.assertIn("'next_url': 'NextSequential'", html)
-        self.assertIn("'prev_url': 'PrevSequential'", html)
+        assert 'seq_module.html' in html
+        assert "'banner_text': None" in html
+        assert "'gated': False" in html
+        assert six.text_type(sequence.location) in html
+        assert "'prereq_url': None" in html
+        assert "'prereq_section_name': None" in html
+        assert "'next_url': 'NextSequential'" in html
+        assert "'prev_url': 'PrevSequential'" in html
 
     def test_gated_content(self):
         """
@@ -389,9 +381,9 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
                 'get_completion',
                 {'usage_key': usage_key}
             ))
-            self.assertIsNot(completion_return, None)
-            self.assertTrue('complete' in completion_return)  # lint-amnesty, pylint: disable=wrong-assert-type
-            self.assertEqual(completion_return['complete'], True)
+            assert completion_return is not None
+            assert 'complete' in completion_return
+            assert completion_return['complete'] is True
 
     def test_handle_ajax_get_completion_return_none(self):
         """
@@ -403,7 +395,7 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
             'get_completion',
             {'usage_key': usage_key}
         )
-        self.assertIs(completion_return, None)
+        assert completion_return is None
 
     def test_handle_ajax_metadata(self):
         """
@@ -414,9 +406,9 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
         # let's just disable the bookmarks service
         self.sequence_3_1.xmodule_runtime._services['bookmarks'] = None  # lint-amnesty, pylint: disable=protected-access
         metadata = json.loads(self.sequence_3_1.handle_ajax('metadata', {}))
-        self.assertEqual(len(metadata['items']), 3)
-        self.assertEqual(metadata['tag'], 'sequential')
-        self.assertEqual(metadata['display_name'], self.sequence_3_1.display_name_with_default)
+        assert len(metadata['items']) == 3
+        assert metadata['tag'] == 'sequential'
+        assert metadata['display_name'] == self.sequence_3_1.display_name_with_default
 
     @override_settings(FIELD_OVERRIDE_PROVIDERS=(
         'openedx.features.content_type_gating.field_override.ContentTypeGatingFieldOverride',
@@ -429,7 +421,7 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
         self.sequence_5_1.xmodule_runtime._services['bookmarks'] = None  # pylint: disable=protected-access
         ContentTypeGatingConfig.objects.create(enabled=True, enabled_as_of=datetime(2018, 1, 1))
         metadata = json.loads(self.sequence_5_1.handle_ajax('metadata', {}))
-        self.assertEqual(metadata['items'][0]['contains_content_type_gated_content'], False)
+        assert metadata['items'][0]['contains_content_type_gated_content'] is False
 
         # When a block contains content type gated problems, set the contains_content_type_gated_content field
         self.sequence_5_1.get_children()[0].get_children()[0].graded = True
@@ -438,7 +430,7 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
             content_type_gate_for_block=Mock(return_value=Fragment('i_am_gated'))
         ))
         metadata = json.loads(self.sequence_5_1.handle_ajax('metadata', {}))
-        self.assertEqual(metadata['items'][0]['contains_content_type_gated_content'], True)
+        assert metadata['items'][0]['contains_content_type_gated_content'] is True
 
     def get_context_dict_from_string(self, data):
         """
diff --git a/common/lib/xmodule/xmodule/tests/test_services.py b/common/lib/xmodule/xmodule/tests/test_services.py
index 836110191d0c489f5cc8257e6cb993298f821131..38fa619255b1de381586af1b0877468cfd29a668 100644
--- a/common/lib/xmodule/xmodule/tests/test_services.py
+++ b/common/lib/xmodule/xmodule/tests/test_services.py
@@ -4,6 +4,7 @@ Tests for SettingsService
 
 
 import unittest
+import pytest
 from django.test import TestCase
 
 import ddt
@@ -57,46 +58,48 @@ class TestSettingsService(unittest.TestCase):
 
     def test_get_given_none_throws_value_error(self):
         """  Test that given None throws value error """
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             self.settings_service.get_settings_bucket(None)
 
     def test_get_return_default_if_xblock_settings_is_missing(self):
         """ Test that returns default (or None if default not set) if XBLOCK_SETTINGS is not set """
-        self.assertFalse(hasattr(settings, 'XBLOCK_SETTINGS'))  # precondition check
-        self.assertEqual(self.settings_service.get_settings_bucket(self.xblock_mock, 'zzz'), 'zzz')
+        assert not hasattr(settings, 'XBLOCK_SETTINGS')
+        # precondition check
+        assert self.settings_service.get_settings_bucket(self.xblock_mock, 'zzz') == 'zzz'
 
     def test_get_return_empty_dictionary_if_xblock_settings_and_default_is_missing(self):
         """ Test that returns default (or None if default not set) if XBLOCK_SETTINGS is not set """
-        self.assertFalse(hasattr(settings, 'XBLOCK_SETTINGS'))  # precondition check
-        self.assertEqual(self.settings_service.get_settings_bucket(self.xblock_mock), {})
+        assert not hasattr(settings, 'XBLOCK_SETTINGS')
+        # precondition check
+        assert self.settings_service.get_settings_bucket(self.xblock_mock) == {}
 
     @override_settings(XBLOCK_SETTINGS={xblock_setting_key2: {'b': 1}})
     def test_get_returns_none_or_default_if_bucket_not_found(self):
         """ Test if settings service returns default if setting not found """
-        self.assertEqual(settings.XBLOCK_SETTINGS, {self.xblock_setting_key2: {'b': 1}})
-        self.assertEqual(self.settings_service.get_settings_bucket(self.xblock_mock), {})
-        self.assertEqual(self.settings_service.get_settings_bucket(self.xblock_mock, 123), 123)
+        assert settings.XBLOCK_SETTINGS == {self.xblock_setting_key2: {'b': 1}}
+        assert self.settings_service.get_settings_bucket(self.xblock_mock) == {}
+        assert self.settings_service.get_settings_bucket(self.xblock_mock, 123) == 123
 
     @override_settings(XBLOCK_SETTINGS={xblock_setting_key1: 42})
     def test_get_returns_correct_value(self):
         """ Test if settings service returns correct bucket """
-        self.assertEqual(settings.XBLOCK_SETTINGS, {self.xblock_setting_key1: 42})
-        self.assertEqual(self.settings_service.get_settings_bucket(self.xblock_mock), 42)
+        assert settings.XBLOCK_SETTINGS == {self.xblock_setting_key1: 42}
+        assert self.settings_service.get_settings_bucket(self.xblock_mock) == 42
 
     @override_settings(XBLOCK_SETTINGS={xblock_setting_key2: "I'm a setting"})
     def test_get_respects_block_settings_key(self):
         """ Test if settings service respects block_settings_key value """
-        self.assertEqual(settings.XBLOCK_SETTINGS, {self.xblock_setting_key2: "I'm a setting"})
+        assert settings.XBLOCK_SETTINGS == {self.xblock_setting_key2: "I'm a setting"}
         self.xblock_mock.block_settings_key = self.xblock_setting_key2
-        self.assertEqual(self.settings_service.get_settings_bucket(self.xblock_mock), "I'm a setting")
+        assert self.settings_service.get_settings_bucket(self.xblock_mock) == "I'm a setting"
 
     @override_settings(XBLOCK_SETTINGS={_DummyBlock.__name__: [1, 2, 3]})
     def test_get_uses_class_name_if_block_settings_key_is_not_set(self):
         """ Test if settings service uses class name if block_settings_key attribute does not exist """
         mixologist = Mixologist([])
         block = mixologist.mix(_DummyBlock)
-        self.assertEqual(settings.XBLOCK_SETTINGS, {"_DummyBlock": [1, 2, 3]})
-        self.assertEqual(self.settings_service.get_settings_bucket(block), [1, 2, 3])
+        assert settings.XBLOCK_SETTINGS == {'_DummyBlock': [1, 2, 3]}
+        assert self.settings_service.get_settings_bucket(block) == [1, 2, 3]
 
 
 class TestConfigurationService(unittest.TestCase):
@@ -109,7 +112,7 @@ class TestConfigurationService(unittest.TestCase):
         Test that instantiating ConfigurationService raises exception on passing
         a class which is not subclass of ConfigurationModel.
         """
-        with self.assertRaises(ValueError):
+        with pytest.raises(ValueError):
             ConfigurationService(DummyUnexpected)
 
     def test_configuration_service(self):
@@ -117,7 +120,7 @@ class TestConfigurationService(unittest.TestCase):
         Test the correct configuration on instantiating ConfigurationService.
         """
         config_service = ConfigurationService(DummyConfig)
-        self.assertEqual(config_service.configuration, DummyConfig)
+        assert config_service.configuration == DummyConfig
 
 
 class MockConfigurationService(TeamsConfigurationService):
@@ -157,4 +160,4 @@ class TestTeamsConfigurationService(ConfigurationServiceBaseClass):
 
     def test_get_teamsconfiguration(self):
         teams_config = self.configuration_service.get_teams_configuration(self.course.id)
-        self.assertEqual(teams_config, self.teams_config)
+        assert teams_config == self.teams_config
diff --git a/common/lib/xmodule/xmodule/tests/test_split_test_module.py b/common/lib/xmodule/xmodule/tests/test_split_test_module.py
index 3c4110c1046a04b38876990fad3b011d23dbd106..abfbfac0a783abd23b8a10d66f5b278d42501d7f 100644
--- a/common/lib/xmodule/xmodule/tests/test_split_test_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_split_test_module.py
@@ -60,10 +60,7 @@ class SplitTestUtilitiesTest(PartitionTestCase):
             ),
             second_random_partition
         ]
-        self.assertEqual(
-            [first_random_partition, second_random_partition],
-            get_split_user_partitions(all_partitions)
-        )
+        assert [first_random_partition, second_random_partition] == get_split_user_partitions(all_partitions)
 
 
 class SplitTestBlockTest(XModuleXmlImportTest, PartitionTestCase):
@@ -150,31 +147,25 @@ class SplitTestBlockLMSTest(SplitTestBlockTest):
     @ddt.unpack
     def test_child(self, user_tag, child_url_name):
         self.user_partition.scheme.current_group = self.user_partition.groups[user_tag]
-        self.assertEqual(self.split_test_module.child_descriptor.url_name, child_url_name)
+        assert self.split_test_module.child_descriptor.url_name == child_url_name
 
     @ddt.data((0, 'HTML FOR GROUP 0'), (1, 'HTML FOR GROUP 1'))
     @ddt.unpack
     def test_get_html(self, user_tag, child_content):
         self.user_partition.scheme.current_group = self.user_partition.groups[user_tag]
-        self.assertIn(
-            child_content,
-            self.module_system.render(self.split_test_module, STUDENT_VIEW).content
-        )
+        assert child_content in self.module_system.render(self.split_test_module, STUDENT_VIEW).content
 
     @ddt.data(0, 1)
     def test_child_missing_tag_value(self, _user_tag):
         # If user_tag has a missing value, we should still get back a valid child url
-        self.assertIn(self.split_test_module.child_descriptor.url_name, ['split_test_cond0', 'split_test_cond1'])
+        assert self.split_test_module.child_descriptor.url_name in ['split_test_cond0', 'split_test_cond1']
 
     @ddt.data(100, 200, 300, 400, 500, 600, 700, 800, 900, 1000)
     def test_child_persist_new_tag_value_when_tag_missing(self, _user_tag):
         # If a user_tag has a missing value, a group should be saved/persisted for that user.
         # So, we check that we get the same url_name when we call on the url_name twice.
         # We run the test ten times so that, if our storage is failing, we'll be most likely to notice it.
-        self.assertEqual(
-            self.split_test_module.child_descriptor.url_name,
-            self.split_test_module.child_descriptor.url_name
-        )
+        assert self.split_test_module.child_descriptor.url_name == self.split_test_module.child_descriptor.url_name
 
     # Patch the definition_to_xml for the html children.
     @patch('xmodule.html_module.HtmlBlock.definition_to_xml')
@@ -190,14 +181,14 @@ class SplitTestBlockLMSTest(SplitTestBlockTest):
         # Write out the xml.
         xml_obj = self.split_test_module.definition_to_xml(MemoryFS())
 
-        self.assertEqual(xml_obj.get('user_partition_id'), '0')
-        self.assertIsNotNone(xml_obj.get('group_id_to_child'))
+        assert xml_obj.get('user_partition_id') == '0'
+        assert xml_obj.get('group_id_to_child') is not None
 
         # Read the xml back in.
         fields, children = SplitTestBlock.definition_from_xml(xml_obj, self.module_system)
-        self.assertEqual(fields.get('user_partition_id'), '0')
-        self.assertIsNotNone(fields.get('group_id_to_child'))
-        self.assertEqual(len(children), 2)
+        assert fields.get('user_partition_id') == '0'
+        assert fields.get('group_id_to_child') is not None
+        assert len(children) == 2
 
 
 class SplitTestBlockStudioTest(SplitTestBlockTest):
@@ -223,14 +214,14 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         # The split_test module should render both its groups when it is the root
         context = create_studio_context(self.split_test_module)
         html = self.module_system.render(self.split_test_module, AUTHOR_VIEW, context).content
-        self.assertIn('HTML FOR GROUP 0', html)
-        self.assertIn('HTML FOR GROUP 1', html)
+        assert 'HTML FOR GROUP 0' in html
+        assert 'HTML FOR GROUP 1' in html
 
         # When rendering as a child, it shouldn't render either of its groups
         context = create_studio_context(self.course_sequence)
         html = self.module_system.render(self.split_test_module, AUTHOR_VIEW, context).content
-        self.assertNotIn('HTML FOR GROUP 0', html)
-        self.assertNotIn('HTML FOR GROUP 1', html)
+        assert 'HTML FOR GROUP 0' not in html
+        assert 'HTML FOR GROUP 1' not in html
 
         # The "Create Missing Groups" button should be rendered when groups are missing
         context = create_studio_context(self.split_test_module)
@@ -239,8 +230,8 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
                           [Group("0", 'alpha'), Group("1", 'beta'), Group("2", 'gamma')])
         ]
         html = self.module_system.render(self.split_test_module, AUTHOR_VIEW, context).content
-        self.assertIn('HTML FOR GROUP 0', html)
-        self.assertIn('HTML FOR GROUP 1', html)
+        assert 'HTML FOR GROUP 0' in html
+        assert 'HTML FOR GROUP 1' in html
 
     def test_group_configuration_url(self):
         """
@@ -256,29 +247,29 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         ]
 
         expected_url = '/group_configurations/edX/xml_test_course/101#0'
-        self.assertEqual(expected_url, self.split_test_module.group_configuration_url)
+        assert expected_url == self.split_test_module.group_configuration_url
 
     def test_editable_settings(self):
         """
         Test the setting information passed back from editable_metadata_fields.
         """
         editable_metadata_fields = self.split_test_module.editable_metadata_fields
-        self.assertIn(SplitTestBlock.display_name.name, editable_metadata_fields)
-        self.assertNotIn(SplitTestBlock.due.name, editable_metadata_fields)
-        self.assertNotIn(SplitTestBlock.user_partitions.name, editable_metadata_fields)
+        assert SplitTestBlock.display_name.name in editable_metadata_fields
+        assert SplitTestBlock.due.name not in editable_metadata_fields
+        assert SplitTestBlock.user_partitions.name not in editable_metadata_fields
 
         # user_partition_id will always appear in editable_metadata_settings, regardless
         # of the selected value.
-        self.assertIn(SplitTestBlock.user_partition_id.name, editable_metadata_fields)
+        assert SplitTestBlock.user_partition_id.name in editable_metadata_fields
 
     def test_non_editable_settings(self):
         """
         Test the settings that are marked as "non-editable".
         """
         non_editable_metadata_fields = self.split_test_module.non_editable_metadata_fields
-        self.assertIn(SplitTestBlock.due, non_editable_metadata_fields)
-        self.assertIn(SplitTestBlock.user_partitions, non_editable_metadata_fields)
-        self.assertNotIn(SplitTestBlock.display_name, non_editable_metadata_fields)
+        assert SplitTestBlock.due in non_editable_metadata_fields
+        assert SplitTestBlock.user_partitions in non_editable_metadata_fields
+        assert SplitTestBlock.display_name not in non_editable_metadata_fields
 
     @patch('xmodule.split_test_module.user_partition_values.values')
     def test_available_partitions(self, _):
@@ -289,8 +280,8 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         self.split_test_module.user_partition_id = SplitTestFields.no_partition_selected['value']
         self.split_test_module.editable_metadata_fields  # pylint: disable=pointless-statement
         partitions = user_partition_values.values
-        self.assertEqual(1, len(partitions))
-        self.assertEqual(SplitTestFields.no_partition_selected['value'], partitions[0]['value'])
+        assert 1 == len(partitions)
+        assert SplitTestFields.no_partition_selected['value'] == partitions[0]['value']
 
         # Populate user_partitions and call editable_metadata_fields again
         self.split_test_module.user_partitions = [
@@ -306,27 +297,27 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         ]
         self.split_test_module.editable_metadata_fields  # pylint: disable=pointless-statement
         partitions = user_partition_values.values
-        self.assertEqual(2, len(partitions))
-        self.assertEqual(SplitTestFields.no_partition_selected['value'], partitions[0]['value'])
-        self.assertEqual(0, partitions[1]['value'])
-        self.assertEqual("first_partition", partitions[1]['display_name'])
+        assert 2 == len(partitions)
+        assert SplitTestFields.no_partition_selected['value'] == partitions[0]['value']
+        assert 0 == partitions[1]['value']
+        assert 'first_partition' == partitions[1]['display_name']
 
         # Try again with a selected partition and verify that there is no option for "No Selection"
         self.split_test_module.user_partition_id = 0
         self.split_test_module.editable_metadata_fields  # pylint: disable=pointless-statement
         partitions = user_partition_values.values
-        self.assertEqual(1, len(partitions))
-        self.assertEqual(0, partitions[0]['value'])
-        self.assertEqual("first_partition", partitions[0]['display_name'])
+        assert 1 == len(partitions)
+        assert 0 == partitions[0]['value']
+        assert 'first_partition' == partitions[0]['display_name']
 
         # Finally try again with an invalid selected partition and verify that "No Selection" is an option
         self.split_test_module.user_partition_id = 999
         self.split_test_module.editable_metadata_fields  # pylint: disable=pointless-statement
         partitions = user_partition_values.values
-        self.assertEqual(2, len(partitions))
-        self.assertEqual(SplitTestFields.no_partition_selected['value'], partitions[0]['value'])
-        self.assertEqual(0, partitions[1]['value'])
-        self.assertEqual("first_partition", partitions[1]['display_name'])
+        assert 2 == len(partitions)
+        assert SplitTestFields.no_partition_selected['value'] == partitions[0]['value']
+        assert 0 == partitions[1]['value']
+        assert 'first_partition' == partitions[1]['display_name']
 
     def test_active_and_inactive_children(self):
         """
@@ -338,8 +329,8 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         # Verify that a split test has no active children if it has no specified user partition.
         split_test_module.user_partition_id = -1
         [active_children, inactive_children] = split_test_module.active_and_inactive_children()
-        self.assertEqual(active_children, [])
-        self.assertEqual(inactive_children, children)
+        assert active_children == []
+        assert inactive_children == children
 
         # Verify that all the children are returned as active for a correctly configured split_test
         split_test_module.user_partition_id = 0
@@ -347,30 +338,30 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
             UserPartition(0, 'first_partition', 'First Partition', [Group("0", 'alpha'), Group("1", 'beta')])
         ]
         [active_children, inactive_children] = split_test_module.active_and_inactive_children()
-        self.assertEqual(active_children, children)
-        self.assertEqual(inactive_children, [])
+        assert active_children == children
+        assert inactive_children == []
 
         # Verify that a split_test does not return inactive children in the active children
         self.split_test_module.user_partitions = [
             UserPartition(0, 'first_partition', 'First Partition', [Group("0", 'alpha')])
         ]
         [active_children, inactive_children] = split_test_module.active_and_inactive_children()
-        self.assertEqual(active_children, [children[0]])
-        self.assertEqual(inactive_children, [children[1]])
+        assert active_children == [children[0]]
+        assert inactive_children == [children[1]]
 
         # Verify that a split_test ignores misconfigured children
         self.split_test_module.user_partitions = [
             UserPartition(0, 'first_partition', 'First Partition', [Group("0", 'alpha'), Group("2", 'gamma')])
         ]
         [active_children, inactive_children] = split_test_module.active_and_inactive_children()
-        self.assertEqual(active_children, [children[0]])
-        self.assertEqual(inactive_children, [children[1]])
+        assert active_children == [children[0]]
+        assert inactive_children == [children[1]]
 
         # Verify that a split_test referring to a non-existent user partition has no active children
         self.split_test_module.user_partition_id = 2
         [active_children, inactive_children] = split_test_module.active_and_inactive_children()
-        self.assertEqual(active_children, [])
-        self.assertEqual(inactive_children, children)
+        assert active_children == []
+        assert inactive_children == children
 
     def test_validation_messages(self):  # lint-amnesty, pylint: disable=too-many-statements
         """
@@ -384,32 +375,32 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
             """
             Verify that the validation message has the expected validation message and type.
             """
-            self.assertEqual(message.text, expected_message)
-            self.assertEqual(message.type, expected_message_type)
+            assert message.text == expected_message
+            assert message.type == expected_message_type
             if expected_action_class:
-                self.assertEqual(message.action_class, expected_action_class)
+                assert message.action_class == expected_action_class
             else:
-                self.assertFalse(hasattr(message, "action_class"))
+                assert not hasattr(message, 'action_class')
             if expected_action_label:
-                self.assertEqual(message.action_label, expected_action_label)
+                assert message.action_label == expected_action_label
             else:
-                self.assertFalse(hasattr(message, "action_label"))
+                assert not hasattr(message, 'action_label')
             if expected_action_runtime_event:
-                self.assertEqual(message.action_runtime_event, expected_action_runtime_event)
+                assert message.action_runtime_event == expected_action_runtime_event
             else:
-                self.assertFalse(hasattr(message, "action_runtime_event"))
+                assert not hasattr(message, 'action_runtime_event')
 
         def verify_summary_message(general_validation, expected_message, expected_message_type):
             """
             Verify that the general validation message has the expected validation message and type.
             """
-            self.assertEqual(general_validation.text, expected_message)
-            self.assertEqual(general_validation.type, expected_message_type)
+            assert general_validation.text == expected_message
+            assert general_validation.type == expected_message_type
 
         # Verify the messages for an unconfigured user partition
         split_test_module.user_partition_id = -1
         validation = split_test_module.validate()
-        self.assertEqual(len(validation.messages), 0)
+        assert len(validation.messages) == 0
         verify_validation_message(
             validation.summary,
             u"The experiment is not associated with a group configuration.",
@@ -424,8 +415,8 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
             UserPartition(0, 'first_partition', 'First Partition', [Group("0", 'alpha'), Group("1", 'beta')])
         ]
         validation = split_test_module.validate_split_test()
-        self.assertTrue(validation)
-        self.assertIsNone(split_test_module.general_validation_message(), None)
+        assert validation
+        assert split_test_module.general_validation_message() is None, None
 
         # Verify the messages for a split test with too few groups
         split_test_module.user_partitions = [
@@ -433,7 +424,7 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
                           [Group("0", 'alpha'), Group("1", 'beta'), Group("2", 'gamma')])
         ]
         validation = split_test_module.validate()
-        self.assertEqual(len(validation.messages), 1)
+        assert len(validation.messages) == 1
         verify_validation_message(
             validation.messages[0],
             u"The experiment does not contain all of the groups in the configuration.",
@@ -452,7 +443,7 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
                           [Group("0", 'alpha')])
         ]
         validation = split_test_module.validate()
-        self.assertEqual(len(validation.messages), 1)
+        assert len(validation.messages) == 1
         verify_validation_message(
             validation.messages[0],
             u"The experiment has an inactive group. Move content into active groups, then delete the inactive group.",
@@ -469,7 +460,7 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
                           [Group("0", 'alpha'), Group("2", 'gamma')])
         ]
         validation = split_test_module.validate()
-        self.assertEqual(len(validation.messages), 2)
+        assert len(validation.messages) == 2
         verify_validation_message(
             validation.messages[0],
             u"The experiment does not contain all of the groups in the configuration.",
@@ -492,7 +483,7 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         # Verify the messages for a split test referring to a non-existent user partition
         split_test_module.user_partition_id = 2
         validation = split_test_module.validate()
-        self.assertEqual(len(validation.messages), 1)
+        assert len(validation.messages) == 1
         verify_validation_message(
             validation.messages[0],
             u"The experiment uses a deleted group configuration. "
@@ -514,7 +505,7 @@ class SplitTestBlockStudioTest(SplitTestBlockTest):
         ]
         split_test_module.user_partition_id = 10
         validation = split_test_module.validate()
-        self.assertEqual(len(validation.messages), 1)
+        assert len(validation.messages) == 1
         verify_validation_message(
             validation.messages[0],
             u"The experiment uses a group configuration that is not supported for experiments. "
@@ -593,7 +584,7 @@ class SplitTestBlockExportImportTest(MixedSplitTestCase):
             exported_olx = f.read()
 
         # And compare.
-        self.assertEqual(exported_olx, expected_olx)
+        assert exported_olx == expected_olx
 
         runtime = TestImportSystem(load_error_modules=True, course_id=split_test_block.location.course_key)
         runtime.resources_fs = export_fs
@@ -604,9 +595,9 @@ class SplitTestBlockExportImportTest(MixedSplitTestCase):
         imported_split_test_block = SplitTestBlock.parse_xml(olx_element, runtime, None, id_generator)
 
         # Check the new XBlock has the same properties as the old one.
-        self.assertEqual(imported_split_test_block.display_name, split_test_block.display_name)
-        self.assertEqual(len(imported_split_test_block.children), len(split_test_block.children))
-        self.assertEqual(imported_split_test_block.children, split_test_block.children)
-        self.assertEqual(imported_split_test_block.user_partition_id, split_test_block.user_partition_id)
-        self.assertEqual(imported_split_test_block.group_id_to_child['0'], str(split_test_block.group_id_to_child['0']))
-        self.assertEqual(imported_split_test_block.group_id_to_child['1'], str(split_test_block.group_id_to_child['1']))
+        assert imported_split_test_block.display_name == split_test_block.display_name
+        assert len(imported_split_test_block.children) == len(split_test_block.children)
+        assert imported_split_test_block.children == split_test_block.children
+        assert imported_split_test_block.user_partition_id == split_test_block.user_partition_id
+        assert imported_split_test_block.group_id_to_child['0'] == str(split_test_block.group_id_to_child['0'])
+        assert imported_split_test_block.group_id_to_child['1'] == str(split_test_block.group_id_to_child['1'])
diff --git a/common/lib/xmodule/xmodule/tests/test_studio_editable.py b/common/lib/xmodule/xmodule/tests/test_studio_editable.py
index 467c99f5fb597da42d5a7844306abf7e50da23f9..cd985ccaff9dc59cb349806813efa6c653d2bb36 100644
--- a/common/lib/xmodule/xmodule/tests/test_studio_editable.py
+++ b/common/lib/xmodule/xmodule/tests/test_studio_editable.py
@@ -25,5 +25,5 @@ class StudioEditableModuleTestCase(BaseVerticalBlockTest):
 
         # Both children of the vertical should be rendered as reorderable
         self.module_system.render(self.vertical, AUTHOR_VIEW, context).content  # pylint: disable=expression-not-assigned
-        self.assertIn(self.vertical.get_children()[0].location, reorderable_items)
-        self.assertIn(self.vertical.get_children()[1].location, reorderable_items)
+        assert self.vertical.get_children()[0].location in reorderable_items
+        assert self.vertical.get_children()[1].location in reorderable_items
diff --git a/common/lib/xmodule/xmodule/tests/test_unit_block.py b/common/lib/xmodule/xmodule/tests/test_unit_block.py
index af6690f0e15a706546e94facc847725e1ae09053..2f71bf6d34f50a51cd3b9656cc0a6dfbe9f21eb6 100644
--- a/common/lib/xmodule/xmodule/tests/test_unit_block.py
+++ b/common/lib/xmodule/xmodule/tests/test_unit_block.py
@@ -72,7 +72,7 @@ class UnitBlockTests(XmlTest, unittest.TestCase):
         The unit XBlock is designed to hold other XBlocks, so check that its
         completion status is defined as the aggregation of its child blocks.
         """
-        self.assertEqual(XBlockCompletionMode.get_mode(UnitBlock), XBlockCompletionMode.AGGREGATOR)
+        assert XBlockCompletionMode.get_mode(UnitBlock) == XBlockCompletionMode.AGGREGATOR
 
     def assertXmlEqual(self, xml_str_a, xml_str_b):
         """
@@ -84,4 +84,4 @@ class UnitBlockTests(XmlTest, unittest.TestCase):
             xml_str = re.sub(r'(\s)\s+', r'\1', xml_str)
             xml_bytes = xml_str.encode('utf8')
             return minidom.parseString(xml_bytes).toprettyxml()
-        self.assertEqual(clean(xml_str_a), clean(xml_str_b))
+        assert clean(xml_str_a) == clean(xml_str_b)
diff --git a/common/lib/xmodule/xmodule/tests/test_util_duedate.py b/common/lib/xmodule/xmodule/tests/test_util_duedate.py
index ab4e1db22b798acbb0fd2e0d2e76cfdb0ea96b90..f041e7a0b0b0bb67f90024807ec6615b5dcc5c87 100644
--- a/common/lib/xmodule/xmodule/tests/test_util_duedate.py
+++ b/common/lib/xmodule/xmodule/tests/test_util_duedate.py
@@ -27,39 +27,39 @@ class TestGetExtendedDueDate(unittest.TestCase):
         Test no due date.
         """
         node = object()
-        self.assertEqual(self.call_fut(node), None)
+        assert self.call_fut(node) is None
 
     def test_due_date_no_extension(self):
         """
         Test due date without extension.
         """
         node = mock.Mock(due=1, extended_due=None)
-        self.assertEqual(self.call_fut(node), 1)
+        assert self.call_fut(node) == 1
 
     def test_due_date_with_extension(self):
         """
         Test due date with extension.
         """
         node = mock.Mock(due=1, extended_due=2)
-        self.assertEqual(self.call_fut(node), 2)
+        assert self.call_fut(node) == 2
 
     def test_due_date_extension_is_earlier(self):
         """
         Test due date with extension, but due date is later than extension.
         """
         node = mock.Mock(due=2, extended_due=1)
-        self.assertEqual(self.call_fut(node), 2)
+        assert self.call_fut(node) == 2
 
     def test_extension_without_due_date(self):
         """
         Test non-sensical extension without due date.
         """
         node = mock.Mock(due=None, extended_due=1)
-        self.assertEqual(self.call_fut(node), None)
+        assert self.call_fut(node) is None
 
     def test_due_date_with_extension_dict(self):
         """
         Test due date with extension when node is a dict.
         """
         node = {'due': 1, 'extended_due': 2}
-        self.assertEqual(self.call_fut(node), 2)
+        assert self.call_fut(node) == 2
diff --git a/common/lib/xmodule/xmodule/tests/test_utils_escape_html_characters.py b/common/lib/xmodule/xmodule/tests/test_utils_escape_html_characters.py
index 8ec8ee5ca7c5dcc80473f3d994dd5cf0b94de675..59a1074f451a145244c8e9321ba9b606f1a80009 100644
--- a/common/lib/xmodule/xmodule/tests/test_utils_escape_html_characters.py
+++ b/common/lib/xmodule/xmodule/tests/test_utils_escape_html_characters.py
@@ -19,7 +19,7 @@ class UtilHtmlEscapeTests(TestCase):
 
             This is a paragraph.
             """
-        self.assertEqual(escape_html_characters(html_content), self.final_content)
+        assert escape_html_characters(html_content) == self.final_content
 
     def test_escape_cdata_comments(self):
         html_content = """
@@ -39,7 +39,7 @@ class UtilHtmlEscapeTests(TestCase):
 
             This is a paragraph.
             """
-        self.assertEqual(escape_html_characters(html_content), self.final_content)
+        assert escape_html_characters(html_content) == self.final_content
 
     def test_escape_non_breaking_space(self):
         html_content = """
@@ -60,4 +60,4 @@ class UtilHtmlEscapeTests(TestCase):
             ]]>
             This is a paragraph.&nbsp;
         """
-        self.assertEqual(escape_html_characters(html_content), self.final_content)
+        assert escape_html_characters(html_content) == self.final_content
diff --git a/common/lib/xmodule/xmodule/tests/test_validation.py b/common/lib/xmodule/xmodule/tests/test_validation.py
index 90e8faaadd3095f2447d4bd205d0e507f6e040a3..86db7833033b6b3cc31bcae6e385938b213953c7 100644
--- a/common/lib/xmodule/xmodule/tests/test_validation.py
+++ b/common/lib/xmodule/xmodule/tests/test_validation.py
@@ -36,38 +36,24 @@ class StudioValidationMessageTest(unittest.TestCase):
         """
         Test the `to_json` method.
         """
-        self.assertEqual(
-            {
-                "type": StudioValidationMessage.NOT_CONFIGURED,
-                "text": u"Not Configured message",
-                "action_label": u"Action label"
-            },
-            StudioValidationMessage(
-                StudioValidationMessage.NOT_CONFIGURED, u"Not Configured message", action_label=u"Action label"
-            ).to_json()
-        )
-
-        self.assertEqual(
-            {
-                "type": StudioValidationMessage.WARNING,
-                "text": u"Warning message",
-                "action_class": "class-for-action"
-            },
-            StudioValidationMessage(
-                StudioValidationMessage.WARNING, u"Warning message", action_class="class-for-action"
-            ).to_json()
-        )
-
-        self.assertEqual(
-            {
-                "type": StudioValidationMessage.ERROR,
-                "text": u"Error message",
-                "action_runtime_event": "do-fix-up"
-            },
-            StudioValidationMessage(
-                StudioValidationMessage.ERROR, u"Error message", action_runtime_event="do-fix-up"
-            ).to_json()
-        )
+        assert \
+            {'type': StudioValidationMessage.NOT_CONFIGURED,
+             'text': u'Not Configured message', 'action_label': u'Action label'} == \
+            StudioValidationMessage(StudioValidationMessage.NOT_CONFIGURED,
+                                    u'Not Configured message', action_label=u'Action label').to_json()
+
+        assert \
+            {'type': StudioValidationMessage.WARNING,
+             'text': u'Warning message',
+             'action_class': 'class-for-action'} ==\
+            StudioValidationMessage(StudioValidationMessage.WARNING, u'Warning message',
+                                    action_class='class-for-action').to_json()
+
+        assert \
+            {'type': StudioValidationMessage.ERROR,
+             'text': u'Error message', 'action_runtime_event': 'do-fix-up'} ==\
+            StudioValidationMessage(StudioValidationMessage.ERROR,
+                                    u'Error message', action_runtime_event='do-fix-up').to_json()
 
 
 class StudioValidationTest(unittest.TestCase):
@@ -80,15 +66,15 @@ class StudioValidationTest(unittest.TestCase):
         validation.add(ValidationMessage(ValidationMessage.ERROR, u"Error message"))
 
         studio_validation = StudioValidation.copy(validation)
-        self.assertIsInstance(studio_validation, StudioValidation)
-        self.assertFalse(studio_validation)
-        self.assertEqual(1, len(studio_validation.messages))
+        assert isinstance(studio_validation, StudioValidation)
+        assert not studio_validation
+        assert 1 == len(studio_validation.messages)
         expected = {
             "type": StudioValidationMessage.ERROR,
             "text": u"Error message"
         }
-        self.assertEqual(expected, studio_validation.messages[0].to_json())
-        self.assertIsNone(studio_validation.summary)
+        assert expected == studio_validation.messages[0].to_json()
+        assert studio_validation.summary is None
 
     def test_copy_studio_validation(self):
         validation = StudioValidation("id")
@@ -97,14 +83,14 @@ class StudioValidationTest(unittest.TestCase):
         )
 
         validation_copy = StudioValidation.copy(validation)
-        self.assertFalse(validation_copy)
-        self.assertEqual(1, len(validation_copy.messages))
+        assert not validation_copy
+        assert 1 == len(validation_copy.messages)
         expected = {
             "type": StudioValidationMessage.WARNING,
             "text": u"Warning message",
             "action_label": u"Action Label"
         }
-        self.assertEqual(expected, validation_copy.messages[0].to_json())
+        assert expected == validation_copy.messages[0].to_json()
 
     def test_copy_errors(self):
         with pytest.raises(TypeError):
@@ -116,19 +102,19 @@ class StudioValidationTest(unittest.TestCase):
         Also test the "bool" property of `Validation`.
         """
         validation = StudioValidation("id")
-        self.assertTrue(validation.empty)
-        self.assertTrue(validation)
+        assert validation.empty
+        assert validation
 
         validation.add(StudioValidationMessage(StudioValidationMessage.ERROR, u"Error message"))
-        self.assertFalse(validation.empty)
-        self.assertFalse(validation)
+        assert not validation.empty
+        assert not validation
 
         validation_with_summary = StudioValidation("id")
         validation_with_summary.set_summary(
             StudioValidationMessage(StudioValidationMessage.NOT_CONFIGURED, u"Summary message")
         )
-        self.assertFalse(validation.empty)
-        self.assertFalse(validation)
+        assert not validation.empty
+        assert not validation
 
     def test_add_messages(self):
         """
@@ -143,16 +129,16 @@ class StudioValidationTest(unittest.TestCase):
         validation_2.add(StudioValidationMessage(StudioValidationMessage.NOT_CONFIGURED, u"Not configured"))
 
         validation_1.add_messages(validation_2)
-        self.assertEqual(2, len(validation_1.messages))
+        assert 2 == len(validation_1.messages)
 
-        self.assertEqual(StudioValidationMessage.ERROR, validation_1.messages[0].type)
-        self.assertEqual(u"Error message", validation_1.messages[0].text)
+        assert StudioValidationMessage.ERROR == validation_1.messages[0].type
+        assert u'Error message' == validation_1.messages[0].text
 
-        self.assertEqual(StudioValidationMessage.NOT_CONFIGURED, validation_1.messages[1].type)
-        self.assertEqual(u"Not configured", validation_1.messages[1].text)
+        assert StudioValidationMessage.NOT_CONFIGURED == validation_1.messages[1].type
+        assert u'Not configured' == validation_1.messages[1].text
 
-        self.assertEqual(StudioValidationMessage.WARNING, validation_1.summary.type)
-        self.assertEqual(u"Summary message", validation_1.summary.text)
+        assert StudioValidationMessage.WARNING == validation_1.summary.type
+        assert u'Summary message' == validation_1.summary.text
 
     def test_set_summary_accepts_validation_message(self):
         """
@@ -160,8 +146,8 @@ class StudioValidationTest(unittest.TestCase):
         """
         validation = StudioValidation("id")
         validation.set_summary(ValidationMessage(ValidationMessage.WARNING, u"Summary message"))
-        self.assertEqual(ValidationMessage.WARNING, validation.summary.type)
-        self.assertEqual(u"Summary message", validation.summary.text)
+        assert ValidationMessage.WARNING == validation.summary.type
+        assert u'Summary message' == validation.summary.text
 
     def test_set_summary_errors(self):
         """
@@ -180,7 +166,7 @@ class StudioValidationTest(unittest.TestCase):
             "messages": [],
             "empty": True
         }
-        self.assertEqual(expected, validation.to_json())
+        assert expected == validation.to_json()
 
         validation.add(
             StudioValidationMessage(
@@ -233,4 +219,4 @@ class StudioValidationTest(unittest.TestCase):
             },
             "empty": False
         }
-        self.assertEqual(expected, validation.to_json())
+        assert expected == validation.to_json()
diff --git a/common/lib/xmodule/xmodule/tests/test_vertical.py b/common/lib/xmodule/xmodule/tests/test_vertical.py
index ca50f60286081b9f728043d0aa6e21e881226b6f..3034688c1831fb97c7eb879ecb2e7fe9ab2af292 100644
--- a/common/lib/xmodule/xmodule/tests/test_vertical.py
+++ b/common/lib/xmodule/xmodule/tests/test_vertical.py
@@ -156,22 +156,22 @@ class VerticalBlockTestCase(BaseVerticalBlockTest):
         html = self.module_system.render(
             self.vertical, view, self.default_context if context is None else context
         ).content
-        self.assertIn(self.test_html, html)
+        assert self.test_html in html
         if view == STUDENT_VIEW:
-            self.assertIn(self.test_problem, html)
+            assert self.test_problem in html
         else:
-            self.assertNotIn(self.test_problem, html)
-        self.assertIn("'due': datetime.datetime({year}, {month}, {day}".format(
-            year=self.vertical.due.year, month=self.vertical.due.month, day=self.vertical.due.day), html)
+            assert self.test_problem not in html
+        assert f"'due': datetime.datetime({self.vertical.due.year}, {self.vertical.due.month}, {self.vertical.due.day}"\
+               in html
         if view == STUDENT_VIEW:
             self.assert_bookmark_info(self.assertIn, html)
         else:
             self.assert_bookmark_info(self.assertNotIn, html)
         if context:
-            self.assertIn("'has_assignments': True", html)
-            self.assertIn("'subsection_format': '{}'".format(context['format']), html)
-            self.assertIn("'completed': {}".format(completion_value == 1), html)
-            self.assertIn("'past_due': {}".format(self.vertical.due < now), html)
+            assert "'has_assignments': True" in html
+            assert "'subsection_format': '{}'".format(context['format']) in html
+            assert "'completed': {}".format((completion_value == 1)) in html
+            assert "'past_due': {}".format((self.vertical.due < now)) in html
 
     @ddt.data(True, False)
     def test_render_problem_without_score(self, has_score):
@@ -188,13 +188,13 @@ class VerticalBlockTestCase(BaseVerticalBlockTest):
 
         html = self.module_system.render(self.vertical, STUDENT_VIEW, self.default_context).content
         if has_score:
-            self.assertIn("'has_assignments': True", html)
-            self.assertIn("'completed': False", html)
-            self.assertIn("'past_due': True", html)
+            assert "'has_assignments': True" in html
+            assert "'completed': False" in html
+            assert "'past_due': True" in html
         else:
-            self.assertIn("'has_assignments': False", html)
-            self.assertIn("'completed': None", html)
-            self.assertIn("'past_due': False", html)
+            assert "'has_assignments': False" in html
+            assert "'completed': None" in html
+            assert "'past_due': False" in html
 
     @ddt.data(True, False)
     def test_render_access_denied_blocks(self, has_access_error):
@@ -208,9 +208,9 @@ class VerticalBlockTestCase(BaseVerticalBlockTest):
         html = self.module_system.render(self.vertical, STUDENT_VIEW, context).content
 
         if has_access_error:
-            self.assertNotIn(self.test_problem, html)
+            assert self.test_problem not in html
         else:
-            self.assertIn(self.test_problem, html)
+            assert self.test_problem in html
 
     @ddt.unpack
     @ddt.data(
@@ -231,11 +231,10 @@ class VerticalBlockTestCase(BaseVerticalBlockTest):
             )
             self.module_system.render(self.vertical, STUDENT_VIEW, self.default_context)
             if mark_completed_enabled:
-                self.assertEqual(
-                    mock_student_view.call_args[0][1]['wrap_xblock_data']['mark-completed-on-view-after-delay'], 9876
-                )
+                assert mock_student_view.call_args[0][1]['wrap_xblock_data']['mark-completed-on-view-after-delay'] ==\
+                       9876
             else:
-                self.assertNotIn('wrap_xblock_data', mock_student_view.call_args[0][1])
+                assert 'wrap_xblock_data' not in mock_student_view.call_args[0][1]
 
     def test_render_studio_view(self):
         """
@@ -246,8 +245,8 @@ class VerticalBlockTestCase(BaseVerticalBlockTest):
             'is_unit_page': True
         }
         html = self.module_system.render(self.vertical, AUTHOR_VIEW, context).content
-        self.assertNotIn(self.test_html, html)
-        self.assertNotIn(self.test_problem, html)
+        assert self.test_html not in html
+        assert self.test_problem not in html
 
         # Vertical should render reorderable children on the container page
         reorderable_items = set()
@@ -256,5 +255,5 @@ class VerticalBlockTestCase(BaseVerticalBlockTest):
             'reorderable_items': reorderable_items,
         }
         html = self.module_system.render(self.vertical, AUTHOR_VIEW, context).content
-        self.assertIn(self.test_html, html)
-        self.assertIn(self.test_problem, html)
+        assert self.test_html in html
+        assert self.test_problem in html
diff --git a/common/lib/xmodule/xmodule/tests/test_video.py b/common/lib/xmodule/xmodule/tests/test_video.py
index 00f0f260271fc822ed99d5a0d92a29746b7b5d40..0b9d508f19ffd02b4871dd815bd7d54a4b7310f5 100644
--- a/common/lib/xmodule/xmodule/tests/test_video.py
+++ b/common/lib/xmodule/xmodule/tests/test_video.py
@@ -21,7 +21,7 @@ import shutil
 import unittest
 from tempfile import mkdtemp
 from uuid import uuid4
-
+import pytest
 import ddt
 import httpretty
 import six
@@ -125,10 +125,7 @@ class VideoBlockTest(unittest.TestCase):
         """Test parsing old-style Youtube ID strings into a dict."""
         youtube_str = '0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg'
         output = VideoBlock._parse_youtube(youtube_str)
-        self.assertEqual(output, {'0.75': 'jNCf2gIqpeE',
-                                  '1.00': 'ZwkTiUPN0mg',
-                                  '1.25': 'rsq9auxASqI',
-                                  '1.50': 'kMyNdzVHHgg'})
+        assert output == {'0.75': 'jNCf2gIqpeE', '1.00': 'ZwkTiUPN0mg', '1.25': 'rsq9auxASqI', '1.50': 'kMyNdzVHHgg'}
 
     def test_parse_youtube_one_video(self):
         """
@@ -137,35 +134,23 @@ class VideoBlockTest(unittest.TestCase):
         """
         youtube_str = '0.75:jNCf2gIqpeE'
         output = VideoBlock._parse_youtube(youtube_str)
-        self.assertEqual(output, {'0.75': 'jNCf2gIqpeE',
-                                  '1.00': '',
-                                  '1.25': '',
-                                  '1.50': ''})
+        assert output == {'0.75': 'jNCf2gIqpeE', '1.00': '', '1.25': '', '1.50': ''}
 
     def test_parse_youtube_invalid(self):
         """Ensure that ids that are invalid return an empty dict"""
         # invalid id
         youtube_str = 'thisisaninvalidid'
         output = VideoBlock._parse_youtube(youtube_str)
-        self.assertEqual(output, {'0.75': '',
-                                  '1.00': '',
-                                  '1.25': '',
-                                  '1.50': ''})
+        assert output == {'0.75': '', '1.00': '', '1.25': '', '1.50': ''}
         # another invalid id
         youtube_str = ',::,:,,'
         output = VideoBlock._parse_youtube(youtube_str)
-        self.assertEqual(output, {'0.75': '',
-                                  '1.00': '',
-                                  '1.25': '',
-                                  '1.50': ''})
+        assert output == {'0.75': '', '1.00': '', '1.25': '', '1.50': ''}
 
         # and another one, partially invalid
         youtube_str = '0.75_BAD!!!,1.0:AXdE34_U,1.25:KLHF9K_Y,1.5:VO3SxfeD,'
         output = VideoBlock._parse_youtube(youtube_str)
-        self.assertEqual(output, {'0.75': '',
-                                  '1.00': 'AXdE34_U',
-                                  '1.25': 'KLHF9K_Y',
-                                  '1.50': 'VO3SxfeD'})
+        assert output == {'0.75': '', '1.00': 'AXdE34_U', '1.25': 'KLHF9K_Y', '1.50': 'VO3SxfeD'}
 
     def test_parse_youtube_key_format(self):
         """
@@ -173,23 +158,14 @@ class VideoBlockTest(unittest.TestCase):
         """
         youtube_str = '1.00:p2Q6BrNhdh8'
         youtube_str_hack = '1.0:p2Q6BrNhdh8'
-        self.assertEqual(
-            VideoBlock._parse_youtube(youtube_str),
-            VideoBlock._parse_youtube(youtube_str_hack)
-        )
+        assert VideoBlock._parse_youtube(youtube_str) == VideoBlock._parse_youtube(youtube_str_hack)
 
     def test_parse_youtube_empty(self):
         """
         Some courses have empty youtube attributes, so we should handle
         that well.
         """
-        self.assertEqual(
-            VideoBlock._parse_youtube(''),
-            {'0.75': '',
-             '1.00': '',
-             '1.25': '',
-             '1.50': ''}
-        )
+        assert VideoBlock._parse_youtube('') == {'0.75': '', '1.00': '', '1.25': '', '1.50': ''}
 
 
 class VideoBlockTestBase(unittest.TestCase):
@@ -213,9 +189,9 @@ class VideoBlockTestBase(unittest.TestCase):
         for attr in ['tag', 'attrib', 'text', 'tail']:
             expected_attr = getattr(expected, attr)
             actual_attr = getattr(xml, attr)
-            self.assertEqual(expected_attr, actual_attr)
+            assert expected_attr == actual_attr
 
-        self.assertEqual(get_child_tags(expected), get_child_tags(xml))
+        assert get_child_tags(expected) == get_child_tags(xml)
         for left, right in zip(expected, xml):
             self.assertXmlEqual(left, right)
 
@@ -234,7 +210,7 @@ class TestCreateYoutubeString(VideoBlockTestBase):
         self.descriptor.youtube_id_1_25 = '1EeWXzPdhSA'
         self.descriptor.youtube_id_1_5 = 'rABDYkeK0x8'
         expected = "0.75:izygArpw-Qo,1.00:p2Q6BrNhdh8,1.25:1EeWXzPdhSA,1.50:rABDYkeK0x8"
-        self.assertEqual(create_youtube_string(self.descriptor), expected)
+        assert create_youtube_string(self.descriptor) == expected
 
     def test_create_youtube_string_missing(self):
         """
@@ -244,7 +220,7 @@ class TestCreateYoutubeString(VideoBlockTestBase):
         self.descriptor.youtube_id_1_0 = 'p2Q6BrNhdh8'
         self.descriptor.youtube_id_1_25 = '1EeWXzPdhSA'
         expected = "0.75:izygArpw-Qo,1.00:p2Q6BrNhdh8,1.25:1EeWXzPdhSA"
-        self.assertEqual(create_youtube_string(self.descriptor), expected)
+        assert create_youtube_string(self.descriptor) == expected
 
 
 class TestCreateYouTubeUrl(VideoBlockTestBase):
@@ -271,7 +247,7 @@ class VideoBlockImportTestCase(TestCase):
         Assert that `video` has the correct attributes. `attrs` is a map of {metadata_field: value}.
         """
         for key, value in attrs.items():
-            self.assertEqual(getattr(video, key), value)
+            assert getattr(video, key) == value
 
     def test_constructor(self):
         sample_xml = '''
@@ -636,13 +612,13 @@ class VideoBlockImportTestCase(TestCase):
         """
         def mock_val_import(xml, edx_video_id, resource_fs, static_dir, external_transcripts, course_id):
             """Mock edxval.api.import_from_xml"""
-            self.assertEqual(xml.tag, 'video_asset')
-            self.assertEqual(dict(list(xml.items())), {'mock_attr': ''})
-            self.assertEqual(edx_video_id, 'test_edx_video_id')
-            self.assertEqual(static_dir, EXPORT_IMPORT_STATIC_DIR)
-            self.assertIsNotNone(resource_fs)
-            self.assertEqual(external_transcripts, {u'en': [u'subs_3_yD_cEKoCk.srt.sjson']})
-            self.assertEqual(course_id, 'test_course_id')
+            assert xml.tag == 'video_asset'
+            assert dict(list(xml.items())) == {'mock_attr': ''}
+            assert edx_video_id == 'test_edx_video_id'
+            assert static_dir == EXPORT_IMPORT_STATIC_DIR
+            assert resource_fs is not None
+            assert external_transcripts == {u'en': [u'subs_3_yD_cEKoCk.srt.sjson']}
+            assert course_id == 'test_course_id'
             return edx_video_id
 
         edx_video_id = 'test_edx_video_id'
@@ -686,7 +662,7 @@ class VideoBlockImportTestCase(TestCase):
                 <video_asset client_video_id="test_client_video_id" duration="-1"/>
             </video>
         """
-        with self.assertRaises(mock_val_api.ValCannotCreateError):
+        with pytest.raises(mock_val_api.ValCannotCreateError):
             VideoBlock.from_xml(xml_data, module_system, id_generator=Mock())
 
 
@@ -811,7 +787,7 @@ class VideoExportTestCase(VideoBlockTestBase):
         xml = self.descriptor.definition_to_xml(self.file_system)
         # Check that download_video field is also set to default (False) in xml for backward compatibility
         expected = '<video url_name="SampleProblem"/>\n'
-        self.assertEqual(expected, etree.tostring(xml, pretty_print=True).decode('utf-8'))
+        assert expected == etree.tostring(xml, pretty_print=True).decode('utf-8')
 
     @patch('xmodule.video_module.video_module.edxval_api', None)
     def test_export_to_xml_with_transcripts_as_none(self):
@@ -821,7 +797,7 @@ class VideoExportTestCase(VideoBlockTestBase):
         self.descriptor.transcripts = None
         xml = self.descriptor.definition_to_xml(self.file_system)
         expected = b'<video url_name="SampleProblem"/>\n'
-        self.assertEqual(expected, etree.tostring(xml, pretty_print=True))
+        assert expected == etree.tostring(xml, pretty_print=True)
 
     @patch('xmodule.video_module.video_module.edxval_api', None)
     def test_export_to_xml_invalid_characters_in_attributes(self):
@@ -831,7 +807,7 @@ class VideoExportTestCase(VideoBlockTestBase):
         """
         self.descriptor.display_name = 'Display\x1eName'
         xml = self.descriptor.definition_to_xml(self.file_system)
-        self.assertEqual(xml.get('display_name'), 'DisplayName')
+        assert xml.get('display_name') == 'DisplayName'
 
     @patch('xmodule.video_module.video_module.edxval_api', None)
     def test_export_to_xml_unicode_characters(self):
@@ -840,7 +816,7 @@ class VideoExportTestCase(VideoBlockTestBase):
         """
         self.descriptor.display_name = u'这是文'
         xml = self.descriptor.definition_to_xml(self.file_system)
-        self.assertEqual(xml.get('display_name'), u'\u8fd9\u662f\u6587')
+        assert xml.get('display_name') == u'这是文'
 
 
 @ddt.ddt
@@ -889,7 +865,7 @@ class VideoBlockStudentViewDataTestCase(unittest.TestCase):
         descriptor = instantiate_descriptor(**field_data)
         descriptor.runtime.course_id = MagicMock()
         student_view_data = descriptor.student_view_data()
-        self.assertEqual(student_view_data, expected_student_view_data)
+        assert student_view_data == expected_student_view_data
 
     @patch('xmodule.video_module.video_module.HLSPlaybackEnabledFlag.feature_enabled', Mock(return_value=True))
     @patch('xmodule.video_module.transcripts_utils.get_available_transcript_languages', Mock(return_value=['es']))
@@ -987,10 +963,7 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
             </video>
         '''
         descriptor = instantiate_descriptor(data=xml_data)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {"display_name": "Test Video"},
-            "content_type": "Video"
-        })
+        assert descriptor.index_dictionary() == {'content': {'display_name': 'Test Video'}, 'content_type': 'Video'}
 
     @httpretty.activate
     def test_video_with_youtube_subs_index_dictionary(self):
@@ -1022,13 +995,8 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
         descriptor = instantiate_descriptor(data=xml_data_sub)
         subs = download_youtube_subs(yt_subs_id, descriptor, settings)
         save_subs_to_store(json.loads(subs), yt_subs_id, descriptor)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {
-                "display_name": "Test Video",
-                "transcript_en": YOUTUBE_SUBTITLES
-            },
-            "content_type": "Video"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'display_name': 'Test Video', 'transcript_en': YOUTUBE_SUBTITLES}, 'content_type': 'Video'}
 
     @httpretty.activate
     def test_video_with_subs_and_transcript_index_dictionary(self):
@@ -1063,14 +1031,10 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
         subs = download_youtube_subs(yt_subs_id, descriptor, settings)
         save_subs_to_store(json.loads(subs), yt_subs_id, descriptor)
         save_to_store(SRT_FILEDATA, "subs_grmtran1.srt", 'text/srt', descriptor.location)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {
-                "display_name": "Test Video",
-                "transcript_en": YOUTUBE_SUBTITLES,
-                "transcript_ge": "sprechen sie deutsch? Ja, ich spreche Deutsch",
-            },
-            "content_type": "Video"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'display_name': 'Test Video', 'transcript_en': YOUTUBE_SUBTITLES,
+                            'transcript_ge': 'sprechen sie deutsch? Ja, ich spreche Deutsch'},
+                'content_type': 'Video'}
 
     def test_video_with_multiple_transcripts_index_dictionary(self):
         """
@@ -1096,14 +1060,10 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
         descriptor = instantiate_descriptor(data=xml_data_transcripts)
         save_to_store(SRT_FILEDATA, "subs_grmtran1.srt", 'text/srt', descriptor.location)
         save_to_store(CRO_SRT_FILEDATA, "subs_croatian1.srt", 'text/srt', descriptor.location)
-        self.assertEqual(descriptor.index_dictionary(), {
-            "content": {
-                "display_name": "Test Video",
-                "transcript_ge": "sprechen sie deutsch? Ja, ich spreche Deutsch",
-                "transcript_hr": "Dobar dan! Kako ste danas?"
-            },
-            "content_type": "Video"
-        })
+        assert descriptor.index_dictionary() ==\
+               {'content': {'display_name': 'Test Video',
+                            'transcript_ge': 'sprechen sie deutsch? Ja, ich spreche Deutsch',
+                            'transcript_hr': 'Dobar dan! Kako ste danas?'}, 'content_type': 'Video'}
 
     def test_video_with_multiple_transcripts_translation_retrieval(self):
         """
@@ -1128,7 +1088,7 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
 
         descriptor = instantiate_descriptor(data=xml_data_transcripts)
         translations = descriptor.available_translations(descriptor.get_transcripts_info())
-        self.assertEqual(sorted(translations), sorted(['hr', 'ge']))
+        assert sorted(translations) == sorted(['hr', 'ge'])
 
     def test_video_with_no_transcripts_translation_retrieval(self):
         """
@@ -1138,13 +1098,13 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
         """
         descriptor = instantiate_descriptor(data=None)
         translations_with_fallback = descriptor.available_translations(descriptor.get_transcripts_info())
-        self.assertEqual(translations_with_fallback, ['en'])
+        assert translations_with_fallback == ['en']
 
         with patch.dict(settings.FEATURES, FALLBACK_TO_ENGLISH_TRANSCRIPTS=False):
             # Some organizations don't have English transcripts for all videos
             # This feature makes it configurable
             translations_no_fallback = descriptor.available_translations(descriptor.get_transcripts_info())
-            self.assertEqual(translations_no_fallback, [])
+            assert translations_no_fallback == []
 
     @override_settings(ALL_LANGUAGES=ALL_LANGUAGES)
     def test_video_with_language_do_not_have_transcripts_translation(self):
@@ -1168,7 +1128,7 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
         '''
         descriptor = instantiate_descriptor(data=xml_data_transcripts)
         translations = descriptor.available_translations(descriptor.get_transcripts_info(), verify_assets=False)
-        self.assertNotEqual(translations, ['ur'])
+        assert translations != ['ur']
 
     def assert_validation_message(self, validation, expected_msg):
         """
@@ -1178,12 +1138,11 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
             validation (StudioValidation): A validation object.
             expected_msg (string): An expected validation message.
         """
-        self.assertFalse(validation.empty)  # Validation contains some warning/message
-        self.assertTrue(validation.summary)
-        self.assertEqual(StudioValidationMessage.WARNING, validation.summary.type)
-        self.assertIn(
-            expected_msg, validation.summary.text.replace('Urdu, Esperanto', 'Esperanto, Urdu')
-        )
+        assert not validation.empty
+        # Validation contains some warning/message
+        assert validation.summary
+        assert StudioValidationMessage.WARNING == validation.summary.type
+        assert expected_msg in validation.summary.text.replace('Urdu, Esperanto', 'Esperanto, Urdu')
 
     @ddt.data(
         (
@@ -1227,4 +1186,4 @@ class VideoBlockIndexingTestCase(unittest.TestCase):
         descriptor.transcripts = None
         response = descriptor.get_transcripts_info()
         expected = {'transcripts': {}, 'sub': ''}
-        self.assertEqual(expected, response)
+        assert expected == response
diff --git a/common/lib/xmodule/xmodule/tests/test_word_cloud.py b/common/lib/xmodule/xmodule/tests/test_word_cloud.py
index 3b56ee36cf47a90469dceecb7e49905d68d2be21..9c3d6c23d04f8cb14c0ee0324d438cad17eade1b 100644
--- a/common/lib/xmodule/xmodule/tests/test_word_cloud.py
+++ b/common/lib/xmodule/xmodule/tests/test_word_cloud.py
@@ -48,11 +48,11 @@ class WordCloudBlockTest(TestCase):
             CourseLocator('org', 'course', 'run', branch='revision'), 'word_cloud', 'block_id'
         )
 
-        self.assertEqual(block.display_name, 'Favorite Fruits')
-        self.assertFalse(block.display_student_percents)
-        self.assertEqual(block.instructions, 'What are your favorite fruits?')
-        self.assertEqual(block.num_inputs, 3)
-        self.assertEqual(block.num_top_words, 100)
+        assert block.display_name == 'Favorite Fruits'
+        assert not block.display_student_percents
+        assert block.instructions == 'What are your favorite fruits?'
+        assert block.num_inputs == 3
+        assert block.num_top_words == 100
 
         node = etree.Element("unknown_root")
         # This will export the olx to a separate file.
@@ -60,7 +60,7 @@ class WordCloudBlockTest(TestCase):
         with runtime.export_fs.open(u'word_cloud/block_id.xml') as f:
             exported_xml = f.read()
 
-        self.assertEqual(exported_xml, original_xml)
+        assert exported_xml == original_xml
 
     def test_bad_ajax_request(self):
         """
@@ -86,9 +86,9 @@ class WordCloudBlockTest(TestCase):
 
         post_data = MultiDict(('student_words[]', word) for word in ['cat', 'cat', 'dog', 'sun'])
         response = json.loads(block.handle_ajax('submit', post_data))
-        self.assertEqual(response['status'], 'success')
-        self.assertEqual(response['submitted'], True)
-        self.assertEqual(response['total_count'], 22)
+        assert response['status'] == 'success'
+        assert response['submitted'] is True
+        assert response['total_count'] == 22
         self.assertDictEqual(
             response['student_words'],
             {'sun': 1, 'dog': 6, 'cat': 12}
@@ -103,7 +103,7 @@ class WordCloudBlockTest(TestCase):
              {'text': 'sun', 'size': 1, 'percent': 4.0}]
         )
 
-        self.assertEqual(100.0, sum(i['percent'] for i in response['top_words']))
+        assert 100.0 == sum((i['percent'] for i in response['top_words']))
 
     def test_indexibility(self):
         """
@@ -112,13 +112,7 @@ class WordCloudBlockTest(TestCase):
 
         module_system = get_test_system()
         block = WordCloudBlock(module_system, DictFieldData(self.raw_field_data), Mock())
-        self.assertEqual(
-            block.index_dictionary(),
-            {
-                'content_type': 'Word Cloud',
-                'content': {
-                    'display_name': 'Word Cloud Block',
-                    'instructions': 'Enter some random words that comes to your mind'
-                }
-            }
-        )
+        assert block.index_dictionary() ==\
+               {'content_type': 'Word Cloud',
+                'content': {'display_name': 'Word Cloud Block',
+                            'instructions': 'Enter some random words that comes to your mind'}}
diff --git a/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py b/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py
index 31111263a027a85d42bd528429ebbdd9f4aa87f1..6cf4ca954e7e948dcf5036ae81394cea864f7770 100644
--- a/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py
+++ b/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py
@@ -340,10 +340,7 @@ class TestStudentView(XBlockWrapperTestMixin, TestCase):
         """
         Assert that both student_view and get_html render the same.
         """
-        self.assertEqual(
-            descriptor._xmodule.get_html(),
-            descriptor.render(STUDENT_VIEW).content
-        )
+        assert descriptor._xmodule.get_html() == descriptor.render(STUDENT_VIEW).content
 
 
 class TestStudioView(XBlockWrapperTestMixin, TestCase):
@@ -367,7 +364,7 @@ class TestStudioView(XBlockWrapperTestMixin, TestCase):
         """
         html = descriptor.get_html()
         rendered_content = descriptor.render(STUDIO_VIEW).content
-        self.assertEqual(html, rendered_content)
+        assert html == rendered_content
 
 
 @ddt.ddt
@@ -392,8 +389,8 @@ class TestXModuleHandler(TestCase):
 
     def test_xmodule_handler_return_value(self):
         response = self.module.xmodule_handler(self.request)
-        self.assertIsInstance(response, webob.Response)
-        self.assertEqual(response.body.decode('utf-8'), '{}')
+        assert isinstance(response, webob.Response)
+        assert response.body.decode('utf-8') == '{}'
 
     @ddt.data(
         u'{"test_key": "test_value"}',
@@ -407,8 +404,8 @@ class TestXModuleHandler(TestCase):
 
         self.module.handle_ajax = Mock(return_value=response_data)
         response = self.module.xmodule_handler(self.request)
-        self.assertIsInstance(response, webob.Response)
-        self.assertEqual(response.body.decode('utf-8'), '{"test_key": "test_value"}')
+        assert isinstance(response, webob.Response)
+        assert response.body.decode('utf-8') == '{"test_key": "test_value"}'
 
 
 class TestXmlExport(XBlockWrapperTestMixin, TestCase):
@@ -430,8 +427,8 @@ class TestXmlExport(XBlockWrapperTestMixin, TestCase):
 
         xmodule_node = etree.fromstring(descriptor.export_to_xml(xmodule_api_fs))
 
-        self.assertEqual(list(xmodule_api_fs.walk()), list(xblock_api_fs.walk()))
-        self.assertEqual(etree.tostring(xmodule_node), etree.tostring(xblock_node))
+        assert list(xmodule_api_fs.walk()) == list(xblock_api_fs.walk())
+        assert etree.tostring(xmodule_node) == etree.tostring(xblock_node)
 
 
 class TestPublicView(XBlockWrapperTestMixin, TestCase):
@@ -453,12 +450,6 @@ class TestPublicView(XBlockWrapperTestMixin, TestCase):
         Assert that public_view contains correct message.
         """
         if descriptor.display_name:
-            self.assertIn(
-                descriptor.display_name,
-                descriptor.render(PUBLIC_VIEW).content
-            )
+            assert descriptor.display_name in descriptor.render(PUBLIC_VIEW).content
         else:
-            self.assertIn(
-                "This content is only accessible",
-                descriptor.render(PUBLIC_VIEW).content
-            )
+            assert 'This content is only accessible' in descriptor.render(PUBLIC_VIEW).content
diff --git a/common/lib/xmodule/xmodule/tests/test_xml_module.py b/common/lib/xmodule/xmodule/tests/test_xml_module.py
index d913ac93a6421afd80406e7aae33612cb85729a0..e081b54eae08d9872d83fb9894affe7b2e4a11c2 100644
--- a/common/lib/xmodule/xmodule/tests/test_xml_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_xml_module.py
@@ -131,8 +131,8 @@ class InheritingFieldDataTest(unittest.TestCase):
         Test that the Blocks with nothing set with return the fields' defaults.
         """
         block = self.get_a_block()
-        self.assertEqual(block.inherited, "the default")
-        self.assertEqual(block.not_inherited, "nothing")
+        assert block.inherited == 'the default'
+        assert block.not_inherited == 'nothing'
 
     def test_set_value(self):
         """
@@ -141,8 +141,8 @@ class InheritingFieldDataTest(unittest.TestCase):
         block = self.get_a_block()
         block.inherited = "Changed!"
         block.not_inherited = "New Value!"
-        self.assertEqual(block.inherited, "Changed!")
-        self.assertEqual(block.not_inherited, "New Value!")
+        assert block.inherited == 'Changed!'
+        assert block.not_inherited == 'New Value!'
 
     def test_inherited(self):
         """
@@ -150,11 +150,11 @@ class InheritingFieldDataTest(unittest.TestCase):
         """
         parent_block = self.get_a_block(usage_id=self.get_usage_id("course", "parent"))
         parent_block.inherited = "Changed!"
-        self.assertEqual(parent_block.inherited, "Changed!")
+        assert parent_block.inherited == 'Changed!'
 
         child = self.get_a_block(usage_id=self.get_usage_id("vertical", "child"))
         child.parent = parent_block.location
-        self.assertEqual(child.inherited, "Changed!")
+        assert child.inherited == 'Changed!'
 
     def test_inherited_across_generations(self):
         """
@@ -162,12 +162,12 @@ class InheritingFieldDataTest(unittest.TestCase):
         """
         parent = self.get_a_block(usage_id=self.get_usage_id("course", "parent"))
         parent.inherited = "Changed!"
-        self.assertEqual(parent.inherited, "Changed!")
+        assert parent.inherited == 'Changed!'
         for child_num in range(10):
             usage_id = self.get_usage_id("vertical", "child_{}".format(child_num))
             child = self.get_a_block(usage_id=usage_id)
             child.parent = parent.location
-            self.assertEqual(child.inherited, "Changed!")
+            assert child.inherited == 'Changed!'
 
     def test_not_inherited(self):
         """
@@ -175,11 +175,11 @@ class InheritingFieldDataTest(unittest.TestCase):
         """
         parent = self.get_a_block(usage_id=self.get_usage_id("course", "parent"))
         parent.not_inherited = "Changed!"
-        self.assertEqual(parent.not_inherited, "Changed!")
+        assert parent.not_inherited == 'Changed!'
 
         child = self.get_a_block(usage_id=self.get_usage_id("vertical", "child"))
         child.parent = parent.location
-        self.assertEqual(child.not_inherited, "nothing")
+        assert child.not_inherited == 'nothing'
 
     def test_non_defaults_inherited_across_lib(self):
         """
@@ -192,7 +192,7 @@ class InheritingFieldDataTest(unittest.TestCase):
             fields=dict(inherited="changed!"),
             defaults=dict(inherited="parent's default"),
         )
-        self.assertEqual(parent_block.inherited, "changed!")
+        assert parent_block.inherited == 'changed!'
 
         child = self.get_block_using_split_kvs(
             block_type="problem",
@@ -201,7 +201,7 @@ class InheritingFieldDataTest(unittest.TestCase):
             defaults={},
         )
         child.parent = parent_block.location
-        self.assertEqual(child.inherited, "changed!")
+        assert child.inherited == 'changed!'
 
     def test_defaults_not_inherited_across_lib(self):
         """
@@ -214,7 +214,7 @@ class InheritingFieldDataTest(unittest.TestCase):
             fields=dict(inherited="changed!"),
             defaults=dict(inherited="parent's default"),
         )
-        self.assertEqual(parent_block.inherited, "changed!")
+        assert parent_block.inherited == 'changed!'
 
         child = self.get_block_using_split_kvs(
             block_type="library_content",
@@ -223,7 +223,7 @@ class InheritingFieldDataTest(unittest.TestCase):
             defaults=dict(inherited="child's default"),
         )
         child.parent = parent_block.location
-        self.assertEqual(child.inherited, "child's default")
+        assert child.inherited == "child's default"
 
 
 class EditableMetadataFieldsTest(unittest.TestCase):
@@ -232,7 +232,7 @@ class EditableMetadataFieldsTest(unittest.TestCase):
         editable_fields = self.get_xml_editable_fields(DictFieldData({}))
         # Tests that the xblock fields (currently tags and name) get filtered out.
         # Also tests that xml_attributes is filtered out of XmlDescriptor.
-        self.assertEqual(1, len(editable_fields), editable_fields)
+        assert 1 == len(editable_fields), editable_fields
         self.assert_field_values(
             editable_fields, 'display_name', XModuleMixin.display_name,
             explicitly_set=False, value=None, default_value=None
@@ -249,7 +249,7 @@ class EditableMetadataFieldsTest(unittest.TestCase):
     def test_integer_field(self):
         descriptor = self.get_descriptor(DictFieldData({'max_attempts': '7'}))
         editable_fields = descriptor.editable_metadata_fields
-        self.assertEqual(8, len(editable_fields))
+        assert 8 == len(editable_fields)
         self.assert_field_values(
             editable_fields, 'max_attempts', TestFields.max_attempts,
             explicitly_set=True, value=7, default_value=1000, type='Integer',
@@ -355,17 +355,17 @@ class EditableMetadataFieldsTest(unittest.TestCase):
                             type='Generic', options=[]):  # lint-amnesty, pylint: disable=redefined-builtin
         test_field = editable_fields[name]
 
-        self.assertEqual(field.name, test_field['field_name'])
-        self.assertEqual(field.display_name, test_field['display_name'])
-        self.assertEqual(field.help, test_field['help'])
+        assert field.name == test_field['field_name']
+        assert field.display_name == test_field['display_name']
+        assert field.help == test_field['help']
 
-        self.assertEqual(field.to_json(value), test_field['value'])
-        self.assertEqual(field.to_json(default_value), test_field['default_value'])
+        assert field.to_json(value) == test_field['value']
+        assert field.to_json(default_value) == test_field['default_value']
 
-        self.assertEqual(options, test_field['options'])
-        self.assertEqual(type, test_field['type'])
+        assert options == test_field['options']
+        assert type == test_field['type']
 
-        self.assertEqual(explicitly_set, test_field['explicitly_set'])
+        assert explicitly_set == test_field['explicitly_set']
 
 
 class TestSerialize(unittest.TestCase):