Repository: aws-ia/taskcat
Issue: Parameters replace fail when empty dict is passwd 

**Sample config file**

```
project:
  name: cfn-project
tests:
  mytest:
    template: templates/lab1.template.yaml
    regions:
    - us-east-1
     parameters: {}
```

```
[ERROR  ] : TypeError expected string or bytes-like object
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/taskcat/_cli.py", line 70, in main
    cli.run()
  File "/usr/local/lib/python3.7/site-packages/taskcat/_cli_core.py", line 228, in run
    return getattr(command(), subcommand)(**args)
  File "/usr/local/lib/python3.7/site-packages/taskcat/_cli_modules/test.py", line 75, in run
    parameters = config.get_rendered_parameters(buckets, regions, templates)
  File "/usr/local/lib/python3.7/site-packages/taskcat/_config.py", line 295, in get_rendered_parameters
    region_params, s3bucket.name, region.name, region.client
  File "/usr/local/lib/python3.7/site-packages/taskcat/_template_params.py", line 49, in __init__
    self.transform_parameter()
  File "/usr/local/lib/python3.7/site-packages/taskcat/_template_params.py", line 64, in transform_parameter
    self._regex_replace_param_value(self.RE_GENNUMB, self._gen_rand_num(20))
  File "/usr/local/lib/python3.7/site-packages/taskcat/_template_params.py", line 336, in _regex_replace_param_value
    if self.regxfind(regex_pattern, self.param_value):
  File "/usr/local/lib/python3.7/site-packages/taskcat/_common_utils.py", line 76, in regxfind
    security_group = re_object.search(data_line)
TypeError: expected string or bytes-like object
```



**To Reproduce**
Create a project with lambda source that does not require any inputs

Sample template:

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  S3BucketName:
    AllowedPattern: '^[0-9a-zA-Z]+([0-9a-zA-Z-]*[0-9a-zA-Z])*$'
    ConstraintDescription: >-
      Quick Start bucket name can include numbers, lowercase letters, uppercase
      letters, and hyphens (-). It cannot start or end with a hyphen (-).
    Description: >-
      S3 bucket name for the Quick Start assets. Quick Start bucket name can
      include numbers, lowercase letters, uppercase letters, and hyphens (-). It
      cannot start or end with a hyphen (-).
    Type: String
  S3KeyPrefix:
    AllowedPattern: '^[0-9a-zA-Z-/]*$'
    ConstraintDescription: >-
      Can include numbers, lowercase letters, uppercase letters, hyphens (-), and forward slash (/).
    Default: 'cfn-project'
    Description: >-
      S3 key prefix where assets are located should end withforward slash (/).
    Type: String
Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - lambda.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
      Policies:
      - PolicyName: root
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Action:
            - logs:*
            Resource: arn:aws:logs:*:*:*
  GenRandomLambda:
    Type: AWS::Lambda::Function
    Properties:
      Description: Lambda creates simple random string
      Handler: lambda_function.handler
      Runtime: python3.7
      Role: !GetAtt 'LambdaExecutionRole.Arn'
      Timeout: 300
      Code:
        S3Bucket: !Ref 'S3BucketName'
        S3Key: !Sub '${S3KeyPrefix}lambda_functions/zips/GenRandom/lambda.zip'
```



Changed files:
taskcat/_template_params.py, tests/test_template_params.py

diff --git a/taskcat/_template_params.py b/taskcat/_template_params.py
index c091cd6..8771b69 100644
--- a/taskcat/_template_params.py
+++ b/taskcat/_template_params.py
@@ -35,6 +35,18 @@ class ParamGen:
     def __init__(self, param_dict, bucket_name, region, boto_client, az_excludes=None):
         self.regxfind = CommonTools.regxfind
         self._param_dict = param_dict
+        _missing_params = []
+        for param_name, param_value in param_dict.items():
+            if param_value is None:
+                _missing_params.append(param_name)
+        if _missing_params:
+            raise TaskCatException(
+                (
+                    f"The following parameters have no value whatsoever. "
+                    f"The CloudFormation stack will fail to launch. "
+                    f"Please address. str({_missing_params})"
+                )
+            )
         self.results = {}
         self.mutated_params = {}
         self.param_name = None
diff --git a/tests/test_template_params.py b/tests/test_template_params.py
index 4b477d4..4856231 100644
--- a/tests/test_template_params.py
+++ b/tests/test_template_params.py
@@ -1,3 +1,4 @@
+import copy
 import logging
 import re
 import unittest
@@ -375,6 +376,12 @@ class TestParamGen(unittest.TestCase):
         }
         self.assertEqual(all_expressions, tested_expressions)
 
+    def test_param_value_none_raises_exception(self):
+        params = copy.deepcopy(self.class_kwargs)
+        params["param_dict"] = {"Foo": None}
+        with self.assertRaises(TaskCatException):
+            _ = ParamGen(**params)
+
     def test_regex_replace_param_value(self):
         pg = ParamGen(**self.class_kwargs)
         pg.param_name = "test_param"