{"record":{"id":"1c9575371d410ea8","repo":"locustio/locust","slug":"the-following-user-classes-have-the-same-class-nam","errorCode":null,"errorMessage":"The following user classes have the same class name: {}","messagePattern":"The following user classes have the same class name: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"locust/env.py","lineNumber":293,"sourceCode":"        for u in self.user_classes:\n            u.weight = 1\n            user_tasks: list[TaskSet | Callable] = []\n            tasks_frontier = u.tasks\n            while len(tasks_frontier) != 0:\n                t = tasks_frontier.pop()\n                if isinstance(t, TaskHolder):\n                    tasks_frontier.extend(t.tasks)\n                elif callable(t):\n                    if t not in user_tasks:\n                        user_tasks.append(t)\n                else:\n                    raise ValueError(\"Unrecognized task type in user\")\n            u.tasks = user_tasks\n\n    def _validate_user_class_name_uniqueness(self):\n        # Validate there's no class with the same name but in different modules\n        if len({user_class.__name__ for user_class in self.user_classes}) != len(self.user_classes):\n            raise ValueError(\n                \"The following user classes have the same class name: {}\".format(\n                    \", \".join(map(methodcaller(\"fullname\"), self.user_classes))\n                )\n            )\n\n    def _validate_shape_class_instance(self):\n        if self.shape_class is not None and not isinstance(self.shape_class, LoadTestShape):\n            raise ValueError(\n                f\"shape_class should be instance of LoadTestShape or subclass LoadTestShape, but got: {self.shape_class}\"\n            )\n\n    @property\n    def user_classes_by_name(self) -> dict[str, type[User]]:\n        return {u.__name__: u for u in self.user_classes}\n","sourceCodeStart":275,"sourceCodeEnd":308,"githubUrl":"https://github.com/locustio/locust/blob/f391a716e12c2c712e80b5835e877b7933397453/locust/env.py#L275-L308","documentation":"Two user classes in different modules may share the same class name, making `user_classes_by_name` lookups ambiguous. `_validate_user_class_name_uniqueness` compares the set of names against the list and raises ValueError listing the offending full names (module.ClassName).","triggerScenarios":"Passing two different classes named e.g. `WebsiteUser` (imported from different modules) into the same Environment or locust run.","commonSituations":"Importing a locustfile's user class into another locustfile and running both; test suites combining fixture user classes with identical names; monorepos with per-service user classes named generically like `User`.","solutions":["Rename one of the conflicting classes so names are unique","If duplicates come from imports, import only one version and remove the other from the user_classes list","Use distinct, descriptive class names per locustfile"],"exampleFix":"// before\n# module_a.py: class User(User): ...\n# module_b.py: class User(User): ...\nenv = Environment(user_classes=[a.User, b.User])\n// after\n# module_b.py: class ModuleBUser(User): ...\nenv = Environment(user_classes=[a.User, b.ModuleBUser])","handlingStrategy":"validation","validationCode":"names = [c.__name__ for c in user_classes]\nassert len(names) == len(set(names)), f\"duplicate user class names: {names}\"","typeGuard":null,"tryCatchPattern":"try:\n    env = Environment(user_classes=user_classes)\nexcept ValueError as e:\n    if \"same class name\" in str(e):\n        print(e)  # lists offending fullnames; rename one class\n    raise","preventionTips":["Give user classes unique, descriptive names across locustfiles","Don't import the same-named user classes from two modules into one run","Check duplicates before building Environment"],"tags":["users","naming","validation"],"backgroundTag":"duplicate-class-name","analyzedSha":"f391a716e12c2c712e80b5835e877b7933397453","analyzedAt":"2026-08-29T00:36:13.872Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}