diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-15 07:22:06 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-15 07:22:06 +0000 |
commit | 40398a2c1b58fb8ffe45eb5e14c4d4295a40c42f (patch) | |
tree | 821fd2d8bfb25dfbe03df27239c053c11b8069fd | |
parent | 67795e233e2727b182943ca98bd9ecc5ae686921 (diff) |
automatic import of python-auger-python
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-auger-python.spec | 660 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 662 insertions, 0 deletions
@@ -0,0 +1 @@ +/auger-python-0.1.35.tar.gz diff --git a/python-auger-python.spec b/python-auger-python.spec new file mode 100644 index 0000000..6d46822 --- /dev/null +++ b/python-auger-python.spec @@ -0,0 +1,660 @@ +%global _empty_manifest_terminate_build 0 +Name: python-auger-python +Version: 0.1.35 +Release: 1 +Summary: Automatically generate unit tests for Python code +License: MIT License +URL: https://github.com/laffra/auger +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/98/87/78f6f72fabcc1eaad8a079163513506cd568a52142d696b114681e9b87df/auger-python-0.1.35.tar.gz +BuildArch: noarch + +Requires: python3-funcsigs +Requires: python3-mock +Requires: python3-six + +%description +# Auger +Auger is a project to automatically generate unit tests for Python code. + +See +[these slides](http://goo.gl/PuZsgX) +or +[this blog](http://chrislaffra.blogspot.com/2016/12/auger-automatic-unit-test-generation.html) +entry for more information. + +# Installation + +Install auger with: + + pip install auger-python + +# Running Auger + +To generate a unit test for any class or module, for Python 2 or 3, do this: + + import auger + + with auger.magic([ <any list of modules or classes> ]): + <any code that exercises your application> + +# A Simple Example + +Here is a simple example that does not rely on Auger at all: + + class Foo: # Declare a class with a method + def bar(self, x): + return 2 * x . # Duplicate x and return it + + def main(): + foo = Foo() # Create an instance of Foo + print(foo.bar(32)) # Call the bar method and print the result + + main() + +Inside the `main` function we call the `bar` method and it will print 64. + +# Running Auger on our Simple Example + +To generate a unit test for this class, we run the code again, but this time in the context of Auger: + + import auger + + with auger.magic([Foo]): + main() + +This will print out the following: + + 64 + Auger: generated test: tests/test_Foo.py + +The test that is generated looks like this, with some imports and test for main removed: + + import unittest + + class FooTest(unittest.TestCase): + def test_bar(self): + foo_instance = Foo() + self.assertEquals( + foo_instance.bar(x=32), + 64 + ) + + if __name__ == "__main__": + unittest.main() + +# Running Auger in verbose mode + +Rather than emit tests in the file system, Auger can also print out the test to the console, +by using the `verbose` parameter: + + import auger + + with auger.magic([Foo], verbose=True): + main() + +In that case, Auger will not generate any tests, but just print them out. + +# A larger example + +Consider the following example, `pet.py`, included in the `sample` folder, that lets us create a `Pet` with a name and a species: + + from animal import Animal + + class Pet(Animal): + def __init__(self, name, species): + Animal.__init__(self, species) + self.name = name + + def getName(self): + return self.name + + def __str__(self): + return "%s is a %s" % (self.getName(), self.getSpecies()) + + def createPet(name, species): + return Pet(name, species) + +A `Pet` is really a special kind of `Animal`, with a name, which is defined in `animal.py`: + + class Animal(object): + def __init__(self, species): + self.species = species + + def getSpecies(self): + return self.species + +With those two definitions, we can create a `Pet` instance and print out some details: + + import animal + import pet + + def main(): + p = pet.createPet("Polly", "Parrot") + print(p, p.getName(), p.getSpecies()) + + main() + +This produces: + + Polly is a Parrot Polly Parrot + +# Calling Auger on our larger example + +With Auger, we can record all calls to all functions and methods defined in `pet.py`, +while also remembering the details for all calls going out from `pet.py` to other modules, +so they can be mocked out. + +Instead of saying: + + if __name__ == "__main__": + main() + +We would say: + + import auger + + if __name__ == "__main__": + with auger.magic([pet]): # this is the new line and invokes Auger + main() + +This produces the following automatically generated unit test for `pet.py`: + + from mock import patch + from sample.animal import Animal + import sample.pet + from sample.pet import Pet + import unittest + + + class PetTest(unittest.TestCase): + @patch.object(Animal, 'get_species') + @patch.object(Animal, 'get_age') + def test___str__(self, mock_get_age, mock_get_species): + mock_get_age.return_value = 12 + mock_get_species.return_value = 'Dog' + pet_instance = Pet('Clifford', 'Dog', 12) + self.assertEquals(pet_instance.__str__(), 'Clifford is a dog aged 12') + + def test_create_pet(self): + self.assertIsInstance(sample.pet.create_pet(age=12,species='Dog',name='Clifford'), Pet) + + def test_get_name(self): + pet_instance = Pet('Clifford', 'Dog', 12) + self.assertEquals(pet_instance.get_name(), 'Clifford') + + def test_lower(self): + self.assertEquals(Pet.lower(s='Dog'), 'dog') + + if __name__ == "__main__": + unittest.main() + +Note that auger detects object creation, method invocation, and static methods. It automatically +generate mocks for `Animal`. The mock for `get_species` returns 'Dog' and `get_age` returns 12. +Namely, those were the values Auger recorded when we ran our sample code the last time. + +# Benefits of Auger + +By automatically generating unit tests, we dramatically cut down the cost of software +development. The tests themselves are intended to help developers get going on their unit testing +and lower the learning curve for how to write tests. + +# Known limitations of Auger + +Auger does not do try to substitue parameters with synthetic values such as `-1`, `None`, or `[]`. +Auger also does not act well when code uses exceptions. Auger also does not like methods that have a decorator. + +Auger only records a given execution run and saves the run as a test. Auger does not know if the code actually +works as intended. If the code contains a bug, Auger will simply record the buggy behavior. There is no free +lunch here. It is up to the developer to verify the code actually works. + + + + +%package -n python3-auger-python +Summary: Automatically generate unit tests for Python code +Provides: python-auger-python +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-auger-python +# Auger +Auger is a project to automatically generate unit tests for Python code. + +See +[these slides](http://goo.gl/PuZsgX) +or +[this blog](http://chrislaffra.blogspot.com/2016/12/auger-automatic-unit-test-generation.html) +entry for more information. + +# Installation + +Install auger with: + + pip install auger-python + +# Running Auger + +To generate a unit test for any class or module, for Python 2 or 3, do this: + + import auger + + with auger.magic([ <any list of modules or classes> ]): + <any code that exercises your application> + +# A Simple Example + +Here is a simple example that does not rely on Auger at all: + + class Foo: # Declare a class with a method + def bar(self, x): + return 2 * x . # Duplicate x and return it + + def main(): + foo = Foo() # Create an instance of Foo + print(foo.bar(32)) # Call the bar method and print the result + + main() + +Inside the `main` function we call the `bar` method and it will print 64. + +# Running Auger on our Simple Example + +To generate a unit test for this class, we run the code again, but this time in the context of Auger: + + import auger + + with auger.magic([Foo]): + main() + +This will print out the following: + + 64 + Auger: generated test: tests/test_Foo.py + +The test that is generated looks like this, with some imports and test for main removed: + + import unittest + + class FooTest(unittest.TestCase): + def test_bar(self): + foo_instance = Foo() + self.assertEquals( + foo_instance.bar(x=32), + 64 + ) + + if __name__ == "__main__": + unittest.main() + +# Running Auger in verbose mode + +Rather than emit tests in the file system, Auger can also print out the test to the console, +by using the `verbose` parameter: + + import auger + + with auger.magic([Foo], verbose=True): + main() + +In that case, Auger will not generate any tests, but just print them out. + +# A larger example + +Consider the following example, `pet.py`, included in the `sample` folder, that lets us create a `Pet` with a name and a species: + + from animal import Animal + + class Pet(Animal): + def __init__(self, name, species): + Animal.__init__(self, species) + self.name = name + + def getName(self): + return self.name + + def __str__(self): + return "%s is a %s" % (self.getName(), self.getSpecies()) + + def createPet(name, species): + return Pet(name, species) + +A `Pet` is really a special kind of `Animal`, with a name, which is defined in `animal.py`: + + class Animal(object): + def __init__(self, species): + self.species = species + + def getSpecies(self): + return self.species + +With those two definitions, we can create a `Pet` instance and print out some details: + + import animal + import pet + + def main(): + p = pet.createPet("Polly", "Parrot") + print(p, p.getName(), p.getSpecies()) + + main() + +This produces: + + Polly is a Parrot Polly Parrot + +# Calling Auger on our larger example + +With Auger, we can record all calls to all functions and methods defined in `pet.py`, +while also remembering the details for all calls going out from `pet.py` to other modules, +so they can be mocked out. + +Instead of saying: + + if __name__ == "__main__": + main() + +We would say: + + import auger + + if __name__ == "__main__": + with auger.magic([pet]): # this is the new line and invokes Auger + main() + +This produces the following automatically generated unit test for `pet.py`: + + from mock import patch + from sample.animal import Animal + import sample.pet + from sample.pet import Pet + import unittest + + + class PetTest(unittest.TestCase): + @patch.object(Animal, 'get_species') + @patch.object(Animal, 'get_age') + def test___str__(self, mock_get_age, mock_get_species): + mock_get_age.return_value = 12 + mock_get_species.return_value = 'Dog' + pet_instance = Pet('Clifford', 'Dog', 12) + self.assertEquals(pet_instance.__str__(), 'Clifford is a dog aged 12') + + def test_create_pet(self): + self.assertIsInstance(sample.pet.create_pet(age=12,species='Dog',name='Clifford'), Pet) + + def test_get_name(self): + pet_instance = Pet('Clifford', 'Dog', 12) + self.assertEquals(pet_instance.get_name(), 'Clifford') + + def test_lower(self): + self.assertEquals(Pet.lower(s='Dog'), 'dog') + + if __name__ == "__main__": + unittest.main() + +Note that auger detects object creation, method invocation, and static methods. It automatically +generate mocks for `Animal`. The mock for `get_species` returns 'Dog' and `get_age` returns 12. +Namely, those were the values Auger recorded when we ran our sample code the last time. + +# Benefits of Auger + +By automatically generating unit tests, we dramatically cut down the cost of software +development. The tests themselves are intended to help developers get going on their unit testing +and lower the learning curve for how to write tests. + +# Known limitations of Auger + +Auger does not do try to substitue parameters with synthetic values such as `-1`, `None`, or `[]`. +Auger also does not act well when code uses exceptions. Auger also does not like methods that have a decorator. + +Auger only records a given execution run and saves the run as a test. Auger does not know if the code actually +works as intended. If the code contains a bug, Auger will simply record the buggy behavior. There is no free +lunch here. It is up to the developer to verify the code actually works. + + + + +%package help +Summary: Development documents and examples for auger-python +Provides: python3-auger-python-doc +%description help +# Auger +Auger is a project to automatically generate unit tests for Python code. + +See +[these slides](http://goo.gl/PuZsgX) +or +[this blog](http://chrislaffra.blogspot.com/2016/12/auger-automatic-unit-test-generation.html) +entry for more information. + +# Installation + +Install auger with: + + pip install auger-python + +# Running Auger + +To generate a unit test for any class or module, for Python 2 or 3, do this: + + import auger + + with auger.magic([ <any list of modules or classes> ]): + <any code that exercises your application> + +# A Simple Example + +Here is a simple example that does not rely on Auger at all: + + class Foo: # Declare a class with a method + def bar(self, x): + return 2 * x . # Duplicate x and return it + + def main(): + foo = Foo() # Create an instance of Foo + print(foo.bar(32)) # Call the bar method and print the result + + main() + +Inside the `main` function we call the `bar` method and it will print 64. + +# Running Auger on our Simple Example + +To generate a unit test for this class, we run the code again, but this time in the context of Auger: + + import auger + + with auger.magic([Foo]): + main() + +This will print out the following: + + 64 + Auger: generated test: tests/test_Foo.py + +The test that is generated looks like this, with some imports and test for main removed: + + import unittest + + class FooTest(unittest.TestCase): + def test_bar(self): + foo_instance = Foo() + self.assertEquals( + foo_instance.bar(x=32), + 64 + ) + + if __name__ == "__main__": + unittest.main() + +# Running Auger in verbose mode + +Rather than emit tests in the file system, Auger can also print out the test to the console, +by using the `verbose` parameter: + + import auger + + with auger.magic([Foo], verbose=True): + main() + +In that case, Auger will not generate any tests, but just print them out. + +# A larger example + +Consider the following example, `pet.py`, included in the `sample` folder, that lets us create a `Pet` with a name and a species: + + from animal import Animal + + class Pet(Animal): + def __init__(self, name, species): + Animal.__init__(self, species) + self.name = name + + def getName(self): + return self.name + + def __str__(self): + return "%s is a %s" % (self.getName(), self.getSpecies()) + + def createPet(name, species): + return Pet(name, species) + +A `Pet` is really a special kind of `Animal`, with a name, which is defined in `animal.py`: + + class Animal(object): + def __init__(self, species): + self.species = species + + def getSpecies(self): + return self.species + +With those two definitions, we can create a `Pet` instance and print out some details: + + import animal + import pet + + def main(): + p = pet.createPet("Polly", "Parrot") + print(p, p.getName(), p.getSpecies()) + + main() + +This produces: + + Polly is a Parrot Polly Parrot + +# Calling Auger on our larger example + +With Auger, we can record all calls to all functions and methods defined in `pet.py`, +while also remembering the details for all calls going out from `pet.py` to other modules, +so they can be mocked out. + +Instead of saying: + + if __name__ == "__main__": + main() + +We would say: + + import auger + + if __name__ == "__main__": + with auger.magic([pet]): # this is the new line and invokes Auger + main() + +This produces the following automatically generated unit test for `pet.py`: + + from mock import patch + from sample.animal import Animal + import sample.pet + from sample.pet import Pet + import unittest + + + class PetTest(unittest.TestCase): + @patch.object(Animal, 'get_species') + @patch.object(Animal, 'get_age') + def test___str__(self, mock_get_age, mock_get_species): + mock_get_age.return_value = 12 + mock_get_species.return_value = 'Dog' + pet_instance = Pet('Clifford', 'Dog', 12) + self.assertEquals(pet_instance.__str__(), 'Clifford is a dog aged 12') + + def test_create_pet(self): + self.assertIsInstance(sample.pet.create_pet(age=12,species='Dog',name='Clifford'), Pet) + + def test_get_name(self): + pet_instance = Pet('Clifford', 'Dog', 12) + self.assertEquals(pet_instance.get_name(), 'Clifford') + + def test_lower(self): + self.assertEquals(Pet.lower(s='Dog'), 'dog') + + if __name__ == "__main__": + unittest.main() + +Note that auger detects object creation, method invocation, and static methods. It automatically +generate mocks for `Animal`. The mock for `get_species` returns 'Dog' and `get_age` returns 12. +Namely, those were the values Auger recorded when we ran our sample code the last time. + +# Benefits of Auger + +By automatically generating unit tests, we dramatically cut down the cost of software +development. The tests themselves are intended to help developers get going on their unit testing +and lower the learning curve for how to write tests. + +# Known limitations of Auger + +Auger does not do try to substitue parameters with synthetic values such as `-1`, `None`, or `[]`. +Auger also does not act well when code uses exceptions. Auger also does not like methods that have a decorator. + +Auger only records a given execution run and saves the run as a test. Auger does not know if the code actually +works as intended. If the code contains a bug, Auger will simply record the buggy behavior. There is no free +lunch here. It is up to the developer to verify the code actually works. + + + + +%prep +%autosetup -n auger-python-0.1.35 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-auger-python -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Mon May 15 2023 Python_Bot <Python_Bot@openeuler.org> - 0.1.35-1 +- Package Spec generated @@ -0,0 +1 @@ +2b155295da8201f77a1963b97efd4809 auger-python-0.1.35.tar.gz |