From 5566b81324d1f1921c2f4fed17b7d3bb64a8e52c Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Fri, 25 May 2018 14:37:51 -0300 Subject: [PATCH] starting a python bdd presentation --- _images/bdd-behave.png | Bin 0 -> 30898 bytes _images/bdd-robot.png | Bin 0 -> 5636 bytes _images/bdd.jpg | Bin 0 -> 5261 bytes .../unclephil-flinkpipelinereal.dot | 0 .../{ => mr-banks}/unclephil-steps-drawio.xml | 0 _sources/python-bdd/mainsource.py | 100 +++++++ _sources/python-bdd/users.json | 1 + python-bdd.html | 282 ++++++++++++++++++ 8 files changed, 383 insertions(+) create mode 100644 _images/bdd-behave.png create mode 100644 _images/bdd-robot.png create mode 100644 _images/bdd.jpg rename _sources/{ => mr-banks}/unclephil-flinkpipelinereal.dot (100%) rename _sources/{ => mr-banks}/unclephil-steps-drawio.xml (100%) create mode 100644 _sources/python-bdd/mainsource.py create mode 100644 _sources/python-bdd/users.json create mode 100644 python-bdd.html diff --git a/_images/bdd-behave.png b/_images/bdd-behave.png new file mode 100644 index 0000000000000000000000000000000000000000..2becbdc638e12e35dc90678b91fb016d3a533471 GIT binary patch literal 30898 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 literal 0 HcmV?d00001 diff --git a/_images/bdd-robot.png b/_images/bdd-robot.png new file mode 100644 index 0000000000000000000000000000000000000000..897f8341dd3fff052f0ecc8047c20e7800354b7e GIT binary patch literal 5636 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 literal 0 HcmV?d00001 diff --git a/_images/bdd.jpg b/_images/bdd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82601ccb088d36fe3f942d056035fb3abeb922f7 GIT binary patch literal 5261 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 literal 0 HcmV?d00001 diff --git a/_sources/unclephil-flinkpipelinereal.dot b/_sources/mr-banks/unclephil-flinkpipelinereal.dot similarity index 100% rename from _sources/unclephil-flinkpipelinereal.dot rename to _sources/mr-banks/unclephil-flinkpipelinereal.dot diff --git a/_sources/unclephil-steps-drawio.xml b/_sources/mr-banks/unclephil-steps-drawio.xml similarity index 100% rename from _sources/unclephil-steps-drawio.xml rename to _sources/mr-banks/unclephil-steps-drawio.xml diff --git a/_sources/python-bdd/mainsource.py b/_sources/python-bdd/mainsource.py new file mode 100644 index 0000000..0e6b257 --- /dev/null +++ b/_sources/python-bdd/mainsource.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +"""This is a sample code that simulates a user being created.""" + +from __future__ import print_function + +import argparse +import json + +from collections import Counter +from unicodedata import category + +LOWERCASE_CHARS = "Ll" +UPCASE_CHARS = "Lu" +NUMBERS = "Nd" + + +class UserCreationError(Exception): + """Base class for all exceptions in this module.""" + pass + + +class PasswordIsNotStrongEnough(UserCreationError): + """The password used is not strong enough.""" + pass + + +class UserAlreadyExists(UserCreationError): + """The user already exists in the database.""" + pass + + +def password_is_strong(password): + """Check if the password have enough strength.""" + number_of = Counter(category(ch) for ch in password) + return (number_of[LOWERCASE_CHARS] >= 1 and + number_of[UPCASE_CHARS] >= 2 and + number_of[NUMBERS] >= 1 and + len(password) >= 12) + + +def get_users(): + """Retrieve the list of users in the system.""" + data = {} + try: + with open('users.json') as origin: + data = json.load(origin) + except IOError: + # File does not exist, so we just assume it's empty + pass + return data + + +def save_users(user_list): + """Save the user list back to the 'database'.""" + with open('users.json', 'w') as target: + json.dump(user_list, target) + return + + +def create_user(user, password): + """'Create' and user.""" + if not password_is_strong(password.decode('utf-8')): + raise PasswordIsNotStrongEnough + + users = get_users() + if user in users: + raise UserAlreadyExists + + users[user] = password + save_users(users) + return + + +def main(): + """Expose the functions back in command line options.""" + parser = argparse.ArgumentParser() + parser.add_argument('-u', '--user', + dest='user', + help='Username to be created', + required=True) + parser.add_argument('-p', '--password', + dest='password', + help='Password for the user', + required=True) + args = parser.parse_args() + try: + create_user(args.user, args.password) + except PasswordIsNotStrongEnough: + print("That password is not strong enough") + except UserAlreadyExists: + print("Username already used") + else: + print("User created") + return + + +if __name__ == "__main__": + main() diff --git a/_sources/python-bdd/users.json b/_sources/python-bdd/users.json new file mode 100644 index 0000000..42098a2 --- /dev/null +++ b/_sources/python-bdd/users.json @@ -0,0 +1 @@ +{"test": "Test123Test123"} \ No newline at end of file diff --git a/python-bdd.html b/python-bdd.html new file mode 100644 index 0000000..e99fbe4 --- /dev/null +++ b/python-bdd.html @@ -0,0 +1,282 @@ + + + + + + BDD em Python + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

