diff --git a/.gitignore b/.gitignore index bea00c4..32560a1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ __pycache__/ *.pyc +# Pytest +.pytest_cache/ + # Distribution / packaging dist/ build/ diff --git a/__pycache__/test_hello.cpython-313.pyc b/__pycache__/test_hello.cpython-313.pyc deleted file mode 100644 index c8ca965..0000000 Binary files a/__pycache__/test_hello.cpython-313.pyc and /dev/null differ diff --git a/test_hello.py b/test_hello.py deleted file mode 100644 index 9af6592..0000000 --- a/test_hello.py +++ /dev/null @@ -1,30 +0,0 @@ -import subprocess -import unittest -from pathlib import Path - - -class TestHello(unittest.TestCase): - def test_hello_output(self): - """Test that hello.py prints 'Hello, World!' to stdout.""" - result = subprocess.run( - ["python3", "hello.py"], - capture_output=True, - text=True, - cwd=Path(__file__).parent - ) - self.assertEqual(result.returncode, 0) - self.assertIn("Hello, World!", result.stdout) - - def test_hello_no_stderr(self): - """Test that hello.py produces no stderr output.""" - result = subprocess.run( - ["python3", "hello.py"], - capture_output=True, - text=True, - cwd=Path(__file__).parent - ) - self.assertEqual(result.stderr, "") - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_hello.py b/tests/test_hello.py index 3e33f0e..f47ee8c 100644 --- a/tests/test_hello.py +++ b/tests/test_hello.py @@ -1,94 +1,69 @@ -"""Unit tests for hello.py module.""" +"""Tests for hello.py module using pytest.""" import subprocess -import unittest from pathlib import Path +# Module-level constants to avoid duplication across test functions +HELLO_SCRIPT = Path(__file__).parent.parent / "hello.py" +WORKING_DIR = Path(__file__).parent.parent -class TestHelloOutput(unittest.TestCase): + +def run_hello(): + """Run hello.py and return the subprocess result.""" + return subprocess.run( + ["python3", str(HELLO_SCRIPT)], + capture_output=True, + text=True, + cwd=WORKING_DIR, + ) + + +class TestHelloOutput: """Tests for hello.py output behavior.""" - def setUp(self): - """Set up test fixtures.""" - self.hello_script = Path(__file__).parent.parent / "hello.py" - self.working_dir = Path(__file__).parent.parent - def test_hello_prints_expected_message(self): """Test that hello.py prints 'Hello, World!' to stdout.""" - result = subprocess.run( - ["python3", str(self.hello_script)], - capture_output=True, - text=True, - cwd=self.working_dir - ) - self.assertIn("Hello, World!", result.stdout) + result = run_hello() + assert "Hello, World!" in result.stdout def test_hello_exact_output(self): """Test that hello.py output matches exactly (with newline).""" - result = subprocess.run( - ["python3", str(self.hello_script)], - capture_output=True, - text=True, - cwd=self.working_dir - ) - self.assertEqual(result.stdout.strip(), "Hello, World!") + result = run_hello() + assert result.stdout.strip() == "Hello, World!" def test_hello_exit_code_zero(self): """Test that hello.py exits with code 0.""" - result = subprocess.run( - ["python3", str(self.hello_script)], - capture_output=True, - text=True, - cwd=self.working_dir - ) - self.assertEqual(result.returncode, 0) + result = run_hello() + assert result.returncode == 0 def test_hello_no_stderr(self): """Test that hello.py produces no stderr output.""" - result = subprocess.run( - ["python3", str(self.hello_script)], - capture_output=True, - text=True, - cwd=self.working_dir - ) - self.assertEqual(result.stderr, "") + result = run_hello() + assert result.stderr == "" def test_hello_stdout_not_empty(self): """Test that hello.py produces non-empty stdout.""" - result = subprocess.run( - ["python3", str(self.hello_script)], - capture_output=True, - text=True, - cwd=self.working_dir - ) - self.assertTrue(len(result.stdout) > 0) + result = run_hello() + assert len(result.stdout) > 0 -class TestHelloFileExists(unittest.TestCase): +class TestHelloFile: """Tests for hello.py file existence and content.""" - def setUp(self): - """Set up test fixtures.""" - self.hello_script = Path(__file__).parent.parent / "hello.py" - def test_hello_file_exists(self): """Test that hello.py file exists.""" - self.assertTrue(self.hello_script.exists()) + assert HELLO_SCRIPT.exists() def test_hello_file_is_python(self): """Test that hello.py has .py extension.""" - self.assertEqual(self.hello_script.suffix, ".py") + assert HELLO_SCRIPT.suffix == ".py" def test_hello_file_contains_print(self): """Test that hello.py contains a print statement.""" - content = self.hello_script.read_text() - self.assertIn("print", content) + content = HELLO_SCRIPT.read_text() + assert "print" in content def test_hello_file_contains_hello_world(self): """Test that hello.py contains 'Hello, World!' string.""" - content = self.hello_script.read_text() - self.assertIn("Hello, World!", content) - - -if __name__ == "__main__": - unittest.main() + content = HELLO_SCRIPT.read_text() + assert "Hello, World!" in content