+ BDD em Python +

+
+
+ +
+
+ Me + +
+ +
+
+
+ +
+
+ + +
+
+ +
+
+

Gherkin

+ +

+ Given Definição do ambiente
+ When O teste
+ Then Validação do teste
+

+ + +
+
+ +
+
+

Código sendo testado

+ +

+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+
+"""This is a sample code that simulates a user being created."""
+
+from __future__ import print_function
+
+import argparse
+import json
+
+from collections import Counter
+from unicodedata import category
+
+LOWERCASE_CHARS = "Ll"
+UPCASE_CHARS = "Lu"
+NUMBERS = "Nd"
+
+
+class UserCreationError(Exception):
+    """Base class for all exceptions in this module."""
+    pass
+
+
+class PasswordIsNotStrongEnough(UserCreationError):
+    """The password used is not strong enough."""
+    pass
+
+
+class UserAlreadyExists(UserCreationError):
+    """The user already exists in the database."""
+    pass
+
+
+def password_is_strong(password):
+    """Check if the password have enough strength."""
+    number_of = Counter(category(ch) for ch in password)
+    return (number_of[LOWERCASE_CHARS] >= 1 and
+            number_of[UPCASE_CHARS] >= 2 and
+            number_of[NUMBERS] >= 1 and
+            len(password) >= 12)
+
+
+def get_users():
+    """Retrieve the list of users in the system."""
+    data = {}
+    try:
+        with open('users.json') as origin:
+            data = json.load(origin)
+    except IOError:
+        # File does not exist, so we just assume it's empty
+        pass
+    return data
+
+
+def save_users(user_list):
+    """Save the user list back to the 'database'."""
+    with open('users.json', 'w') as target:
+        json.dump(user_list, target)
+    return
+
+
+def create_user(user, password):
+    """'Create' and user."""
+    if not password_is_strong(password.decode('utf-8')):
+        raise PasswordIsNotStrongEnough
+
+    users = get_users()
+    if user in users:
+        raise UserAlreadyExists
+
+    users[user] = password
+    save_users(users)
+    return
+
+
+def main():
+    """Expose the functions back in command line options."""
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-u', '--user',
+                        dest='user',
+                        help='Username to be created',
+                        required=True)
+    parser.add_argument('-p', '--password',
+                        dest='password',
+                        help='Password for the user',
+                        required=True)
+    args = parser.parse_args()
+    try:
+        create_user(args.user, args.password)
+    except PasswordIsNotStrongEnough:
+        print("That password is not strong enough")
+    except UserAlreadyExists:
+        print("Username already used")
+    else:
+        print("User created")
+    return
+
+
+if __name__ == "__main__":
+    main()
+						
+
+
+ +
+
+

Robot Framework

+
+
+ +
+
+

Behave

+
+
+ +
+
+

Perguntas?

+
+
+
+
+ + + + + + + +